How we designed user access controls in Bud Ecosystem, and why

Traditional RBAC groups permissions into roles and assigns users to them. That model collapses fast when the platform becomes the connective layer across an enterprise's entire AI surface area.

For any enterprise platform, access control is foundational. Admins, employees, and partners all operate with permissioned access across systems like CRM and ERP platforms. These platforms typically use role-based access control, which works by grouping platform permissions into roles and then assigning users to those roles. Simple enough.

However, at some point while building Bud Ecosystem, we realised that such traditional approaches to user access control were not optimal for the platform we were building — an enterprise AI management platform.

AI operations, orchestrated through an enterprise AI management platform, extend far beyond a single team or workflow. Models, agents, training and inference infrastructure, evaluations, prompts, datasets, MCP orchestrations, security systems, and governance workflows are all consumed across research, engineering, legal, finance, operations, security, compliance, and business teams — each operating with different responsibilities, risk boundaries, and levels of visibility.

An enterprise AI management platform, therefore, cannot rely on static, two-dimensional structures of roles versus permissions. Access control has to mirror the organisation itself: cross-functional, department-aware, hierarchical, and adaptable to how enterprises actually operate.

Bud Ecosystem manages the end-to-end AI lifecycle. At that scale, the platform starts behaving less like a product and more like an operating system for enterprise AI. And operating systems cannot rely on patchwork access design. So the question we asked ourselves was simple:

What should access control look like when the platform becomes the connective layer across an enterprise's entire AI surface area?

Seven architectural decisions emerged from that thinking.

Projects are the grouping primitive

We had to pick one primitive for grouping users, resources, and permissions. We picked projects. Not teams. Not workspaces.

The reasoning was straightforward. In an enterprise, the unit of work is the project. Sales Copilot. Underwriting Assistant. HR Helpdesk. Each one has a clear business purpose, a clear set of stakeholders, and a clear cost line. More importantly, each one cuts across teams. A Sales Copilot project involves sales leadership defining requirements, sales ops shaping workflows, IT managing infrastructure, security reviewing data access, and compliance validating guardrails. No single team owns it. A team-based grouping primitive would force you to pick a "home team," and that never reflects how the work actually gets organised. A workspace-based primitive — essentially a collection of projects — adds abstraction without solving the underlying problem of who has access to what within each unit of work.

Figure 1
Projects as the grouping primitive A project container owns resources like models, agents, prompts, routes, evals, and API keys. Three user roles — sales leadership, developers, and sales reps — each see a different surface of the same project. Sales copilot project Models Agents Prompts Routes Evals Project access list (RBAC) Sales leadership → Admin Developers → Dev-client Sales reps → Biz-client Every API call traces to this project → automatic cost attribution Sales leadership view Usage dashboards Cost breakdowns Agent performance Business metrics Developer view Model registry Agent infrastructure Prompt configs API key management Sales rep view Chat interface Pre-approved agents No infra visibility No config access One project · multiple roles · completely different surfaces
Figure 2 — teams span many projects; the project is the unit that stays constant.

A single team can be involved in multiple projects. IT might touch fifteen. Sales might be part of three. The unit that stays consistent across all of these is the project.

So in Bud Ecosystem, projects own their resources — models, agents, prompt configurations, routes, evaluations, API keys — and each project carries its own access list, built on the same RBAC core that operates at the platform level. This means the same project can present entirely different surfaces to different users. Sales leadership sees usage dashboards and cost breakdowns for running their agents. Sales reps see only the chatbot or agent interface, with no visibility into model registries, infrastructure, or prompt configurations. Developers supporting the project access the model and agent infrastructure they need. A technical admin sees prompts, routing logic, and model configurations. One project, multiple roles, completely different views, all derived from the same permission model.

Projects also provide natural isolation — of resources, data, and access — without requiring any structural changes as teams grow. A pilot project with five people and a production deployment with two hundred users operate within the same boundary. New users are scoped in with the appropriate permissions. Nothing is restructured. And because every API call, every model invocation, and every resource consumed traces back to a specific project, cost attribution to business units and departments becomes an emergent property of the architecture rather than a separate system layered on afterward.

