Why use it: Agent Skill is instructions that your agent will follow — it can tell the agent to run arbitrary code, install packages, call the network, modify files. This repo accepts community contributions and openly says it does not guarantee everything has been reviewed. This is a mandatory step before 01. What it produces: an install/no-install decision for each skill, based on the skill's content + the repo's scan report + (optionally) a local scan of your own.
Step 1 — Read SKILL.md without installing
# render SKILL.md trong terminal, không ghi file nào
gh skill preview K-Dense-AI/scientific-agent-skills literature-review
# ghim một version cụ thể để đọc
gh skill preview K-Dense-AI/scientific-agent-skills literature-review@v2.66.0
Run interactively, gh skill preview also provides a picker to browse more scripts/, references/. This is where you need to look closely: a bad skill is rarely bad in SKILL.md, it is bad in scripts/.
If you need to read with the shell (grep, diff), clone read-only and inspect:
git clone --depth 1 https://github.com/K-Dense-AI/scientific-agent-skills.git /tmp/sas
cd /tmp/sas
# skill này chạm mạng ở đâu, gọi shell ở đâu
grep -rnE 'requests\.|urlopen|subprocess|os\.system|curl |wget ' skills/literature-review/
# skill này đòi biến môi trường nào
grep -rn 'environ\|getenv\|API_KEY' skills/literature-review/
Step 2 — Check the repo's scan report
The repo runs Cisco AI Defense Skill Scanner weekly (cron Monday 09:00 UTC, .github/workflows/security-scan.yml), incremental scanning — unchanged skills carry over old results; a full rescan at least every 30 days or when the scanner/model changes.
- Human-readable:
docs/security-report.md - Machine-readable (with
last_scannedper skill):docs/security-report.json
Total in scan 2026-08-31 (read from docs/security-report.json → totals):
163 skill · 988 finding · CRITICAL 34 · HIGH 9 · MEDIUM 241 · LOW 703 · INFO 1
skill "an toàn": 147/163
16 skills currently carrying a CRITICAL or HIGH finding — extracted from the field max_severity in the JSON, not from the summary table:
| Level | Skill | Number of findings |
|---|---|---|
| CRITICAL | autoskill |
13 |
| CRITICAL | citation-management |
11 |
| CRITICAL | consciousness-council |
5 |
| CRITICAL | infographics |
9 |
| CRITICAL | latex-posters |
9 |
| CRITICAL | literature-review |
10 |
| CRITICAL | pacsomatic |
5 |
| CRITICAL | research-lookup |
8 |
| CRITICAL | scientific-schematics |
9 |
| CRITICAL | scientific-slides |
15 |
| CRITICAL | xlsx |
3 |
| HIGH | geomaster |
7 |
| HIGH | ginkgo-cloud-lab |
3 |
| HIGH | histolab |
4 |
| HIGH | modal |
7 |
| HIGH | waypoint-bio |
5 |
Regenerate this table yourself on a newer version:
python3 - <<'PY'
import json
d = json.load(open("docs/security-report.json"))
for s in sorted(d["skills"], key=lambda s: s["name"]):
if (s.get("max_severity") or "").upper() in ("CRITICAL", "HIGH"):
print(f'{s["max_severity"]:8} {s["name"]:28} {len(s["findings"])} findings last_scanned={s["last_scanned"]}')
print(d["totals"])
PY
A finding does not mean malicious. Main AGENTS.md itself lists the systematic false positives: BEHAVIOR_*_EXFILTRATION and BEHAVIOR_ENV_VAR_HARVESTING fire on any skill that reads its own API key of its own and then calls its own service of its own; MDBLOCK_PYTHON_SUBPROCESS fires on every subprocess, including the safe argument-list form; *_EVAL_EXEC fires on substrings in ordinary identifiers (retrieval, executor) or model.eval(). Use the table above to decide which skill to read carefully, not to convict.
Step 3 — Scan locally yourself (when you need your own evidence)
uv pip install cisco-ai-skill-scanner
skill-scanner scan /path/to/skill --use-behavioral
Or use the repo's wrapper — it adds PR comment formatting and a blocking threshold:
# cần SKILL_SCANNER_LLM_API_KEY (đọc từ .env qua python-dotenv)
uv run python scan_pr_skills.py skills/literature-review --fail-on HIGH
Exit code of scan_pr_skills.py — read from source, don't guess:
| Exit | Meaning | Source |
|---|---|---|
0 |
no valid skill dir → writes a no-op comment | scan_pr_skills.py:229 |
0 |
missing SKILL_SCANNER_LLM_API_KEY → fail open, skip scanning (same as a PR from a fork) |
scan_pr_skills.py:240 |
1 |
has findings at level --fail-on or above |
scan_pr_skills.py:265 |
0 |
scan complete, below threshold | scan_pr_skills.py:267 |
Two details that are easy to fall for:
- By default
--fail-onisCRITICAL, but the repo's CI passes--fail-on HIGH(.github/workflows/pr-skill-scan.yml:87). If you run it manually and want to match CI, you have to pass it yourself. - Missing API key returns 0, not an error. If you plug this command into your own gate, exit 0 does not prove a scan happened. Check stdout too, or ensure the environment variable exists.
--fail-on accepts: CRITICAL, HIGH, MEDIUM, LOW, NEVER.
Step 4 — Decide what to install
Principles drawn from the repo's own recommendations, ordered by order of application:
- Don't install
--all. Install exactly the skill that serves the task at hand. - Skills written by K-Dense (
metadata.skill-author: K-Dense Inc.) have been through their internal review ; community skills are vetted at the level of "best effort, limited resources". Check the author:grep -h 'skill-author' skills/*/SKILL.md | sort | uniq -c | sort -rn | head - Skills with
scripts/deserve more scrutiny than skills with prose only. 105/163 skills carryscripts/. - Skills that declare
metadata.openclaw.envVarswill demand credentials — 25 such skills, list in 03-dung-skill-trong-agent.md. - If you see something suspicious, open an issue in the repo instead of silently removing it.
Pitfalls
docs/security-report.mdis a snapshot at scan time, not the current state. Cross-check the skill'slast_scannedagainst the date of the most recent commit touching that skill before trusting it.- Findings point to skill files that don't exist.
AGENTS.mdwarns about this situation; verify withfind skills/<name> -type fbefore "fixing". - Scanning skills is not scanning dependencies. The scanner inspects skill content; the Python packages a skill instructs you to install remain a separate attack surface.