What you will take away from this lesson
In 206 - Knowledge: from memory to insights, we covered how memory and the knowledge pipeline persist facts across users and sessions. That power is exactly why governance is the next lesson: once an AI workspace can remember things and write to a shared catalog, the question of who gets to do what stops being paperwork and starts deciding what actually happens.
The point of this lesson is not to cover every security feature in detail. It is to give a power user enough of the model that when a tool is missing from your list, or a call is refused, you know why. Governance in Plexara is not a policy document. It is a runtime check that runs before the tool does.
Learning Objectives
- 01Explain why governance in Plexara is enforced at the point of execution, not documented in a policy and hoped for.
- 02Describe a persona: a named role that determines which tools a caller can see and which connections those tools can reach.
- 03Name the default-deny posture: a persona is what grants access to the portal and to tools, and every tool call passes an authorization check against the resolved persona before it runs.
- 04Read a discovery result knowing that what search, fetch, and list_connections show is scoped by the same connection grants that scope execution, with the count of what was held back stated on the result.
- 05Identify the layered safeguards that stack on top of persona filtering: read-only pinning, bucket-prefix scoping, workflow gating, row limits, timeouts, audience-scoped share links, and sandboxed rendering of stored content.
- 06Use the error contract: a stable code, a category naming whose fault the failure is, a message, and a hint, so an agent can tell a fixable argument from a denied one from an outage.
- 07Understand the single audit log that ties every tool call back to a human user and the persona they acted under, so "who did what" has a real answer.
Where we are in the curriculum
If any term in this lesson feels unfamiliar, the 100 series is one click back. The 200 series assumes that mental model.
100 Series: the foundation
- 101What is a Large Language Model?Brilliant at language, blind about your data. Tokens, hallucination, the grounding problem.
- 102Tokens and your budgetSubscription-plan economics, session limits, and Plexara enrichment dedup.
- 103Context, compression, and memoryThe keep / compress / clear playbook and how memory carries across sessions.
- 104Frontier models, specialized models, and why enterprise AI uses bothThree knowledge sources (training, web search, tools). MCP as the exposure protocol.
- 105What is an AI agent?The think/call-tool/observe loop. Professor's knowledge, child's literalism.
- 110Is MCP just an API wrapper?MCP as an application layer. Spectrum from thin wrapper to full application server.
If a term in this lesson looks unfamiliar, back up to the 100 series. The 200 series assumes that mental model. Every row above is a direct link.
Governance runs at execution time, not at catalog time
Most data governance in the wild ends up as documentation: a wiki page, a policy document, a spreadsheet of who is supposed to have access to what. The documentation is often correct and frequently ignored. Plexara takes a different approach. Every tool call is checked at the moment the agent tries to run it, not when the catalog is assembled. The documentation is the runtime behavior.
Three things have to succeed for a tool call to execute. The caller has to authenticate. Their persona has to be resolved. The resolved persona has to be authorized to call that specific tool against that specific connection. Any of those three failing causes the call to be refused, and the refusal is logged. No persona check, no tool call.
What a persona actually determines
A persona is a named role. The assignment of a persona to a user (or to an API key, for automation) is how Plexara translates identity into capability. The agent never sees raw user identities when deciding whether to call a tool. The agent sees a tool list that has already been filtered through the persona in effect.
Power users often wonder why their agent can call some tools but not others, or why a tool they saw in documentation is missing from the list. The persona is almost always the reason.
What a persona actually determines
Tool visibility
The agent only sees tools the persona is allowed to call. An unauthorized tool is absent from the list, which is the single most effective defense against prompt-injection attacks that try to coax the model into invoking privileged capabilities. The model cannot be persuaded to call a tool it cannot see.
Connection reachability
Tools that accept a connection argument (for example, trino_query against a specific catalog) are scoped so only the connections the persona grants are reachable. Connections are granted the same way tools are, by name and by pattern, and a persona reaches a connection its grant list names. A read-only analyst persona might reach the warehouse catalog and not an administrative connection.
Write vs read
Write operations are typically restricted to administrative personas. Trino connections can be pinned to read-only at the platform layer, so even if an agent somehow attempts a write, the write is refused before reaching the database.
Knowledge pipeline roles
Capture and review of insights (the 206 pipeline) are themselves persona-gated. An analyst can capture insights; a knowledge steward or administrator approves them via apply_knowledge. Separation of duties is enforced at the tool level, not at the honor system.
Personas are configured by administrators. platform_info reports the resolved persona at the start of every session, so the agent and the user can both see which role is in effect.


