Claude Code, Skill
hydraia
A self-contained agentic development harness for Claude Code.
Compatibility: Not stated.
Grade D
Two or more Medium findings, or a High finding. Only try it in a sandbox.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Rescanned at commit 77532682f27f, unchanged since the check below.
OBFUSCATION_ENCODED_BLOB OBFUSCATION_MINIFIED_PAYLOAD
Why this grade
- OBFUSCATION_ENCODED_BLOB Medium
Contains a long base64 shaped string in a file that should be readable.
skills/explainme/assets/template.html, line 1
<!DOCTYPE html> - OBFUSCATION_MINIFIED_PAYLOAD Medium
Contains a very long line with almost no spaces in a script or style file.
skills/explainme/assets/template.html, line 1
<!DOCTYPE html>
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
hooks/baseline.sh, line 51
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, start_new_session=True)
skills/brainstorming/scripts/server.cjs, line 604
if (fs.existsSync(eventsFile)) fs.unlinkSync(eventsFile);
skills/brainstorming/scripts/server.cjs, line 619
if (fs.existsSync(infoFile)) fs.unlinkSync(infoFile);
Show more
skills/design-system/scripts/slide-token-validator.py, line 30
result = subprocess.run(cmd)
skills/explainme/bin/archify.mjs, line 397
fs.rmSync(item.target, { force: true });
skills/explainme/bin/archify.mjs, line 404
if (fs.existsSync(item.target)) fs.rmSync(item.target, { force: true });
skills/explainme/bin/archify.mjs, line 735
fs.rmSync(stagingDirectory, { recursive: true, force: true });
skills/explainme/bin/archify.mjs, line 1187
fs.rmSync(stagingDirectory, { recursive: true, force: true });
skills/explainme/bin/archify.mjs, line 1881
fs.rmSync(stagingDirectory, { recursive: true, force: true });
skills/explainme/bin/archify.mjs, line 2020
fs.rmSync(tmp, { recursive: true, force: true });
skills/ui-styling/scripts/shadcn_add.py, line 126
result = subprocess.run(
skills/ui-styling/scripts/shadcn_add.py, line 172
result = subprocess.run(
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 kit.svel. The description does not name that host.
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
agents/performance-optimizer.md, line 241
const data = await fetch(url).then(r => r.json());
hooks/preflight.sh, line 76
if command -v curl >/dev/null 2>&1 && [ $(( now - lts )) -ge "$STALE_SECS" ]; then
hooks/preflight.sh, line 77
remote_ver=$(curl -fsSL --max-time 3 "$VERSION_URL" 2>/dev/null | _hy_ver)
Show more
skills/brainstorming/scripts/helper.js, line 80
ws = new WebSocket(websocketUrl());
skills/coding-standards/SKILL.md, line 118
const response = await fetch(url)
skills/coding-standards/SKILL.md, line 133
const response = await fetch(url)
skills/django-security/SKILL.md, line 368
fetch('/api/endpoint/', {
skills/golang-patterns/SKILL.md, line 276
data, _ := fetch(url)
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
agents/code-reviewer.md, line 267
Fix: Move to environment variable and add to .gitignore/.env.example
agents/code-reviewer.md, line 270
const apiKey = process.env.API_KEY; // GOOD
hooks/blastgate.sh, line 73
default = [".env",".env.*","**/secrets/**","**/credentials/**","**/*_key*","**/*_secret*",
Show more
skills/brainstorming/scripts/server.cjs, line 123
const TOKEN_FILE = process.env.BRAINSTORM_TOKEN_FILE || null;
skills/brainstorming/scripts/server.cjs, line 133
if (process.env.BRAINSTORM_TOKEN) {
skills/brainstorming/scripts/server.cjs, line 134
return { value: process.env.BRAINSTORM_TOKEN, source: 'env' };
skills/design/scripts/cip/generate.py, line 70
"""Load environment variables from .env files"""
skills/design/scripts/cip/generate.py, line 72
Path(__file__).parent.parent.parent / ".env",
skills/design/scripts/cip/generate.py, line 73
Path.home() / ".claude" / "skills" / ".env",
skills/design/scripts/cip/generate.py, line 74
Path.home() / ".claude" / ".env"
skills/design/scripts/cip/generate.py, line 212
api_key = os.environ.get("GEMINI_API_KEY") or os.environ.get("GOOGLE_API_KEY")
skills/design/scripts/icon/generate.py, line 28
"""Load .env files in priority order"""
skills/design/scripts/icon/generate.py, line 30
Path(__file__).parent.parent.parent / ".env",
skills/design/scripts/icon/generate.py, line 56
GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
skills/design/scripts/logo/generate.py, line 59
GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
skills/django-security/SKILL.md, line 50
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY')
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Concern
contains a minified payload. contains an encoded blob in a file that should be readable.
OBFUSCATION_ENCODED_BLOB OBFUSCATION_MINIFIED_PAYLOAD
skills/explainme/assets/template.html, line 1
<!DOCTYPE html>
skills/explainme/delta/architecture-delta.mjs, line 720
.review-strip{display:grid;grid-template-columns:auto auto auto auto minmax(0,1fr);align-items:center;gap:5px;margin:0 0 10px;padding:7px 8px;border-block:1px solid var(--d-line);f
skills/explainme/delta/architecture-delta.mjs, line 721
.canvas{overflow:hidden;border:1px solid var(--d-line);border-radius:10px;background:#09141e;padding:12px;min-height:520px}.canvas svg{display:block;width:100%;height:auto;max-heig
Show more
skills/explainme/delta/architecture-delta.mjs, line 722
rect[data-graph-role="structural-frame"][data-delta-state="added"]{stroke:var(--d-add)!important;stroke-width:2.5!important}rect[data-graph-role="structural-frame"][data-delta-stat
skills/explainme/delta/architecture-delta.mjs, line 724
html[data-theme="dark"] body{background:#071019!important;background-image:none!important}html[data-theme="light"]{color-scheme:light;--d-ink:#10283c;--d-muted:#587187;--d-line:#c8
skills/explainme/delta/architecture-delta.mjs, line 725
@media(max-width:760px){.proof-page{width:100%;padding:12px}.proof-head{grid-template-columns:1fr;gap:14px;align-items:start}.proof-head h1{font-size:32px}.metrics{display:grid;gri
skills/explainme/delta/architecture-delta.mjs, line 726
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important}.canvas[data-delta-review-active] [data-delta-review-current]{transition:none!important}}@media print{body{mi
skills/explainme/renderers/shared/generated-brand-marks.mjs, line 1085
"path": "M11.998,24c-0.321,0-0.641-0.084-0.922-0.247l-2.936-1.737c-0.438-0.245-0.224-0.332-0.08-0.383 c0.585-0.203,0.703-0.25,1.328-0.604c0.065-0.037,0.151-0.023,0.218,0.017l2.256,
skills/explainme/renderers/shared/generated-brand-marks.mjs, line 1362
"path": "M14.25.18l.9.2.73.26.59.3.45.32.34.34.25.34.16.33.1.3.04.26.02.2-.01.13V8.5l-.05.63-.13.55-.21.46-.26.38-.3.31-.33.25-.35.19-.35.14-.33.1-.3.07-.26.04-.21.02H8.77l-.69.05-
skills/explainme/renderers/shared/generated-validators.mjs, line 1
// Generated by scripts/generate-validators.mjs. Do not edit by hand.
skills/ui-styling/canvas-fonts/BricolageGrotesque-Bold.ttf, line 1