Agents are a user type

Traditional RBAC frameworks assume users are human. That assumption does not hold in an enterprise that is building with AI agents.

Agents authenticate. They call APIs. They retrieve documents. They take actions on behalf of users and, increasingly, on behalf of other agents. They access the same tools, the same knowledge layers, and the same workflows that human users access — sometimes with broader reach. Treating them as an afterthought, a service account here and a bot user there, creates the same patchwork problem we were trying to avoid. Auditing breaks because agent actions are not attributed consistently. Lifecycle management breaks because there is no governed way to provision or revoke an agent's access. Cost attribution breaks because agent-driven consumption is invisible at the project level.

Figure 3
Agents as a first-class user type Human admins, developer-clients, and AI agents all share the same identity model. All interactions route through the RBAC and policy layer, with MCP Foundry governing agent-tool interactions. Unified identity model Admin Human operator Developer Human client Business user Human client AI agent Agentic client Same RBAC + policy engine Identity · permissions · audit trail · lifecycle management Platform resources Dashboards Consoles Bud MCP Foundry Agent governance plane Tool authorization + token scoping Per-agent observability + audit RBAC + policy enforcement Federated MCP server control Applies to all agent types Internal copilots Commercial assistants Third-party agents
Figure 4 — the same permission model that governs a human admin governs an agent.

So we made agents a first-class user type in Bud Ecosystem. The same permission model that applies to a human admin or a developer-client applies to an agent. Admins can define what an agent is allowed to access, which tools it can invoke, which systems it should never touch, and how it processes the information it retrieves.

This becomes especially important when you consider the trajectory. An enterprise three years from now will not have five agents. It will have hundreds. Some built internally. Some introduced by vendors. Some belonging to customers or partners calling into the organisation's systems. All of them need access governance, audit trails, and the ability to be revoked.

This is where Bud MCP Foundry extends the access model into the agentic layer. MCP Foundry serves as the governance plane for agent-tool interactions — controlling which agents can call which tools, enforcing authorisation and token scoping at the gateway, maintaining per-agent observability and audit logs, and applying the same RBAC and policy controls that govern human users. Whether the agent is an internal copilot built on the organisation's own models, a commercial assistant, or a third-party agent calling in through a federated MCP server, every interaction routes through the same control plane. One identity model. One audit trail. One place to answer who accessed what, with whose permission, and at what cost.

Why not retrofit this later

We did not want to add agent governance after the surface area had already grown beyond what a patchwork approach could manage.

From an access-control perspective, the distinction between a human user and an AI agent is less meaningful than the distinction between governed and ungoverned.

Permissions are four-dimensional, not two-dimensional

Traditional RBAC is two-dimensional: a user is assigned a role. That model works when the platform's domain is simple. It collapses fast in a real enterprise.

Consider an AI architect. They manage cluster infrastructure globally. They administer the Sales Copilot project. They have view-only access to the Underwriting project because they consult but do not own it. They call APIs on the Legal Helpdesk model as part of a cross-functional integration. All at once. All under the same identity.

Four-dimensional permission model Permissions defined by four dimensions: Who (user type), What (resource), Where (scope), and How (action). An example shows one AI architect holding multiple permission tuples across different scopes. Who What Where How Admin Client Agent Cluster Model · Agent Route · Eval · API Global Project-level Resource-specific View Manage Consume · Call Example: one AI architect, four composed permission tuples AI architect Single identity Admin · Clusters · Global · Manage Manages cluster infrastructure across the platform Admin · All resources · Sales Copilot · Manage Full admin of the Sales Copilot project Client · All resources · Underwriting · View Read-only consulting access Client · Model endpoint · Legal Helpdesk · Call API-level access for cross-functional integration No role sprawl — dimensions compose naturally without unique roles per combination
Figure 5 — four dimensions compose, so one identity needs no new role per combination.
Figure 6

