An organization can govern not only people but also what they connect. An allowlist of models, a ban on personal keys, control of external servers by identity, tool set and network destinations, access to plugin catalogs and their installation modes, a policy for editor extensions, distribution of shared rules, skills and event handlers. All of those are different objects of governance, and each has its own way of discovery and its own way of enforcement.
It helps to lay them out in a table with two columns once: how to learn what is in use and what to limit it with. Below is that map - models, personal keys, external servers, plugins, extensions, and also shared rules, skills and handlers. The first column answers the inventory question, the second the policy question, and the order here is not arbitrary: without the first the second is written blind and almost certainly forbids something other than what is actually used.
| Object | How to discover it | What limits it |
|---|---|---|
| A model | The current catalog and the provider's retention terms | The team's model allowlist |
| A personal key | User settings and key usage | A ban on personal keys |
| An external server | The launch command or address, tools, scopes | A list of servers and tools, the network mode |
| A plugin | The open manifest and the set of components | An approved catalog, requirement modes |
| An editor extension | The publisher, the signature, requested rights | Allowed publishers, an install delay, a signature policy |
| Rules, skills, handlers | Repository files and team distribution | Mandatory team content, managed handlers, review |
External servers are worth examining more closely, because they have not one dial but three. Identity answers which server is allowed - by launch command or by address. The tool list answers what exactly that server is permitted to do: an approved server with an unrestricted set of tools remains a wide door. The network mode answers where the server may reach on its own. Closing one dial and leaving two open is a common mistake, and it is discovered not in the settings but in the logs, when somebody notices outbound calls nobody expected.
Editor extensions deserve a separate conversation, because they are a supply chain of their own with its own rules. Allowed publishers, signature verification and a delay before installing new versions are three mechanisms that together lower the risk of a short-lived malicious release. The logic is simple: such incidents usually last hours until the release is pulled, and an installation delay lets them pass by your machines without a single decision from the developer.
Underneath those mechanisms lies a different registry. Extensions come from Open VSX rather than from the Microsoft marketplace: not everything is there, and the same publisher.extension name can point to a different publisher and different code than in the familiar marketplace. Search and downloads do not go straight through but through a proxy of its own, marketplace.cursorapi.com, where an extension is run through automated malware and supply-chain analysis, and whatever fails review is blocked. For a few widely used extensions absent from Open VSX there are first-party Anysphere replacements. The consequence is simple: what you verify is the publisher, not the name, otherwise an allowlist approves a matching name instead of the code you expected.
Plugins have a dial of their own - installation modes and the team catalog. The difference between offering and mandating is not cosmetic here. A catalog with an approved set answers what may be installed but does not guarantee that what is needed has been installed: half the team may lack the thing you were counting on when you wrote the rules. A required mode, on the contrary, guarantees presence, and it is precisely what is needed for things the agent's behavior must depend on identically for everyone. Both modes are useful, but they answer different questions, and confusing them means building policy on an assumption about your colleagues' environment.
The main idea fits in one sentence: steering is not enforcement. A mandatory team rule can tell the model what to do, but it replaces neither the model allowlist, nor restrictions on external servers, nor the sandbox, nor an event handler. Policy must live in a mechanism that technically controls the resource in question rather than in text the model weighs alongside the rest of the context.
That mistake occurs more often than it seems and looks convincing. The rules say not to connect unapproved servers - so nobody will. In practice not all surfaces see the rule, it does not apply to some scenarios, its influence depends on the volume of context, and there is nothing to check compliance with after the fact: there was no refusal and no record was left. An administrator-level restriction, on the contrary, produces an observable refusal and a line in the log, that is, evidence you can present.
Hence the practical order of adoption. First an inventory: which models, servers, plugins and extensions are used today. Then an allowlist assembled from facts rather than from an ideal - it honestly includes what the team cannot work without. And only then tightening: whatever did not make the list is switched off on an announced schedule and with a clear exception path. The reverse order, forbidding first and finding out later, guarantees a stream of exceptions, policy circumvention and a reputation for a tool that gets in the way.
The engineering conclusion is simple: govern what you can observe and enforce with what technically controls the resource. Then policy becomes a property of the system rather than a statement of intent, and compliance is visible in logs rather than established by surveying the team on the eve of an audit.
The typical failures are predictable. Writing a requirement into rules instead of a restriction in a mechanism. Compiling an allowlist without an inventory of actual usage. Approving an external server and not restricting its tools and network. Leaving extensions outside the policy, treating them as part of the editor. And forbidding everything at once without leaving a clear exception path.