What you can see is what you can use
A persona names the connections it reaches, and that same list decides what shows up when you go looking. Search a catalog and you get the datasets, connections, and API endpoints your persona can actually reach; the ones behind a connection it does not reach are held back, and the result says how many. A list you can act on end to end is worth more than a complete one you have to guess your way through.
The count is the part that does the work. An agent handed a short result set with no explanation concludes the data does not exist and goes off to re-derive it from something else. A result that says "four more, behind connections your persona does not reach, ask your administrator" produces a different next move: the agent tells you what to ask for instead of quietly building a worse answer.
Discovery is scoped by the same grants as execution
search
Catalog datasets, connections, and API endpoints are returned when they belong to a connection the persona grants. The result carries a withheld count per source and a notice naming the persona and the remedy, so a shorter list reads as "present, and not yours to see" rather than as "does not exist."
fetch
A reference behind a connection the persona does not grant comes back as not found. Discovery and citation agree, so following a pointer lands on the same boundary that produced the list.
list_connections
The enumeration names the granted connections, and reports the count it held back alongside them. An agent choosing a connection is choosing from the set it can actually use.
Portal search
The browser and the agent share one search router, so the inventory a person sees on the portal is the inventory their agent works from. The same notice renders above the results.
This is a metadata boundary: it scopes names, descriptions, and inventory. The data behind them was already scoped at the point of the tool call. What it buys the reader is a list that means something, because everything on it is something the persona can act on.
Grants that can finish what they start
A permission model and a working one are different things. A persona can be internally consistent, pass every check, and still leave someone holding half a capability: allowed to find an answer and not to read it. Plexara looks for that shape directly and reports it with the fix attached.
Default-deny posture
It is tempting to build access control around a permissive default: "if nothing else applies, allow read-only." Plexara goes the other way, treating least privilege as the starting point.
Layered safeguards on top of persona filtering
Persona filtering is the first layer. Several other layers stack on top of it to narrow what any given tool call can actually do, even when the persona is authorized to call the tool at all. These are runtime caps, not optional suggestions.
Safeguards that stack on top of persona filtering
Trino read-only pinning
Individual Trino connections can be pinned to read-only mode at the platform layer. Write statements against a pinned connection are refused before they reach the database, regardless of what the agent intended or what the user asked for. Even a misconfigured downstream system cannot be written to through a read-only pinned connection.
S3 bucket-prefix scoping
S3 access can be restricted to specific buckets or bucket prefixes. An agent with S3 access cannot browse outside the configured prefixes, which means credentials that are accidentally over-permissioned at the AWS level are still safe at the Plexara layer.
Workflow gating
The session gate that requires platform_info as the first call (covered in 202) is a workflow gate. Plexara can enforce similar orderings elsewhere: discovery tools before query tools, insight review before knowledge application, and so on. A misordered call is refused with a structured error that names the missing prerequisite.
Row limits and timeouts
Query tools carry default and maximum row limits and per-connection timeouts. These are not advisory suggestions; they are platform-level caps. A runaway query is bounded by the smaller of the persona's limit and the connection's limit, so the blast radius of any single call is finite.
Audience-scoped share links
Every share link carries the audience it was made for: the named recipient, any signed-in platform user, or anyone with the link. A share addressed to a person opens for that person; a share addressed to nobody opens for your signed-in users. The wide-open option is one you pick on purpose, and the share dialog says which audience you are choosing before you send. Every route the link reaches runs the same check, and a link that has expired or been revoked stops opening. Responses behind that check stay in the browser they were served to instead of a shared cache.
Sandboxed rendering of stored content
Uploaded and shared files render in isolation. A spreadsheet, a PDF, or an HTML report opens and displays as itself, and nothing inside it can act on the platform or on the session viewing it. This holds for every stored file the platform serves, so accepting a document from a colleague or a client is a document decision rather than a security one.
Two gates on a catalog write
The catalog is the one place in the portal where ordinary use includes writing: a table gets a better description, a tag gets defined, a glossary term gets retired. Those edits go through the same tools an agent would call, so they get the same treatment. Two things have to be true, and both are checked on the server no matter what the interface shows.
Two gates on every catalog write
The persona grants the tool
Creating a tag, editing a description, or retiring a glossary term is the datahub_create, datahub_update, or datahub_delete tool doing the work, whether the request came from an agent or from someone clicking in the portal. The persona has to grant that tool by name.
The connection accepts writes
The specific DataHub connection being written to has to be configured as write-enabled. A connection set to read-only serves the same catalog for reading and declines the write, so a persona with full tool grants still cannot change a catalog that is meant to be read.
Both checks run on the server, whatever the interface rendered. When either gate is closed, the portal shows the same catalog with the editing controls absent, so the screen and the rule agree. Every write that does go through is recorded in the audit log with the person and the persona behind it.
Arguments are checked against the schema, not accepted on faith
The safeguards above bound what a tool call can reach. This one bounds what a tool call can claim to have done. It is worth its own section because the failure it prevents is the kind nobody catches by reading the output.
The error contract: an agent that knows the difference
Governance is only half useful if a refusal is indistinguishable from an outage. An agent that reads "request failed" has three plausible responses and no way to pick: retry the call, rewrite the arguments, or tell the user the platform is down. Two of those are wrong, and the wrong one wastes the user's time or misreports the state of the system.
So every failed tool call in Plexara reports the same shape. A stable code the agent can branch on. A category naming whose fault the failure is. A message describing the specific failure, and a hint naming the corrective action when there is one. The category is the field that changes agent behavior: it is the difference between fixing a typo in an argument and telling you that your persona does not carry a capability and who to ask about it.
Every failure names whose fault it is
| Category | Whose fault | What to do about it |
|---|---|---|
| client_input | The call | Fix the arguments and retry. |
| not_found | The call | The named thing does not exist; correct the reference. |
| authentication_failed | The caller's identity | Provide valid credentials. |
| authorization_denied | The caller's identity | The persona does not carry this; ask an administrator for access. |
| user_declined | The user | A consent prompt was declined. Nothing to fix. |
| setup_required | Session state | Call the prerequisite tool first, then retry. |
| feature_unavailable | Deployment configuration | The feature is not enabled here. Say so; do not report it as an outage. |
| internal | The platform | Not the caller to fix. Retrying with different arguments will not help. |
| tool_error | Unclassified | A tool failure with no finer category. The message still describes it. |
Alongside the category, every failure carries a stable code the agent can branch on, a message describing the specific failure, and a hint naming the corrective action when there is one. The category is recorded on the audit log too, so an operator can ask how many refusals last week were denials and how many were bad arguments.
Identity: the step before everything else
Authorization only makes sense if the system knows who is asking. Plexara integrates with enterprise identity providers rather than maintaining its own user store, which keeps governance aligned with whatever access decisions the organization already makes in other systems.


