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

  1. Filter to policies that are enabled and match the scope (org or workspace).
  2. Sort by priority descending, then createdAt descending.
  3. Walk in order; the first non-allow decision wins. All applicable policies produce an evaluation record (matched or not).
  4. 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 under tessl:stripe/
  • *:badactor/* — any source, namespace badactor
  • tessl:{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.