SKILL 29 / SAFETY · ROUNDUP

Safety & Governance Skills Roundup

This class has exactly one acceptance question: when it finds something, does it block you, or just tell you?

2026-09-30 · BigCat

Get another class wrong and you waste money. Get this one wrong and you buy a feeling of being protected. All twelve entries below are real and installable (or readable), but they split into two piles: the ones that actually stop you — nonzero exit code, blocked syscall — and the ones that write a report. Both are useful. Treating them as the same thing is how you get burned.

Same series → Skill 12, the MCP trust boundary (that injection surface is covered there)

// WHY THIS MATTERS

Once a model writes your code, two new fronts open up: scanning while the model is still typing, and the fact that the skills and MCP servers you installed are themselves an attack surface. This issue puts both next to the classic three — secret scanning, dependency audit, privilege checks — in one table, ordered by a single criterion: fail-closed first. Deny by default when uncertain, don't pass by default. Table and commands first; the criteria come later.

// 01

The list: twelve entries, sorted by whether they can block

Claim: the top half (1-5) stops you. The bottom half (6-12) only tells you. Know which one you are buying before you install it.
Entry Source What it takes off your plate When not to install === CAN BLOCK (deterministic: exit codes and syscalls) ============================================================= 1 sandbox (Bash sandbox) built-in · /sandbox OS enforces file + network limits Native Windows (needs WSL2) 2 permissions.deny built-in · settings.json Hard-bans tools/paths; tightens You actually want "ask me" 3 gitleaks GitHub · MIT Exit code 1 before a secret lands Push protection already covers it 4 trufflehog GitHub · AGPL-3.0 Only reports secrets verified live Legal cannot accept AGPL 5 osv-scanner GitHub · Apache-2.0 Dependency CVEs against OSV.dev One language with its own audit === ONLY TELLS YOU (model review and reports; no blocking) ========================================================= 6 security-guidance plugin · Anthropic A second model reviews as you write No Python 3.10+ on this box 7 claude-security plugin · Anthropic Multi-agent deep scan + SARIF The token cost is too steep 8 /security-review built-in command One security pass over the branch You want it to run every time 9 claude-code-security-review GitHub · MIT Auto-comments findings on a PR You review untrusted PRs 10 semgrep mcp GitHub · LGPL-2.1 Rule-based SAST wired into agents You don't need the model to call it 11 zizmor GitHub · MIT Audits GitHub Actions privileges No workflows in the repo 12 snyk/agent-scan GitHub · Apache-2.0 Scans the MCP servers/skills you installed You install no third-party skills ==================================================================================================================== Two more that belong under "do not install": guardrails-ai (alive, but it guards YOUR LLM app, not your coding agent) protectai/llm-guard (per its GitHub page, archived 2026-07-09)

How to install (commands copied from each official page or repo README)

# 1 and 2 need no install, just configuration. Start with the sandbox panel.
/sandbox
# To use the sandbox as a security gate rather than a convenience, set these explicitly
{ "sandbox": { "enabled": true, "failIfUnavailable": true,
                "allowUnsandboxedCommands": false,
                "network": { "strictAllowlist": true, "allowedDomains": ["*.github.com"] } } }

# 3, 4, 5, 11 are deterministic scanners; each installs in one line
brew install gitleaks trufflehog zizmor
go install github.com/google/osv-scanner/v2/cmd/osv-scanner@latest
gitleaks git --report-path gitleaks-report.json   # findings -> exit code 1
trufflehog git file://. --results=verified --fail # findings -> exit code 183
osv-scanner scan source -r .
zizmor .github/workflows/                          # SARIF output for CI

# 6 and 7 are official plugins; 8 is built in and needs nothing
/plugin marketplace add anthropics/claude-plugins-official
/plugin install security-guidance@claude-plugins-official
/plugin install claude-security@claude-plugins-official   # needs python3 >= 3.9
/claude-security         # menu: scan codebase / scan changes / suggest patches
/security-review         # one pass over the current branch, zero install