A two-dimensional model cannot represent any of that without ugly hacks — like creating a unique role for every combination of user, resource, scope, and action. We have seen platforms with hundreds of roles for exactly this reason. It becomes unmanageable, and worse, it becomes a governance risk in itself because no one can reason about what any given user is actually allowed to do.

So we made the permission model four-dimensional: Who, What, Where, and How.

  • Who is the user, and what type they are — Admin, Client, or Agent.
  • What is the module or resource being accessed — a cluster, a model, an agent, a route, an evaluation, a project, an API.
  • Where is the scope at which the permission applies — global, project-level, or down to a specific resource.
  • How is the action being performed — view, manage, consume, or call.

These four dimensions compose naturally. A single user can hold different combinations of What, Where, and How across different parts of the platform, and the system resolves them consistently without requiring a new role for each combination. The permission model mirrors how enterprise responsibilities actually work — layered, context-dependent, and rarely reducible to a flat matrix.

This is also what makes the previous decisions hold together. Projects as the grouping primitive define the Where. Agents as a user type expand the Who. The four-dimensional model is the underlying structure that lets a single RBAC core express all of it without fragmenting into role sprawl.

User hierarchies are flexible, not prescribed

Every organisation has its own hierarchy. Imposing a rigid one from the platform side would either force enterprises to reshape their internal structure to fit the tool, or lead to workarounds that undermine the access model entirely.

Flexible user hierarchy Three-level hierarchy: Super Admin at the top with global governance, specialized Admins scoped to projects and modules, and Clients split into developer-clients and business-user-clients, each with a distinct platform surface. Super admin Global guardrails · IdP config · default policies Platform console creates + scopes Infra admin Clusters + infra layer Project admin Sales Copilot project Model admin Model onboarding Management console Admin boundary — below this: consumers, not operators Developer-clients Developer dashboard Discover models + agents Create API keys Configure routing + prompts Monitor usage + performance Business-user-clients Chat + playground Pre-approved assistants Workflow interfaces No infra exposure No API/config visibility Same identity · same permission model · same audit trail — across all levels
Figure 7 — three levels, with flexibility coming from how they compose rather than from adding more.
Figure 8

So we reduced the hierarchy to the minimum number of distinct levels that an enterprise AI platform actually requires, and made the structure within those levels flexible enough to reflect how each organisation operates.

At the top is the Super Admin, who owns the platform at the organisational level — global guardrails, identity provider configuration, default policies, and cross-cutting governance. But a Super Admin cannot manage everything alone, and should not have to. Below that level are specialised Admins. One Admin might own the infrastructure layer. Another might manage the Sales Copilot project. A third might oversee model onboarding for a new product. Because projects are the grouping primitive, reflecting organisational hierarchy becomes straightforward — the Super Admin creates Admin users and scopes them to the projects and modules that match their actual responsibilities. The organisational chart maps onto the platform without requiring a parallel governance structure.

Below Admins are Clients — the users who consume what the platform produces rather than operate it. This is a meaningful separation, not just a naming convention. An Admin and a Client may interact with the same project, but they see entirely different surfaces. Admins land on the management console, where they configure models, routes, permissions, and policies. Developer-clients land on a developer dashboard, where they discover available models and agents, create API keys against approved deployments, configure routing and prompt templates, and monitor usage and performance. Business-user-clients — sales reps, legal teams, operations staff — access models and agents through chat interfaces and the Bud Playground, where they work with pre-approved assistants and workflows without ever encountering infrastructure details, model registries, or API configurations.

The hierarchy is minimal by design. The flexibility comes not from adding more levels, but from how these levels compose with projects, modules, and the four-dimensional permission model to express whatever organisational structure the enterprise already has.

Permissions can be more than binary rules

Roles and permissions describe what a user is allowed to do. They do not describe context. And in an enterprise, context is where the real access decisions happen.

Figure 9

Take a simple example. A developer role has access to architecture documents. That is a reasonable permission. But a developer who joined yesterday should probably not have access to architecture documents on day one. A developer should perhaps have access only while they are actively assigned to a specific project. Or only when the document falls below a certain sensitivity classification. Or only when the developer is not under an active internal investigation.

