Claude Code, Skill
Agnostic Ai
One harness.
Compatibility: Not stated.
Grade B
Minor issues only, no Medium or High. Worth a quick look at the findings below before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
PERMISSION_DELETE_FILES NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST SECRETS_PATH_DOTENV SECRETS_ENV_READ OBFUSCATION_FILE_CAP_REACHED
Why this grade
- PERMISSION_DELETE_FILES Low
Contains a call that can delete files.
engine/harness/bundle.cjs, line 194
else if (fs.existsSync(path.join(dir, 'identity.md'))) fs.unlinkSync(path.join(dir, 'identity.md')); - NETWORK_NO_FIXED_HOST Low
Makes a network call whose host is not written as a fixed address.
engine/hooks/declick-nudge.cjs, line 78
+ 'and `curl -s <url> | grep -c <text>` answers "does the page say X", both at a fraction of a ' - NETWORK_UNNAMED_HOST Low
Calls a fixed host that the description does not name.
engine/hooks/declick-nudge.cjs, line 78
+ 'and `curl -s <url> | grep -c <text>` answers "does the page say X", both at a fraction of a ' - SECRETS_PATH_DOTENV Low
Mentions a .env file.
engine/context/select.cjs, line 90
// a shell command (PreToolUse Bash/PowerShell): substring match, case-insensitive, so ".env", "sitemap", "settings.json" fire - SECRETS_ENV_READ Note
Reads an environment variable whose name contains KEY, SECRET, TOKEN, PASSWORD or CREDENTIAL.
engine/hooks/dashclaw-setup.cjs, line 129
if (process.env.DASHCLAW_BASE_URL || process.env.DASHCLAW_API_KEY) { - OBFUSCATION_FILE_CAP_REACHED Note
The 400 file cap was reached before every file was read.
tools/gates/gate-manifest.json, line 1
{
Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.
Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.
What was checked
Plain notes from the hygiene checks.
Permissions
Concern
can delete files.
PERMISSION_DELETE_FILES
engine/harness/bundle.cjs, line 194
else if (fs.existsSync(path.join(dir, 'identity.md'))) fs.unlinkSync(path.join(dir, 'identity.md'));
engine/harness/bundle.cjs, line 201
fs.rmSync(subdir, { recursive: true, force: true });
engine/harness/common.cjs, line 265
if (current) fs.rmSync(dest, { recursive: true, force: true });
Show more
engine/harness/common.cjs, line 283
fs.rmSync(dest, { recursive: true, force: true });
engine/harness/targets/codex.cjs, line 540
fs.rmSync(dest, { recursive: true, force: true });
engine/harness/targets/codex.cjs, line 636
fs.unlinkSync(file);
engine/harness/targets/codex.cjs, line 684
fs.unlinkSync(file);
engine/harness/targets/codex.cjs, line 811
fs.unlinkSync(file);
engine/hooks/sync-main-checkout.py, line 35
return subprocess.run(
labs/claude-mods/experiments/jev/run_judge.py, line 119
r = subprocess.run(
tools/ears/ears.py, line 170
return subprocess.run(
docs/guards.md, line 52
`iex`, and `Invoke-Expression` carrying `-Name`, because a dynamic invocation
tools/gitradar/README.md, line 38
Run via `child_process.spawnSync('git', ['-C', repoPath, ...args])` - always
Install and update
Pass
No install-time script found, and dependencies are pinned or absent.
Network
Concern
can reach a host that is not written as a fixed address. can reach api.typesafe.ai. The description does not name that host.
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
engine/hooks/declick-nudge.cjs, line 78
+ 'and `curl -s <url> | grep -c <text>` answers "does the page say X", both at a fraction of a '
engine/hooks/slopsquat-guard.cjs, line 82
const r = await fetch(url, { signal: ctl.signal, headers: { 'user-agent': 'slopsquat-guard/1 (agnostic-ai hook)', accept: 'application/json' } });
engine/hooks/tool-output-secret-watch.cjs, line 18
* other route: a `cat` of the wrong file, a curl that echoes a token, a test
Show more
engine/mods/claude-runtime/hooks/index.ts, line 85
const res = await $.http.fetch("https://api.typesafe.ai/v1/systemone",
tools/dashboard/dashboard.cjs, line 39
const req = http.request(
tools/errorlog/daily.cjs, line 209
fetch('/save', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(collect(skipped)) })
tools/errorlog/daily.cjs, line 312
http.get({ host: '127.0.0.1', port: PORT, path: '/', timeout: 2000 }, (r) => {
tools/dashboard/dashboard.html, line 1793
const res = await fetch('/api/overview');
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
engine/context/select.cjs, line 90
// a shell command (PreToolUse Bash/PowerShell): substring match, case-insensitive, so ".env", "sitemap", "settings.json" fire
engine/harness/bundle.cjs, line 83
for (const [k, v] of Object.entries(s.env || {})) if (looksSecret(k, v)) problems.push(`mcp.${name}.env.${k} looks like a secret; capture must replace it with \${${k}}`);
engine/hooks/dashclaw-setup.cjs, line 129
if (process.env.DASHCLAW_BASE_URL || process.env.DASHCLAW_API_KEY) {
Show more
engine/hooks/creds-resolve.cjs, line 1
// SessionStart: if the project has .env.example, fill .env from the local
engine/hooks/creds-resolve.cjs, line 10
, or account, run `creds resolve` (fills .env from keys already on this machine) and
engine/hooks/creds-resolve.cjs, line 11
if (fs.existsSync(path.join(cwd, ".env.example"))) {
engine/hooks/dashclaw-setup.cjs, line 133
apiKey: process.env.DASHCLAW_API_KEY || null,
engine/hooks/secret-guard.cjs, line 13
* - Bash -> scans tool_input.command (e.g. "git add .env", inline exports)
engine/hooks/secret-guard.cjs, line 21
* - Real env files (.env, .env.local, .env.<anything-but-example>) ALLOW: secrets
engine/hooks/secret-guard.cjs, line 129
// .env, .env.local, .env.<x> are allowed; .env.example/.sample/.template are scanned.
labs/claude-mods/experiments/jev/run_jev.py, line 17
TOKEN_CAP = int(os.environ.get("JEV_TOKEN_CAP", "60000"))
labs/claude-mods/experiments/jev/run_jev.py, line 31
if not os.environ.get("TYPESAFE_API_KEY"):
labs/claude-mods/experiments/jev/run_judge.py, line 22
TOKEN_CAP = int(os.environ.get("JEV_TOKEN_CAP", "60000"))
labs/claude-mods/experiments/jev/run_judge.py, line 41
if not os.environ.get("TYPESAFE_API_KEY"):
labs/claude-mods/experiments/jev/run_suggest.py, line 89
if not os.environ.get("TYPESAFE_API_KEY"):
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Note
the file cap was reached before every file was read.
OBFUSCATION_FILE_CAP_REACHED
tools/gates/gate-manifest.json, line 1
{
Licence
Pass
A licence file is present (LICENSE).
Maintainer activity
Pass
The latest commit is within the last 365 days.
Note
Hygiene check of commit aab09ff0d953. can delete files. can reach a host that is not written as a fixed address. can reach api.typesafe.ai. The description does not name that host. reads a credential or environment file. the file cap was reached before every file was read.
Date and source
Date checked:
github.com
Commit graded: aab09ff0d9533967045e7f2b04e478ec4e05528e
This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.