# 10 Semgrep's MCP is now a subcommand of the main repo (the old semgrep/mcp is archived)
claude mcp add semgrep -- semgrep mcp

# 12 scans the MCP servers and skills you installed; asks before contacting each one
uvx snyk-agent-scan@latest scan

Entry by entry

Why those two landed under "do not install" · guardrails-ai/guardrails (Apache-2.0; ~7.5k stars per its GitHub page, 2026-09) is alive and OnFailAction.EXCEPTION is exactly the fail-closed shape — but it guards your own LLM application's inputs and outputs, not your coding agent, and listing it here would mislead. protectai/llm-guard (MIT) has a beautiful input/output scanner taxonomy, but per its GitHub page it was archived on 2026-07-09 and is explicitly unmaintained — read it for ideas, don't pull it into a new project.
// 02

Why these twelve don't compare: two axes, four squares

Claim: the horizontal axis is who judges (a hardcoded rule vs. a model reading context); the vertical axis is what happens on a finding (hard block vs. a report). The top-right square is empty, and it will stay empty for a while.
| Hardcoded rules (deterministic) | Model reads context (semantic) ----------------------+-----------------------------------+--------------------------------------- Blocks on a finding | 1 sandbox (syscall layer) | (empty) | 2 permissions.deny | -- nothing here dares let a model's | 3 gitleaks, exit code 1 | judgment veto your commit outright | 4 trufflehog --fail -> 183 | ----------------------+-----------------------------------+--------------------------------------- Reports; you decide | 5 osv-scanner | 6 security-guidance (no layer blocks) | 10 semgrep mcp | 7 claude-security (patches await you) | 11 zizmor (teeth only via SARIF) | 8 /security-review | 12 snyk/agent-scan | 9 PR Action (comments, never blocks) ----------------------+-----------------------------------+---------------------------------------

That empty square is a design choice, not an unfinished product: model review has false positives, and one false positive that hard-blocks a commit gets the whole check switched off the next morning — and then you don't even have the report. So read this class correctly: the left column enforces "must never happen," the right column says "you should look at this." Neither substitutes for the other.

Three common mismatches:

How it goes wrong: a team wires up 9, gets a tidy security comment on every PR, and feels covered. Six months later a key leaks — that comment never blocked a merge, and nobody ever added 3. A report nobody reads equals nothing installed. An exit code nobody can route around.
// 03

A three-minute check: answer these six before installing

Claim: this class isn't chosen by star count. It's chosen by what the thing does by default when it is uncertain or broken. Anything that passes by default is not a gate.
  1. What's the exit code on a finding? If you can't answer, it isn't a gate. For 3 it's 1; for 4 with --fail it's 183 — both go straight into CI. For 6, 7, 8 and 9 the answer is "does not block." Write that down instead of comforting yourself.
  2. What happens when the tool itself can't run? This question separates the serious from the rest. The sandbox's default is to warn and keep running unsandboxed when dependencies are missing or the platform is unsupported — fail-open. Making it a hard failure takes an explicit sandbox.failIfUnavailable: true, which the docs describe as being for deployments that require sandboxing as a security gate.
  3. Is there a sanctioned way around it? Yes, and it's documented: on a sandbox violation Claude may retry with dangerouslyDisableSandbox, and allowUnsandboxedCommands: false is what closes that path. Entry 12's equivalent is --dangerously-run-mcp-servers. Whenever a flag has "dangerously" in its name, find out whether it defaults on or off.
  4. Which settings layer actually counts? An easy trap: sandbox.network.strictAllowlist (which turns "ask" into "deny") is honored only from user settings, managed settings, or --settings — putting it in a repository's .claude/settings.json does nothing at all. Security config in the wrong layer is security config you don't have.
  5. Who manages its false positives? Only a tool with a real mechanism deserves a gate: 3 has baselines plus .gitleaksignore, 4 has --results=verified, 9 has that exclusion list. A noisy tool with no triage mechanism is a tool waiting to be switched off.
  6. Is the tool itself an attack surface? This one is aimed at this class specifically: 9 states it isn't hardened against prompt injection and should only see trusted PRs; 12 states that scanning configuration may execute commands; 5's fix may execute package-manager scripts. Security tools read untrusted input by definition — those three warnings are honesty, not weakness.