RBAC plus guardrail policy layer A user request flows through two layers: the RBAC layer checks role-based permissions (the outer envelope), then the guardrail policy layer evaluates contextual conditions like tenure, project assignment, data sensitivity, and jurisdiction before allowing access to the platform response. User request Layer 1 — RBAC What is permitted in principle? Role check Permission check Scope resolution Outer envelope set Layer 2 — Custom guardrail policies What is appropriate in this moment? Tenure New hire → relaxes Assignment Active project only Sensitivity Data classification Jurisdiction Data residency rules Guardrail model evaluates context Refined within envelope Platform response RBAC = what's permitted · Guardrails = what's appropriate · Neither alone is sufficient
Figure 10 — RBAC sets the envelope; guardrails decide what is appropriate inside it, per request.

These are real enterprise rules. They come from security teams, compliance officers, legal departments, and HR policies. They do not fit any RBAC matrix, no matter how carefully you design it. A binary "user can do X" rule cannot express time-bounded access, sensitivity-based filtering, departmental separation of duties, or data residency constraints. These rules depend on context that a static permission model simply does not capture.

So we added a second layer: custom guardrail policies. Admins define their own policies — the rules that reflect their organisation's specific security posture, regulatory environment, and internal governance requirements. A guardrail model enforces those policies at the point of user interaction, sitting between the user's request and the platform's response. The guardrail layer evaluates context that RBAC cannot see — who is making the request, when, under what conditions, against what sensitivity level of data — and applies the organisation's policies in real time.

This is what lets enterprises implement rules that no role-permission matrix can express. New employee restrictions that relax over time. Access that is valid only for the duration of a project engagement. Filtering based on data classification. Separation of duties across departments. Customer data residency rules that vary by jurisdiction.

RBAC tells you what is permitted in principle. Guardrails enforce what is appropriate in this moment. Neither layer alone is sufficient. Together, they give enterprises the kind of access control that reflects how they actually govern their operations — not as a static matrix of roles and resources, but as a living set of policies that adapt to context.

See it on your stack

A 30-minute walkthrough on your hardware mix, governance constraints, and top use case.

Request a demo

Permissions should reflect FinOps policies

Access control in an enterprise is not only about who can do what. It is also about how much they can consume and at what cost. In practice, budget governance and access governance are inseparable — but most platforms treat them as entirely separate systems, managed by different teams, reconciled after the fact.

Figure 11
FinOps embedded in the access layer API keys scoped to projects carry budget caps, rate limits, and expiration. The same project-level scoping that controls access also controls spend, enforced as permissions at the access layer rather than reconciled after the fact. Sales copilot project API key — Team A Experiment key API key — Team B Production key API key — Agent Copilot service key Financial controls Budget: $5,000/mo Rate: 100 req/min Expires: 90 days Scope: GPT-4 only Financial controls Budget: $25,000/mo Rate: 1,000 req/min Expires: 1 year Scope: All models Financial controls Budget: $10,000/mo Rate: 500 req/min Expires: 6 months Scope: Agent models Access layer enforcement Same layer that checks permissions also checks budget + rate + quota Approaching cap → platform team alert before CFO notices Cost governance, not just cost monitoring
Figure 12 — budget caps and rate limits as permissions, enforced at the same layer as access.

We did not want that separation. If projects are the grouping primitive and every API call traces back to a user, a project, and a team, then financial controls should be expressible within the same permission model.

In Bud Ecosystem, API keys are scoped to projects. Each key can carry its own expiration date, budget cap, and rate limit. Admins can set quotas per key, per client, or per model endpoint. This means a new application team can be issued a key with a fixed monthly cap and a fixed requests-per-minute ceiling. They experiment freely within that envelope. They cannot blow up the business unit's budget. They cannot starve production traffic by consuming disproportionate capacity. If they approach the cap, the platform team gets an alert before the CFO does.

This is not just cost monitoring — it is cost governance embedded into the access layer. The same project-level scoping that controls which users can access which models also controls how much they can spend and how much throughput they can consume. Budget limits, rate limits, and quotas are not afterthoughts bolted onto a billing dashboard. They are permissions, enforced at the same layer as every other access control decision.

