Skip to main content
Subdirectory: blacklist/ · Body: must be empty Blacklist entries carry no body — the pattern is in frontmatter.

Frontmatter

FieldTypeRequiredDefaultDescription
orgstring | nullNotenantOrganization name. Omit (or null) for tenant-wide blocks applied to every org.
patternstringYesThe pattern that blocks matching commands. Substring match by default; * and ? glob wildcards supported.
descriptionstring | nullNonullWhy this command is blocked. Surfaces in the matching error.

Fields NOT supported

  • id, tenant_id, created_at, updated_at — system-set
Body must be empty — putting anything in it fails validation.

Example

blacklist/rm-rf-root.mdx
---
org: platform-team
pattern: rm -rf /
description: Catastrophic. Always block — agents must scope deletes to a specific directory.
---
blacklist/interactive-editors.mdx
---
pattern: vim
description: Interactive editor — LLMs cannot drive its TUI. Use `sed` or write the file directly with `cat <<EOF`.
---

Gotchas

  • Substring match by default. pattern: vim blocks vim file.txt, git --paginate=vim, anywhere vim appears. Use globs for precise patterns: pattern: rm -rf *.
  • No regex. Only * and ? are interpreted; everything else is literal.
  • Tenant blacklist beats org. Tenant-scoped entries can’t be overridden by an org-scoped allowlist (there is no allowlist concept).
  • Body must be empty. Common mistake: putting an explanation in the body. Move it to description in frontmatter.
See Blacklists in Practice for what to block and why.