Claude Code, Skill
carrel
carrel, a skill listed in the PlugVet directory.
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.
deploy.sh, line 96
code="$(curl -sS -o /dev/null -m "${2:-6}" -w '%{http_code}' "$1" 2>/dev/null || true)"
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
app/kb_pipeline/cli.py, line 730
shutil.rmtree(cache_dir)
app/kb_pipeline/maintenance.py, line 549
shutil.rmtree(work, ignore_errors=True)
app/kb_pipeline/maintenance.py, line 687
shutil.rmtree(cache_dir, ignore_errors=True)
Show more
app/kb_pipeline/maintenance.py, line 1477
shutil.rmtree(path, ignore_errors=True)
app/kb_pipeline/maintenance.py, line 1551
shutil.rmtree(path, ignore_errors=True)
app/kb_pipeline/maintenance.py, line 1668
output = subprocess.check_output(["ps", "axo", "pid=,command="], text=True, stderr=subprocess.DEVNULL)
app/kb_pipeline/graph/build.py, line 1828
shutil.rmtree(version_dir, ignore_errors=True)
app/kb_pipeline/graph/build.py, line 1839
shutil.rmtree(version_dir, ignore_errors=True)
app/kb_pipeline/graph/build.py, line 1937
done = subprocess.run(cmd, capture_output=True, text=True, timeout=3)
app/kb_pipeline/graph/compile.py, line 660
shutil.rmtree(out_dir)
app/kb_pipeline/pipeline/worker.py, line 364
proc = subprocess.run(
app/kb_server/service.py, line 88
proc = subprocess.run(
app/kb_server/service.py, line 104
subprocess.Popen(
app/kb_server/service.py, line 1403
proc = subprocess.Popen(
app/kb_server/service.py, line 1410
proc = subprocess.Popen(
app/kb_server/service.py, line 2394
subprocess.Popen(
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
deploy.sh, line 96
code="$(curl -sS -o /dev/null -m "${2:-6}" -w '%{http_code}' "$1" 2>/dev/null || true)"
deploy.sh, line 410
have curl || die "curl is required"
deploy.sh, line 438
if curl -sS -m 5 "$url/api/health" >/dev/null 2>&1; then
Show more
deploy.sh, line 439
log "console health ($url/api/health):"; curl -sS -m 5 "$url/api/health"; echo
app/kb_pipeline/cli.py, line 558
os_health = requests.get(
app/kb_pipeline/cli.py, line 577
response = requests.get(f"{root}/health", timeout=5)
app/kb_pipeline/limits.py, line 36
data = requests.get(f"{base}/models", timeout=5).json()
app/kb_search/channels.py, line 325
resp = requests.post(f"{settings.visual_embedding_base_url.rstrip('/')}/embeddings", json=body, headers=headers, timeout=timeout,
app/kb_server/main.py, line 57
(kb_id is a sequential number and can be enumerated). Requests without Origin/Referer (curl /
deployment/compose/docker-compose.yml, line 358
- "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health', timeout=5).read()"
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
deploy.sh, line 12
# the systemd units and the compose .env
deploy.sh, line 27
# Re-running `up` is safe: existing .env and config/knowledge-base.env are
deploy.sh, line 34
COMPOSE_ENV="$COMPOSE_DIR/.env"
Show more
deploy.sh, line 186
# ── compose .env ───────────────────────────────────────────────────────────
deploy.sh, line 208
cp "$COMPOSE_DIR/.env.example" "$COMPOSE_ENV"
deploy.sh, line 252
warn "NEO4J_PASSWORD in $APP_ENV differs from the compose .env; fix one of them if Neo4j refuses connections"
app/kb_pipeline/cli.py, line 1312
parser.add_argument("--env-file", default=None, help="Path to .env file")
app/kb_pipeline/cli.py, line 1472
backup), the pipeline env, deployment/*/.env and the evaluation sets; keep the newes
app/kb_pipeline/config.py, line 128
qdrant_key = os.getenv("QDRANT_API_KEY")
app/kb_pipeline/config.py, line 131
neo4j_password = os.getenv("NEO4J_PASSWORD")
app/kb_pipeline/config.py, line 164
embedding_api_key=os.getenv("EMBEDDING_API_KEY", ""),
app/kb_pipeline/config.py, line 168
visual_embedding_api_key=os.getenv("VISUAL_EMBEDDING_API_KEY", "local"),
app/kb_pipeline/config.py, line 176
reranker_api_key=os.getenv("RERANKER_API_KEY", "").strip(),
app/kb_pipeline/config.py, line 181
vlm_api_key=os.getenv("VLM_API_KEY", ""),
app/kb_pipeline/config.py, line 189
vlm_max_tokens=int(os.getenv("VLM_MAX_TOKENS", "4096")),
app/kb_pipeline/utils.py, line 120
cache_dir = os.getenv("TIKTOKEN_CACHE_DIR") or os.getenv("DATA_GYM_CACHE_DIR") or "the system temp directory"
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
app/tests/test_graph_build.py, line 1
"""Graph build flow: phases and resume, fingerprints, locks, incremental append, artifacts and records."""
app/tests/test_graph_extract.py, line 1
"""Extraction and entity resolution: unit splitting, output parsing, merging, sameness judgement, noise reduction,
app/tests/test_parsers.py, line 1
"""Parsing layer: parse results and merge rules for MinerU / native tables / HTML / images with VLM
Show more
app/tests/test_search.py, line 1
"""Local regressions for the search service (kb_search): fusion, cleaning, dedupe, routing, orchestration and
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 3a23da0463ba. 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: 3a23da0463baab2a8558abf8a8579cbb15a2e824
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.