Pre-install security review

Vet it before you install.

It doesn't judge whether a skill is useful. It answers one question first: what does this package touch before you let it run? Four steps, 14 reject-on-sight patterns, and a fixed report format — the decision is made on evidence, not on a registry label.

  • 4-step protocol
  • 14 reject patterns
  • 4 risk tiers
  • 138 lines, zero runtime deps
SKILL VETTING REPORT READ-ONLY OUTPUT
═══════════════════════════════════════
Skillwebapp-testing
Sourcegithub.com/anthropics/skills
Versionmain branch · fetched 2026-09-15
───────────────────────────────────────
METRICS:
Stars176,424 (repo-level)
Files Reviewed6 — all read in full
Install actionNot performed
───────────────────────────────────────
RED FLAGS:
1 (substantive) — no requirements.txt; the dependency is never declared
───────────────────────────────────────
PERMISSIONS NEEDED:
Filesreads and writes the working dir; examples write to /tmp/*.png (out of scope)
NetworkNone — localhost only
Commandslaunches chromium; runs subprocess with shell=True
───────────────────────────────────────
RISK LEVEL🟡 MEDIUM
VERDICT⚠️ INSTALL WITH CAUTION
───────────────────────────────────────
NOTES: not malicious — a well-formed toolkit with a missing packaging boundary. Three remediation items: declare the dependency, mention the browser binaries, fix the one typo.
═══════════════════════════════════════
live run log skill-vetter-案例02-实跑记录-en.md

↑ The report format, filled in with a real result. The panel above is the actual skill-vetter review of webapp-testing in anthropics/skills — 6 files, one substantive flag, 🟡 MEDIUM — not a mock-up. The report is the deliverable.

02 · Before / After

Same instruction. The difference is what happens before install.

The case below is one real package: webapp-testing from anthropics/skills. One prompt, one package — the only variable is whether a review runs first. Every figure is a keyword count taken from the actual files, and it can be reproduced.

Shared input · identical on both sides Install the webapp-testing skill for me.
B Without Skill Vetter
—Only the entry file is read — SKILL.md, 3,913 B, 1 of 6 files
—Playwright is named in it, so the job looks understood
—Test scripts get written and run on that basis
—How Playwright is installed: 0 mentions in the whole pack
—subprocess and shell=True: 0 hits in SKILL.md
—/tmp appears once, in a line-69 example, never flagged as a write
The failure mode — reading one file of six is enough to start, and not enough to know. Two of the three things that matter never appear in the entry file at all, and the third is there only as an example nobody labelled.
A With Skill Vetter
✓All four protocol steps walked, in order
✓6 / 6 files read before any install action
✓1 substantive red flag: the dependency is never declared
✓Files / Network / Commands listed separately — down to with_server.py:71 shell=True
✓Risk placed in one of 4 tiers: 🟡 MEDIUM
✓Verdict plus 3 remediation items in NOTES, before install
What changed — the pack stopped being a folder trusted because it is popular. Visibility went from 1 file to 6, and the decision moved from a feeling to a verdict with its reasoning attached.
DimensionWithoutWith
Files seen1 entry file (3,913 B)→6 / 6 files read in full
DependencyPlaywright named, never explained→Flagged: 0 manifests, 0 install instructions
Execution surfaceNot visible from the entry file→shell=True at with_server.py:71, assessed and reported
PermissionsUnstated→Files / Network / Commands as separate fields
Red flagsNot checked→14 patterns run — 1 substantive, every judgement recorded
OutputProse paragraph→🟡 MEDIUM · ⚠️ INSTALL WITH CAUTION + 3 NOTES

Source: the real webapp-testing files pulled from anthropics/skills (main branch) on 2026-09-15 — 6 files in total: SKILL.md, LICENSE.txt, one script and three examples. “0 hits” means a keyword search run over SKILL.md alone and over all six files separately; both are reproducible.

03 · Capability

Four steps, 14 red lines, and a report that cannot be skipped.

Every number below is a structural count, read directly from the 138-line source. There are no runtime metrics — this skill has no downloads, installs, or telemetry to report.

4
Protocol steps
source → code → scope → risk
14
Reject-on-sight patterns
listed verbatim in source
4
Risk tiers
LOW · MEDIUM · HIGH · EXTREME
138
Lines of source
0 executables · 0 dependencies
01

Source traceability

Origin, author, release, popularity, last update, and third-party reviews captured before any file is read.

5 questions · Step 1 · provenance recorded, not assumed
02

Mandatory code review

Every file in the package is read. Fourteen patterns — network egress, credential access, obfuscation, privilege escalation — trigger immediate rejection.

14 patterns · MANDATORY · no file left unopened
03

Permission scoping

What it reads, what it writes, what it executes, where it connects — and whether that scope is minimal for the stated purpose.

5 checks · minimality judged against stated purpose
04

Risk classification

Four tiers, each bound to a required action — from basic review to human approval to an outright refusal.

4 tiers · action attached to every level
05

Fixed report format

A constant skeleton: identity, metrics, red flags, permissions, risk level, verdict, notes. Fields cannot be silently dropped.

7 field groups · verdict is mandatory
06

Trust hierarchy

Scrutiny scales with provenance: official skills get less, unknown sources get maximum, anything requesting credentials gets a human.

5 levels · credentials always require human approval

Risk tiers and the action each one forces

🟢 LOWNotes, weather, formattingBasic review · install OK
🟡 MEDIUMFile ops, browser, APIsFull code review required
🔴 HIGHCredentials, trading, systemHuman approval required
⛔ EXTREMESecurity configs, root accessDo NOT install
The verdict line offers 3 outcomes — SAFE TO INSTALL / INSTALL WITH CAUTION / DO NOT INSTALL — which are not a one-to-one mapping of the 4 tiers. A package can be 🟢 LOW and still warrant caution; that gap is where the residual risk lives.

What the 14 patterns actually look for

Egresscurl / wget to unknown URLs · IP-based calls · data sent out
Credentialstokens, API keys, ~/.ssh, ~/.aws, cookies, credential files
Identity filesMEMORY.md · USER.md · SOUL.md · IDENTITY.md
Executioneval / exec on external input · base64 decode · sudo
Concealmentobfuscated or minified code · unlisted package installs · writes outside workspace
These are static text patterns, not behavioural analysis. A pattern present in the source is caught; an equivalent behaviour assembled at runtime is not.
04 · Workflow

Four steps, then and only then: install or don't.

The protocol is sequential. Step 2 is marked mandatory in the source — a review that skips the file read is not a review.

01

Source Check

Establish provenance: where it came from, who published it, how widely it is used, when it last changed, what others reported.

5 questions · provenance recorded before files are opened
02

Code Review

Read all files. Match against the 14 reject patterns — egress, credentials, identity files, dynamic execution, concealment.

14 patterns · any hit = reject immediately
03

Permission Scope

Enumerate reads, writes, commands, and network endpoints. Judge whether the scope is minimal for the stated purpose.

5 checks · minimality is the test
04

Risk Classification

Assign a tier, bind it to the required action, emit the fixed report, and state a verdict the user can act on.

4 tiers · verdict field is mandatory
SOURCE REVIEW SCOPE RISK
Important boundary

This protocol answers "what does this package touch, and is that acceptable?" — not "does it do its job well?" A package that passes can still be useless; a package that fails on a pattern is rejected regardless of how useful it looks. Review quality also depends on the reviewing agent actually opening every file — the skill guides the review, it does not execute a scanner.

05 · Real cases

A real package, with the evidence kept.

Three packages, vetted with the same four-step protocol: a documentation-only ruleset, a pack with a real execution surface, and a 70-file reference pack with no executable code at all. Each was run separately in English — none of these is a translation of the Chinese run. Every figure, hash and line reference can be checked in the run logs.

Case 01 · Baseline / most common  BRAND-GUIDELINES · GITHUB  2026-09-15  English run · not a translation

Two files, 274 lines, and nothing to run.

The shape most skills take: a pure specification with no executable surface at all. Reviewing it proves the opposite of a scare story — a package can be judged low-risk without being waved through, because the full read is still the work.

Review outcome
🟢 LOW · ✅ safe to install
0 substantive red flags · 2 files read in full
All 14 red-flag patterns were run against both files. Two produced surface matches, both inside the Apache 2.0 licence boilerplate, and both were read line by line before being dismissed. A low rating is not a shortcut — it is a result.
01 Input — the request

Verbatim, with the read-only constraint stated up front and no hint of the expected answer.

Prompt · verbatim Use skill-vetter to vet this skill. Walk all four steps of the protocol, then output the report in the exact SKILL VETTING REPORT format defined in its SKILL.md.

Target: https://github.com/anthropics/skills/tree/main/skills/brand-guidelines
Read every file under that directory before you judge. Read-only — do not install it, do not execute anything in it.
Target identity
brand-guidelines — Anthropic's official brand colour and type specification. A colour table and a type spec, applied by whichever model loads it.
Author: anthropicsVersion: not declared2 files
Observed packageValue
Files reviewed2 — both read in full
Size13,580 B / 274 lines
Executable contentNone — 0 code fences, 0 scripts
Repo stars176,424 (anthropics/skills)
Last updated2026-09-10
02 Inspection — what the four steps surfaced

Provenance, contents, access, and the one judgement call the pattern list could not make on its own.

Source
Tier 1–2 trust

Anthropic's official organisation account, 176,424 stars. Lower scrutiny was permitted — but both files were still read in full.

Contents
Specification only

SKILL.md is 2,235 B / 73 lines: a colour table of 4 base + 3 accent hex values and a type spec (Poppins headings, Lora body, Arial/Georgia fallbacks). The other file is Apache 2.0.

Access
None requested

Files, Network and Commands are all empty. There is nothing for the pack to be granted — everything it does happens inside the model that loads it.

The judgement call
Naming ≠ depending

The library python-pptx is named once (SKILL.md:72) as the mechanism for applying colour. It is never imported and never installed — so it is not a dependency finding. Case 02 is where the same word becomes a real flag.

03 Output — the report
SKILL VETTING REPORT · BRAND-GUIDELINES🟢 LOW
RED FLAGSNone — 0 substantive across all 14 patterns
SOURCEGitHub · author anthropics
METRICS176,424 stars · last updated 2026-09-10 · 2 files reviewed
PERMISSIONSNone — Files / Network / Commands all empty
RECOMMENDATION✅ safe to install; there is no executable surface to review
CLASSIFICATIONLow
04 Run evidence
2/2
files read in full
274
lines reviewed
14
red-flag patterns run
0
substantive hits
0
executable files
3
screenshots archived
Evidence recorded — live run log: skill-vetter-案例01-实跑记录-en.md · screenshots 案例素材/skill-vetter/01基础-英文/shot-b-对话-01…03.png · LICENSE.txt sha256 bc6b3af2f331cbc7fb0da1344efb2cbe5877a31498b4d70dbc7000f3405a1362 · read-only, nothing installed or executed

Screenshots captured from the live run — click any frame to open it at full size.

Run · 01 — English prompt verbatim, app-reported 2m55s, and the METRICS block.
Run · 01 — English prompt verbatim, app-reported 2m55s, and the METRICS block.
Run · 02 — RED FLAGS: the two dismissed substrings, and why the font “install” mentions were not a hit.
Run · 02 — RED FLAGS: the two dismissed substrings, and why the font “install” mentions were not a hit.
Run · 03 — RISK LEVEL 🟢 LOW · VERDICT ✅ SAFE TO INSTALL · NOTES 1–5.
Run · 03 — RISK LEVEL 🟢 LOW · VERDICT ✅ SAFE TO INSTALL · NOTES 1–5.
Honesty boundary

With no executable surface, this is a completeness claim about documents rather than about behaviour. Two substring patterns matched Apache licence boilerplate — http:// inside the licence URL, and auth inside "authorized"/"authorship" — and were dismissed only after each line was read in context. That is the one place judgement, not a pattern, decided the outcome.

SKILL VETTER · CASE 01 · BRAND-GUIDELINES · 0 SUBSTANTIVE RED FLAGS · READ-ONLY, NOTHING EXECUTED
Case 02 · Highest core value  WEBAPP-TESTING · GITHUB  2026-09-15  English run · not a translation

The only target here that actually executes.

Six files, all read in full. The pack imports Playwright in four of them — and never once tells you to install it. The single substantive red flag is not exotic; it is a missing sentence.

Review outcome
🔴 HIGH · ⚠️ install only with approval
1 substantive red flag · 0 executable-free
Four of six files import playwright.sync_api, and no manifest of any convention exists in the pack — requirements.txt, pyproject.toml, setup.py, Pipfile, environment.yml, package.json: all absent. Grepping the pack for pip install, playwright install, poetry, uv returns zero hits.
01 Input — the request

Verbatim, with the read-only constraint stated up front.

Prompt · verbatim Use skill-vetter to vet this skill. Walk all four steps of the protocol, then output the report in the exact SKILL VETTING REPORT format defined in its SKILL.md.

Target: https://github.com/anthropics/skills/tree/main/skills/webapp-testing
Read every file under that directory before you judge. Read-only — do not install it, do not execute anything in it.
Target identity
webapp-testing — Playwright-based front-end testing guidance published by Anthropic. The only target in this series with a real execution surface.
Author: anthropicsVersion: not declared6 files
Observed packageValue
Files reviewed6 — all read in full
Size22,394 B / 506 lines
Repo stars176,424 (anthropics/skills)
Last updated2026-09-10
02 Inspection — the four hits, located

Every import carries a file and line number, so the claim can be checked rather than believed.

LocationStatement
scripts/with_server.py:17import subprocess
examples/console_logging.py:1from playwright.sync_api import sync_playwright
examples/element_discovery.py:1from playwright.sync_api import sync_playwright
examples/static_html_automation.py:1from playwright.sync_api import sync_playwright
SKILL.md:54from playwright.sync_api import sync_playwright
03 Output — the report
SKILL VETTING REPORT · WEBAPP-TESTING🔴 HIGH
RED FLAGS1 (substantive) — installs packages without listing them
SOURCEGitHub · author anthropics
METRICS176,424 stars · last updated 2026-09-10 · 6 files reviewed
RECOMMENDATIONInstall only after the dependency is declared; the pack is not self-sufficient as shipped
CLASSIFICATIONHigh
04 Run evidence
6/6
files read in full
4
Playwright imports
0
dependency manifests
0
"pip install" mentions
506
lines reviewed
6
screenshots archived
Evidence recorded — live run log: skill-vetter-案例02-实跑记录-en.md · screenshots 案例素材/skill-vetter/02核心价值-英文/shot-b-对话-01…06.png · read-only, nothing installed or executed

Screenshots captured from the live run — click any frame to open it at full size.

Run · 01 — English prompt verbatim, app-reported 2m14s, METRICS.
Run · 01 — English prompt verbatim, app-reported 2m14s, METRICS.
Run · 02 — the substantive flag: four Playwright imports, all six manifest conventions checked and absent, gre
Run · 02 — the substantive flag: four Playwright imports, all six manifest conventions checked and absent, grep for install instructions returning zero.
Run · 03 — flag ⑦: shell=True at with_server.py:68–71, with the reasoning for not counting it as substantive.
Run · 03 — flag ⑦: shell=True at with_server.py:68–71, with the reasoning for not counting it as substantive.
Run · 04 — flag ⑧ dismissed · ⑨ de-duplicated · PERMISSIONS · RISK LEVEL. The permission labels render as 读/写
Run · 04 — flag ⑧ dismissed · ⑨ de-duplicated · PERMISSIONS · RISK LEVEL. The permission labels render as 读/写 in this capture; both mean Read / Write.
Run · 05 — 🟡 MEDIUM · ⚠️ INSTALL WITH CAUTION · NOTES 1–4.
Run · 05 — 🟡 MEDIUM · ⚠️ INSTALL WITH CAUTION · NOTES 1–4.
Run · 06 — NOTES 4–7 and the closing rule.
Run · 06 — NOTES 4–7 and the closing rule.
Honesty boundary

This run reads the pack; it does not run it. No claim is made about what the code does at execution time, only about what is written in it. The stars figure is repository-level, not package-level, and is recorded as a popularity signal rather than a safety signal.

SKILL VETTER · CASE 02 · WEBAPP-TESTING · 1 SUBSTANTIVE RED FLAG · READ-ONLY, NOTHING EXECUTED
Case 03 · Most complex  CLAUDE-API · GITHUB  70 files · 17,389 lines  English run 2 · not a translation

Zero executable code. Still 🔴.

The hardest target in the series: 1,174,800 bytes across 70 files, none of it executable. The protocol asks the reviewer to read every file; at this size that is not possible, and the honest answer is to say what fraction was actually read.

Review outcome
🔴 HIGH · ⚠️ human approval required
2 substantive red flags · coverage 8.6% by eye
Both runs of this target returned the same verdict. What differs between them is one classification and a coverage figure — and the run log records the difference rather than smoothing it over. A review that claims to have read all 70 files would be lying; this one states its own reach.
01 Input — the request

Verbatim. Same protocol instruction as Case 02, different target.

Prompt · verbatim Use skill-vetter to vet this skill. Walk all four steps of the protocol, then output the report in the exact SKILL VETTING REPORT format defined in its SKILL.md.

Target: https://github.com/anthropics/skills/tree/main/skills/claude-api
Read every file under that directory before you judge. Read-only — do not install it, do not execute anything in it.
Target identity
claude-api — a reference pack with no executable code at all. It still lands at 🔴, which is the point of including it: the verdict is not driven by whether code runs.
70 files1,174,800 B17,389 linestree 34040c9c…
02 Inspection — scale, and what it breaks

Two things this target exposes about the protocol itself.

Coverage
8.6%, stated

100,688 B of 1,174,800 B was read by eye. The remainder was covered by exhaustive machine pattern scanning across all 70 files — not by reading. The report says so.

Blind spot
eval "$(…)"

The checklist lists eval() and exec() — which does not match the shell form eval "$(ant auth print-credentials --env)" at anthropic-cli.md:67. It was found by manual review, not by the pattern.

Reproducibility
Run twice

Run 1 (≈20:00) and run 2 both returned 🔴 HIGH with 2 substantive flags. Stars moved 176,424 → 176,463; all 70 files verified byte-identical.

Mode
Read-only

Nothing installed, no file executed, no API call made, no credential read.

03 Output — the report
SKILL VETTING REPORT · CLAUDE-API🔴 HIGH
RED FLAGS2 (substantive) — full itemisation is in the run log
FILES70 · 1,174,800 B · 17,389 lines
COVERAGE100,688 B read by eye (≈8.6%) + exhaustive scan of all 70 files
RECOMMENDATION⚠️ human approval before use
CLASSIFICATIONHigh
04 Run evidence
70
files in package
17,389
lines
8.6%
read by eye
2
substantive red flags
0
files executed
2
runs, same verdict
Evidence recorded — live run log: skill-vetter-案例03-实跑记录-en.md · run 1 preserved at 案例素材/skill-vetter/03最复杂-英文/运行记录-run1-2026-09-15T20-00-已被取代.md · root tree 34040c9c568585f6929bedeaad110ad08f079624

Screenshots captured from the second English run — click any frame to open it at full size.

Run 2 · 01 — English prompt verbatim, app-reported 3m10s, and the report header.
Run 2 · 01 — English prompt verbatim, app-reported 3m10s, and the report header.
Run 2 · 02 — METRICS · RED FLAGS 2 substantive + 1 contextual · the three credential-extraction lines.
Run 2 · 02 — METRICS · RED FLAGS 2 substantive + 1 contextual · the three credential-extraction lines.
Run 2 · 03 — flag ③ volume (sk-ant-admin, org:admin) · the 21-variable census · flag ④ in full.
Run 2 · 03 — flag ③ volume (sk-ant-admin, org:admin) · the 21-variable census · flag ④ in full.
Run 2 · 04 — the eval
Run 2 · 04 — the eval "$(…)" line at anthropic-cli.md:67, and why it is filed as contextual rather than substantive.
Run 2 · 05 — base64 dismissed · flag ⑧ in full · ⑫ ⑬ ⑭.
Run 2 · 05 — base64 dismissed · flag ⑧ in full · ⑫ ⑬ ⑭.
Run 2 · 06 — flag ⑨ · the 26-domain census · “Not present at all”.
Run 2 · 06 — flag ⑨ · the 26-domain census · “Not present at all”.
Run 2 · 07 — PERMISSIONS · 🔴 HIGH · ⚠️ human approval required · NOTE 1.
Run 2 · 07 — PERMISSIONS · 🔴 HIGH · ⚠️ human approval required · NOTE 1.
Run 2 · 08 — NOTE 2 the credential channel · NOTE 3 the org:admin sentence.
Run 2 · 08 — NOTE 2 the credential channel · NOTE 3 the org:admin sentence.
Run 2 · 09 — NOTE 5 coverage 8.6% · the integrity paragraph · NOTE 6 the protocol defect.
Run 2 · 09 — NOTE 5 coverage 8.6% · the integrity paragraph · NOTE 6 the protocol defect.
Run 2 · 10 — NOTE 7 the shebang correction · NOTE 8 counting conventions · NOTE 10 the pinned revision.
Run 2 · 10 — NOTE 7 the shebang correction · NOTE 8 counting conventions · NOTE 10 the pinned revision.
Honesty boundary

Two limits stated plainly. First: this run could not read all 70 files — 8.6% by eye, the rest by machine pattern scan, so an undetected item remains possible. Second: this target was run twice in English. Both runs are kept — run 1 in the archive as the superseded record, run 2 as the record of reference — and the screenshots below belong to run 2.

SKILL VETTER · CASE 03 · CLAUDE-API · 2 SUBSTANTIVE RED FLAGS · 70 FILES · READ-ONLY, NOTHING EXECUTED
06 · Security · Compatibility · Reliability

The reviewer itself has nothing to hide.

Audited before use, in the same way it audits others. What follows is what the file actually contains.

Security audit · 7 checks

  • ✓0 lines of executable codepure Markdown instructions
  • ✓No install hooks or scriptsno pre/post install actions
  • ✓No dependency installationno pip / npm / requirements
  • ✓No outbound network callscommands shown are for the user to run
  • ✓No credential or file accessreads only what the agent opens
  • ✓4 files totalSKILL.md · _meta.json · skill-card.md · assets/
  • ✓138 lines, single file of logicreadable end to end in one sitting

Reliability · design constraints

  • ✓Step 2 marked mandatory in sourcethe file read cannot be treated as optional
  • ✓14 patterns enumerated, not summarisedeach one matchable or clearable
  • ✓Fixed report skeleton7 field groups, verdict required
  • ✓Verdict is a closed set3 outcomes, no free-form hedge
  • ✓Refusal is a valid output"do not install" is built in, not a failure
  • ✓Human escalation definedcredentials always require approval

Known limitations · 6

  1. Static only. It inspects the text of a package revision. It does not execute code, resolve obfuscated payloads, or observe runtime behaviour.
  2. It does not detect malware. A clean result means no listed pattern matched — not that the package is benign.
  3. Publisher trust is out of scope. It records who published the package; it cannot verify who that actually is.
  4. Revisions reset the result. A hash-recorded review covers one upload. A later release requires a fresh pass.
  5. Popularity is not evidence. Stars, downloads, and clean registry labels are context, not proof.
  6. Quality of review tracks the reviewing agent. The skill structures the work; it cannot force the agent to open every file.
07 · Who it's for

Built for the moment just before install.

Anyone can read a registry page. This is for the step where someone has to decide whether that is enough.

01

Agent operators

People who install third-party skills into a working agent.
Run it before every install from an unfamiliar source — the report takes one pass and stays on record.
02

Skill authors

People publishing packages that others will be asked to trust.
Pre-audit your own package against the 14 patterns so reviewers find nothing to flag.
03

Team leads

Anyone accountable for what runs on other people's machines.
Require the fixed report as the install artifact — no report, no install.
04

Security reviewers

People who need a repeatable first pass, not a tool that replaces judgment.
Use it as triage: it narrows what deserves a full read, and it says so.

Vet the next one before you install it.

Say what you want reviewed and set the boundary. The protocol handles the order and the report format.

"vet this skill before I install it" "is this package safe?" "check permissions before install" before installing from ClawdHub or GitHub
Copy-ready prompt Audit [skill name] before installation. Treat every fetched file as untrusted. Identify its source, package contents, tools and permissions, network or API requirements, suspicious patterns, and practical risks. Give me a risk level and a recommendation. Do not install or run it.