The principle behind this is straightforward. In an enterprise, the platform should make the right thing automatic and the wrong thing impossible. Teams should be able to move fast within clearly defined boundaries. When those boundaries include financial constraints — and in any enterprise operating AI at scale, they always do — the access model should enforce them natively rather than relying on manual oversight and post-hoc reconciliation.

Build on existing identity infrastructure, not a parallel one

Most GenAI platforms ship with their own user system. That means another set of credentials for users to manage. Another lifecycle for IT to administer. Another audit log for compliance teams to reconcile. Another surface for security teams to monitor, patch, and defend.

We were not going to do that. If an organisation already has user management, access control, and identity infrastructure — and every enterprise does — the platform should plug into it. Not duplicate it. Not ask the organisation to maintain a parallel account system just because they adopted an AI platform.

Build on existing identity infrastructure Enterprise identity providers like Okta, Azure AD, Google Workspace, Active Directory, and LDAP federate into Bud Ecosystem's centralized IAM core via SAML 2.0, OIDC, and OAuth 2.0. Existing password policies, MFA, and offboarding flows all carry through to GenAI access automatically. Enterprise identity providers Okta Azure AD Google Workspace Active Directory LDAP OIDC SAML 2.0 OIDC Federation Federation Bud IAM core SSO + identity brokering SAML 2.0 · OIDC · OAuth 2.0 Centralized RBAC engine Bud Platform GenAI access Inherited from existing infrastructure Password policies MFA config Lifecycle mgmt Provision + deprovision Offboarding AD revoke → Bud revoke HR offboards developer in AD → GenAI access revoked automatically No separate user list · no access drift · one audit trail for SOC 2 / ISO Zero friction adoption — part of existing governance posture, not an exception to it
Figure 13 — one identity story for the auditors, not two.
Figure 14

Bud Ecosystem's RBAC sits on a centralised IAM core with single sign-on out of the box: SAML 2.0, OpenID Connect, and OAuth 2.0, properly implemented. LDAP and Active Directory federation for organisations that run on directory services. Identity brokering for the major enterprise identity providers, and any other OIDC- or SAML-based provider the organisation already uses.

What this means in practice is that the organisation's existing password policies, MFA configuration, and offboarding playbooks all apply to GenAI access from day one. Lifecycle management — both provisioning and deprovisioning — is inherited from the existing identity provider, not duplicated inside Bud. When HR offboards a developer in the directory, Bud access is revoked automatically. There is no separate user list to maintain. The security team's existing offboarding process covers GenAI access without modification. Auditors get one identity story to review, not two.

The principle behind this decision is about reducing friction for adoption to zero. Every parallel system an enterprise has to maintain is a governance liability — a place where access can drift out of sync, where deprovisioned users retain access they should not have, where audit trails diverge and reconciliation becomes a quarterly project. By inheriting identity from the infrastructure the organisation already trusts, the platform becomes part of the existing governance posture rather than an exception to it.

In short
  • The project, not the team, is the one grouping primitive that survives cross-functional work.
  • Agents are a user type, because governed versus ungoverned matters more than human versus machine.
  • Who / What / Where / How compose, so a real enterprise identity needs no role sprawl.

Protocol support, hierarchy levels, and the four permission dimensions describe the platform as designed at the time of writing; check current product documentation before designing an integration against specific behaviour. Named projects such as Sales Copilot and Underwriting Assistant are illustrative examples, not customer deployments.

Get the next one by email

Product releases, benchmarks, and deployment patterns. Monthly, one email, unsubscribe any time.

Unsubscribe any time.

BN
Written by
Bud Newsroom
Bud Ecosystem
Get started with Bud

Put your data on it.

The fastest way to see what an integrated AI operating system does for your enterprise is a proof-of-concept on your infrastructure, with your data.

01 Identify a use case where complexity, cost, or governance is a known pain point.
02 Joint discovery — Bud maps your AI pain points to platform capabilities.
03 POC in days, on your hardware, with your data.