Policies
A policy tells the gateway what to do when a specific <source>:<namespace>/<name> is about to be installed. Four types cover the common cases.
Decision algorithm
- Filter to policies that are enabled and match the scope (org or workspace).
- Sort by priority descending, then createdAt descending.
- Walk in order; the first non-
allowdecision wins. All applicable policies produce an evaluation record (matched or not). - If every applicable policy allows (or none apply), the install proceeds.
Canonical skill id
Patterns match against the normalized string <source>:<namespace>/<name> where source is one of internal, tessl, github, or http.
Types
allowlist
{
"patterns": ["internal:*", "tessl:stripe/*", "tessl:aws/*"]
}Only installs whose id matches one of the patterns are allowed; everything else is denied with reason not on allowlist "<policy>".
blocklist
{
"patterns": ["tessl:badactor/*", "github:*/malicious-*"]
}Installs matching any pattern are denied.
version_pin
{
"rules": [
{ "pattern": "tessl:react/*", "range": "^18.0.0" }
]
}For installs matching pattern, only versions satisfying range (semver 2.0) are allowed. When the caller doesn't pin a version, the pin skips evaluation so higher-priority policies still apply.
require_approval
{
"patterns": ["*"],
"exceptions": ["internal:*"]
}Installs matching patterns but not exceptions return HTTP 202 with an approval id. The CLI exits with code 3; the developer re-runs after an admin decides the approval.
Glob syntax
Patterns use shell globs (picomatch bash: true, no nocase). Quick reference:
*— any characters (including/in this mode)tessl:stripe/*— anything undertessl:stripe/*:badactor/*— any source, namespacebadactortessl:{aws,gcp}/*— brace expansion
Preview
The /[org]/policies page has a Preview pane that evaluates a candidate skill reference against your current policy set without creating anything. Use it when rolling out new rules.