The line in this section: 12 has ~3.1k stars and 3 has ~29.6k — neither number is a selection criterion. Questions 1 and 2 are: does it block on a finding, and does it pass by default when broken? Two "passes" means you own a reminder tool. Don't put it in a compliance document.
// 04

The honest cost: this is the class most likely to be installed and useless

Claim: the cost here isn't money. It's three predictable failures — alert fatigue, false comfort, and the tool becoming the entry point.

Three ledgers

What you can do without installing anything

  1. Run /security-review first. Zero install, zero config, and you learn roughly where this branch stands.
  2. Then turn on your host's push protection. Less work than any scanner, and it genuinely blocks.
  3. Only then put 3 in pre-commit. One - id: gitleaks line is the best value fail-closed control you can buy.
The square that stays empty: 1 stops syscalls, 3 stops commits, 7 writes SARIF and patches — not one of them can decide whether your business can accept a given risk. Entry 7 built that into the product: patches are never applied automatically. Pressing that git apply is still a human's job.

// ONE-PAGE BUYING CARD

Install these three first: (1) gitleaks in pre-commit (brew install gitleaks, one - id: gitleaks line, exit code 1 on findings) — the only entry that has teeth the day you install it. (2) /security-review — zero install, tells you where the branch stands. (3) /plugin install security-guidance@claude-plugins-official — review while the model writes, but remember it does not block.

Add as needed: claude-security@claude-plugins-official (you want SARIF reports and git apply-able patches, and accept the token cost) · trufflehog --results=verified --fail (3 is too noisy to read, and legal accepts AGPL) · osv-scanner scan source -r . (many dependencies, mixed languages) · zizmor .github/workflows/ (you have workflows — the most commonly empty square) · anthropics/claude-code-security-review (you want PR-level comments, and only review trusted PRs) · uvx snyk-agent-scan@latest scan (you installed third-party skills or MCP servers) · claude mcp add semgrep -- semgrep mcp (you want the agent to call SAST itself).

Explicitly don't: treat "there is a report" as "there is a gate" · turn on a secret-scanning gate over an old repo without a baseline · let a model's security judgment veto a commit directly · audit code but never .github/workflows/ or the skills you installed · enable the sandbox without setting failIfUnavailable and allowUnsandboxedCommands · put strictAllowlist in a repo's .claude/settings.json (no effect) · pull llm-guard into a new project (archived) · assume more stars means more secure.

// GLOSSARY

fail-closed / fail-open
When broken or unable to decide, does it deny (closed) or pass (open)? Security components must be fail-closed, and plenty of defaults are open.
SARIF
The interchange format for static analysis results (2.1.0). A tool that emits SARIF can be read directly by GitHub code scanning — it is usually how a report gets teeth.
verified secret
A trufflehog concept: the credential found is actually used against the provider's API to confirm it is live. Cost is an outbound request; benefit is far fewer false positives.
baseline
Record every existing hit in a report, then only look at what's new. A prerequisite for gating secret scanning on an old repo, or alert fatigue is guaranteed.
tool poisoning
An MCP server or skill hiding malicious content in its own description so that being read into context steers the agent. Exactly what snyk/agent-scan looks for.
sandbox.failIfUnavailable
A Claude Code setting. By default a sandbox that can't start only warns and runs anyway; set it to true for a hard failure. Required if you treat the sandbox as a gate.
strictAllowlist
A sandbox network setting. Non-allowlisted domains go from "ask you" to "denied." Honored only from user settings, managed settings, or --settings.

// FURTHER READING