Codex, Plugin
Spec Flow
Approve one design doc; the agent builds it, tests it for real and opens the PR.
Compatibility: Not stated.
Grade C
One Medium finding. Read the report before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
NETWORK_HOST_FROM_INPUT
Why this grade
- NETWORK_HOST_FROM_INPUT Medium
A file takes a URL or endpoint as input and has no fixed host list.
lib/headless-fallback-provider.cjs, line 176
// so that module-level code never touches fetch (FR-010).
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
adapters/codex/runtime/hook.cjs, line 61
} finally { fs.rmSync(temp, { recursive: true, force: true }); }
bin/flow-tools.cjs, line 534
try { fs.unlinkSync(p); } catch (e) { return err(`DELETE_FAILED: ${e.message}`); }
lib/models-shim.cjs, line 106
try { fs.unlinkSync(tmpFile); } catch (_) {} // ignore cleanup error
Show more
scripts/build-codex.cjs, line 52
fs.rmSync(dest, { recursive: true, force: true });
skills/manual-test/scripts/checklist_lib/auth.py, line 33
out = subprocess.check_output(cmd, stderr=subprocess.DEVNULL).decode().strip()
skills/manual-test/scripts/checklist_lib/http.py, line 34
raw = subprocess.run(cmd, capture_output=True, text=True,
skills/manual-test/scripts/checklist_lib/kafka.py, line 19
out = subprocess.check_output(["docker", "ps", "-qf", "name=kafka"],
skills/manual-test/scripts/checklist_lib/kafka.py, line 47
subprocess.run(cmd, input=payload.encode(), capture_output=True, check=True)
skills/manual-test/scripts/checklist_lib/kafka.py, line 71
out = subprocess.check_output(
skills/manual-test/scripts/checklist_lib/kafka.py, line 94
out = subprocess.run(
skills/manual-test/scripts/checklist_lib/kafka.py, line 105
out = subprocess.run(
skills/manual-test/scripts/checklist_lib/setup.py, line 190
proc = subprocess.run(cmd, shell=True, capture_output=True, text=True)
Install and update
Pass
No install-time script found, and dependencies are pinned or absent.
Network
Serious
accepts a host from input, with no fixed list in this file.
NETWORK_HOST_FROM_INPUT
lib/headless-fallback-provider.cjs, line 176
// so that module-level code never touches fetch (FR-010).
lib/headless-fallback-provider.cjs, line 177
const response = await fetch(url, {
skills/manual-test/SKILL.md, line 36
# Ad-hoc curl is NOT a substitute - add a test instead.
Show more
skills/manual-test/SKILL.md, line 97
5. TRIGGER → CHECKLIST.yaml request blocks → curl OR scripts/produce-event.sh
skills/manual-test/SKILL.md, line 155
curl -sS -o /dev/null -w "HTTP=%{http_code}\n" \
skills/manual-test/SKILL.md, line 172
curl -s http://localhost:PORT/api/v1/... -H "X-Userinfo: $TOKEN"
skills/manual-test/SKILL.md, line 181
curl -s http://localhost:PORT/bo/api/v1/... -H "Authorization: Bearer $JWT"
skills/manual-test/SKILL.md, line 196
JWT=$(curl -sf -X POST http://localhost:PORT/api/v1/auth/login \
skills/manual-test/SKILL.md, line 204
curl -s http://localhost:PORT/api/v1/... -H "Authorization: Bearer $JWT"
skills/manual-test/references/auth-jwt-basic.md, line 31
JWT=$(curl -sf -X POST http://localhost:PORT/api/v1/auth/login \
skills/manual-test/references/auth-jwt-basic.md, line 37
curl -s http://localhost:PORT/api/v1/... -H "Authorization: Bearer $JWT"
skills/manual-test/references/auth-jwt-basic.md, line 50
curl -s http://localhost:PORT/api/v1/... -H "Authorization: Bearer $JWT"
skills/manual-test/references/auth-jwt-basic.md, line 59
JWT=$(curl -sf -X POST "https://<tenant>.auth0.com/oauth/token" \
skills/manual-test/references/auth-jwt-basic.md, line 87
curl -s http://localhost:PORT/api/v1/... -H "Authorization: Bearer $JWT"
skills/manual-test/references/auth-jwt-basic.md, line 135
curl -sS -o /dev/null -w "HTTP=%{http_code}\n" \
skills/manual-test/references/auth-jwt-basic.md, line 141
curl -sS -o /dev/null -w "HTTP=%{http_code}\n" \
skills/manual-test/references/patterns.md, line 10
curl -s ... -d '{"amount": <limit_minus_1>}' # just under → pass
skills/manual-test/references/patterns.md, line 11
curl -s ... -d '{"amount": <limit>}' # at limit → pass or fail (business rule)
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
bin/flow-tools.cjs, line 2324
// with no matching key in env/.env will fail (or silently no-op as "fallback")
bin/flow-tools.cjs, line 2348
// Approximate what the CLI subprocess will see: process env + a hand-parsed .env
bin/flow-tools.cjs, line 2351
const envPath = path.join(process.cwd(), '.env');
Show more
bin/flow-tools.cjs, line 2368
eds ${requiredKey} - not found in env or .env. This role will fail at the first AI op
skills/manual-test/SKILL.md, line 89
scripts/db-creds.sh (auto-discover PG/Redis creds; yml for Spring, .env for others)
skills/manual-test/references/auth-jwt-basic.md, line 71
grep -E "secret:|hmac|HS256|signing-key" src/main/resources/application.yml .env 2>/dev/null
skills/manual-test/references/auth.md, line 41
# 1a. Check .env flag (informational only - NOT authoritative)
skills/manual-test/references/auth.md, line 42
grep "GROUP_ROLE_AUTHORIZATION_ENABLED" .env
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Note
a file was over the read cap and was not fully read.
OBFUSCATION_FILE_OVER_READ_CAP
test/flow-tools.test.cjs, 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 12064d26996c. can delete files. accepts a host from input, with no fixed list in this file. reads a credential or environment file. a file was over the read cap and was not fully read.
Date and source
Date checked:
github.com
Commit graded: 12064d26996c9ab3046d58fa1b36d74f08a18fcf
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.