The audit log: a single record with user identity attached
Every tool call produces an audit record. The record is written by Plexara, not by the downstream database, which means it carries the human identity through. A typical database log sees a service account connecting from the platform; the Plexara log sees the actual user whose session produced the call.
The practical value of this shows up in investigations. 'Who ran this query at 2am Tuesday' is an answerable question at the Plexara layer. 'Which persona did they act under when they ran it' is answerable in the same log entry.
Every tool call is logged with user identity attached
Authenticated user
The human user the session belongs to, via the identity provider. Not a service account; the actual person who initiated the session.
Resolved persona
The persona in effect for the session. If a user has more than one persona available and chose one explicitly, that choice is recorded.
Tool invoked and arguments
The tool name, the connection it ran against, and the arguments passed to it. Redaction rules can be applied to sensitive argument fields.
Outcome and duration
Success, refusal, or error. How long the call took. The kind of information that turns "the query seemed slow" into something investigable.
Database-level logs see a service account; the Plexara log sees the human. The combination of the two (platform log plus downstream database log) closes the loop on “who ran this query.”


What governance looks like when you are the user
Governance is mostly invisible when it is working. The rare times it shows up are exactly the ones where the user needs to understand it: a tool is missing from the agent's list, a search result carries a count of what it held back, a call gets refused with a category naming why, a query completes but returns fewer rows than expected because a row-limit cap kicked in.
Where this leads
Governance is the last of the subsystem-level lessons. The remaining lessons in the 200 series cover the two MCP primitives the series has not yet dug into: reusable prompts and reference resources. Then 210 closes with a worked end-to-end example that brings everything together.
Key terms
Ten terms cover the vocabulary of Plexara governance. Persona and default-deny are the two that show up in day-to-day conversations; the rest are the supporting mechanisms.
Key Terms
- Persona
- A named role, assigned per user (or per API key), that determines which tools the caller can see and which connections those tools can reach. Resolved at the start of every session; reported in platform_info.
- Default-deny
- The posture that access comes from a persona and from nothing else. A caller whose roles match no persona reaches no tools and no portal, so misconfiguration becomes an access refusal rather than a permissive fallthrough.
- Connection
- A configured backend a tool can reach: a Trino catalog, a DataHub instance, an S3 bucket, or similar. Personas authorize tools against specific connections, not just tools in the abstract.
- Connection grant
- The list of connections a persona reaches, matched by name or pattern. It scopes both halves of using the platform: what a tool call can reach, and what search, fetch, and list_connections show. A connection outside the grant is outside both.
- Withheld count
- The number a discovery result reports alongside what it returned, naming how many items the persona did not reach and what to ask for. It is the difference between "nothing matched" and "matches you may not see."
- Error category
- The class on every failed tool call naming whose fault the failure is: client_input, not_found, authentication_failed, authorization_denied, user_declined, setup_required, feature_unavailable, internal, or tool_error. Carried alongside a stable code, a message, and a hint, and recorded on the audit log.
- Write-enabled connection
- A connection configured to accept changes. A catalog write needs both this and the matching tool grant on the persona, both checked on the server whatever the interface rendered.
- Workflow gate
- A required ordering between tool calls enforced at the server. The platform_info-first gate is the best-known example; other gates can enforce discovery before query, review before apply, and similar.
- Audit log
- The single log that records every tool call with the authenticated user, the resolved persona, the tool and connection, the arguments, and the outcome. Plexara-side, not database-side, so the human identity is preserved.
- Identity providerIdP
- The system that authenticates the caller before persona resolution runs. Plexara integrates with enterprise IdPs via OIDC and OAuth 2.1 with PKCE, and supports managed API keys for automation.
