CC Safety Net matched all 156 corpus checks. At standard, rm -rf * still runs.
We ran 52 destructive, secret-reading and safe shell commands through CC Safety Net at three levels. All 156 rows matched, and two dangerous forms pass at standard.
By David Discua
Measured in the lab
- 156/156
- corpus rows passed
- 52
- commands in corpus
- 3
- safety levels
- 611 ms
- full matrix time
- 156 of 156 corpus rows matched expectations
- cat ~/.ssh/id_ed25519 denied as secret.home.ssh
- bash -c and xargs wrappers around rm -rf denied
- git push -f and git reset --hard denied
- 13 everyday commands allowed at every level
From reports/guard-corpus.json · run on October 14, 2026. cc-safety-net 2.6.10 (v2.6.10, c0596cde29fa) on Bun 1.4.2; 52 commands at standard, strict and paranoid
How it is wired
01/03Your agent wants to run a shell command.
CC Safety Net is a pre-execution guard for coding agents. It parses each shell command before it runs and blocks destructive file and git operations, plus reads of secrets like SSH keys and .env files. We wrote a 52-command corpus of destructive, obfuscated, secret-reading and everyday commands and ran it through the real library API at three safety levels, so 156 checks in all. Every row matched what we expected, in 611 ms. The catch is that two dangerous forms in that corpus, rm -rf * and $(echo rm) -rf /, are allowed at the default standard level.
The catch
Standard is the level you get unless you raise it. Four corpus commands change verdict by level:
| Command | standard | strict | paranoid |
|---|---|---|---|
rm -rf * | allow | block | block |
$(echo rm) -rf / | allow | block | block |
rm -rf ./build | allow | allow | block |
rm -rf ./dist | allow | allow | block |
The upstream README also says plainly that CC Safety Net is no sandbox. It does not contain processes, set filesystem permissions or watch network egress. It decides on a command string. A pass on our corpus means these 52 commands behave as listed at this pin, and a variant we did not write could still slip through. Run your agent at strict or above, and keep secrets out of the process environment too.
What we ran (keyless)
git clone --recurse-submodules https://github.com/SkilledDragonCorp/minilab-safety-net-secret-guard.git
cd minilab-safety-net-secret-guard
bun install --frozen-lockfile
bun test
bun run guard-corpus -- --json --level standard
bun run report
From reports/guard-corpus.json, run on October 14, 2026:
| Field | Value |
|---|---|
| Pin | cc-safety-net@2.6.10, tag v2.6.10 |
| Corpus | 52 commands |
| Levels | standard, strict, paranoid |
| Rows | 156 total, 156 passed, 0 failed |
| Duration | 611 ms |
The corpus has 35 commands blocked at every level, 4 level-sensitive ones, and 13 everyday commands like git status, bun test and ls -la that must stay allowed. A row passes only when the verdict matches and every deny carries a non-empty reason and rule id. Where we pinned a rule id, it had to match exactly. cat ~/.ssh/id_ed25519 came back as secret.home.ssh, cat ~/.claude/.credentials.json as secret.cli.claude-code, git push -f origin main as git.push-force, and bash -c 'rm -rf /' as rm.recursive-force-root-or-home. Interpreter escapes such as python3 -c "import os; os.system('rm -rf /')" were blocked at every level.
How it is wired
CC Safety Net installs as a hook in the agent CLI. Before a shell tool call runs, the hook passes the command to checkCommand, which returns allow, or deny with a reason and a rule id that the agent sees. The lab calls the same function from cc-safety-net/api under a temporary policy file per level, then checks that cc-safety-net explain --json agrees with the library. Separate tests cover hook installation and the doctor command.
Minilab (open source)
Upstream is kenryu42/cc-safety-net (1,632 stars, MIT, TypeScript, as of October 14, 2026). Add your own commands to corpus/commands.json with an expected verdict per level, re-run bun run report, and check that failedRows in reports/guard-corpus.json stays empty.
Run it yourself
SkilledDragonCorp/minilab-safety-net-secret-guard
Clone, install and run the report with no API keys. The numbers above are what that run writes.
bun install --frozen-lockfile && bun run reportSkilledDragon is not affiliated with cc-safety-net or its authors. Numbers are from our own keyless lab run; re-run the report before relying on them. Marks belong to their owners.
All labs