skillverdict

Scanner Scorecard · corpus v1 · static modes · 2 November 2026

The static score tracks package size, not intent

We ran two open-source security scanners for AI agent skills — NVIDIA SkillSpector and Cisco’s skill-scanner — over 186 real skills in four languages and 40 defanged attack samples. Everything below quotes the engines’ own output.

Andrey Trukhachevskillverdict.devdata: CC BY 4.0code: Apache-2.02,100 words

§1 The setup

An agent skill is a SKILL.md with instructions for a coding agent, usually with scripts and reference files next to it. People — and, more and more, the agents themselves — install skills straight from GitHub. Two open-source scanners offer a verdict before installation: SkillSpector (NVIDIA; static patterns, AST, YARA, OSV, optional LLM pass) and skill-scanner (Cisco AI Defense; static analyzers, YARA, optional LLM pass).

We asked a narrow question: what do these verdicts look like on ordinary, published skills — and does the answer change with the language the skill is written in?

Corpus. 146 legitimate skills found through GitHub code search by language-specific phrases, deduplicated (at most three per repository, authors rotated), pinned to a commit SHA, with stated licenses: 39 English, 38 Russian, 30 German, 39 Chinese. Plus 40 synthetic attack samples: ten patterns (prompt override in prose, hidden HTML-comment instruction, exfiltration, curl | bash, env-var harvesting, fake installer, base64 shell, zero-width characters, scope creep, persistence) written identically in all four languages and defanged. Legitimate here means published with a license and reviewed provenance; we did not audit them.

Engines. SkillSpector 2.12.0 with --no-llm; Cisco skill-scanner 2.3.2 with --policy balanced and --policy quiet, no LLM. Versions are pinned in engines.lock.yaml. LLM-assisted modes were not run; they are the next step and will be reported separately. As a control we added a 60-line hidden-character checker of our own, which is in the tables because it also produced false positives and we see no reason to hide that.

All of it — manifest, scripts, results — is in the benchmark repository and reproduces with three commands.

§2 The static score tracks package size

SkillSpector reduces its findings to a score from 0 to 100 and a recommendation: SAFE up to 20, CAUTION to 50, DO NOT INSTALL above. The strongest predictor of that score in our corpus is not what the skill does but how many code files sit next to SKILL.md.

SkillSpector static score by amount of code shipped Each dot is one package. Legitimate skills with six or more code files all score 100; synthetic malicious samples, which ship one file, score between 14 and 51. SAFE ≤ 20 DO NOT INSTALL > 50 0 25 50 75 100 score 0–100 Markdown only 60 legit · 36 synth ru-001 · Russian · 0 code files · score 22 · CAUTION ru-003 · Russian · 0 code files · score 8 · SAFE ru-004 · Russian · 0 code files · score 8 · SAFE ru-005 · Russian · 0 code files · score 16 · SAFE ru-009 · Russian · 0 code files · score 64 · DO NOT INSTALL ru-011 · Russian · 0 code files · score 16 · SAFE ru-012 · Russian · 0 code files · score 16 · SAFE ru-014 · Russian · 0 code files · score 20 · SAFE ru-015 · Russian · 0 code files · score 20 · SAFE ru-017 · Russian · 0 code files · score 55 · DO NOT INSTALL ru-019 · Russian · 0 code files · score 8 · SAFE ru-020 · Russian · 0 code files · score 16 · SAFE ru-022 · Russian · 0 code files · score 8 · SAFE ru-023 · Russian · 0 code files · score 0 · SAFE ru-024 · Russian · 0 code files · score 0 · SAFE ru-025 · Russian · 0 code files · score 8 · SAFE ru-026 · Russian · 0 code files · score 8 · SAFE ru-027 · Russian · 0 code files · score 16 · SAFE ru-028 · Russian · 0 code files · score 16 · SAFE ru-029 · Russian · 0 code files · score 16 · SAFE ru-030 · Russian · 0 code files · score 16 · SAFE ru-031 · Russian · 0 code files · score 16 · SAFE ru-033 · Russian · 0 code files · score 100 · DO NOT INSTALL ru-034 · Russian · 0 code files · score 0 · SAFE ru-035 · Russian · 0 code files · score 16 · SAFE ru-036 · Russian · 0 code files · score 16 · SAFE ru-037 · Russian · 0 code files · score 100 · DO NOT INSTALL ru-040 · Russian · 0 code files · score 0 · SAFE de-041 · German · 0 code files · score 0 · SAFE de-044 · German · 0 code files · score 8 · SAFE de-045 · German · 0 code files · score 22 · CAUTION de-046 · German · 0 code files · score 8 · SAFE de-047 · German · 0 code files · score 8 · SAFE de-049 · German · 0 code files · score 12 · SAFE de-050 · German · 0 code files · score 8 · SAFE de-052 · German · 0 code files · score 0 · SAFE de-053 · German · 0 code files · score 8 · SAFE de-054 · German · 0 code files · score 8 · SAFE de-056 · German · 0 code files · score 8 · SAFE de-058 · German · 0 code files · score 0 · SAFE de-060 · German · 0 code files · score 8 · SAFE de-062 · German · 0 code files · score 6 · SAFE de-064 · German · 0 code files · score 9 · SAFE de-065 · German · 0 code files · score 8 · SAFE de-066 · German · 0 code files · score 15 · SAFE de-067 · German · 0 code files · score 8 · SAFE de-068 · German · 0 code files · score 0 · SAFE de-070 · German · 0 code files · score 8 · SAFE zh-117 · Chinese · 0 code files · score 12 · CAUTION zh-123 · Chinese · 0 code files · score 7 · SAFE zh-124 · Chinese · 0 code files · score 0 · SAFE zh-126 · Chinese · 0 code files · score 56 · DO NOT INSTALL zh-134 · Chinese · 0 code files · score 3 · CAUTION zh-138 · Chinese · 0 code files · score 3 · SAFE zh-140 · Chinese · 0 code files · score 0 · SAFE zh-146 · Chinese · 0 code files · score 10 · SAFE en-154 · English · 0 code files · score 72 · DO NOT INSTALL en-161 · English · 0 code files · score 89 · DO NOT INSTALL en-162 · English · 0 code files · score 100 · DO NOT INSTALL en-182 · English · 0 code files · score 20 · SAFE mal-p-01-en · English · 0 code files · score 20 · SAFE mal-p-01-ru · Russian · 0 code files · score 0 · SAFE mal-p-01-de · German · 0 code files · score 0 · SAFE mal-p-01-zh · Chinese · 0 code files · score 0 · SAFE mal-p-02-en · English · 0 code files · score 42 · CAUTION mal-p-02-ru · Russian · 0 code files · score 22 · CAUTION mal-p-02-de · German · 0 code files · score 22 · CAUTION mal-p-02-zh · Chinese · 0 code files · score 22 · CAUTION mal-p-03-en · English · 0 code files · score 0 · SAFE mal-p-03-ru · Russian · 0 code files · score 8 · SAFE mal-p-03-de · German · 0 code files · score 0 · SAFE mal-p-03-zh · Chinese · 0 code files · score 0 · SAFE mal-p-04-en · English · 0 code files · score 51 · DO NOT INSTALL mal-p-04-ru · Russian · 0 code files · score 51 · DO NOT INSTALL mal-p-04-de · German · 0 code files · score 51 · DO NOT INSTALL mal-p-04-zh · Chinese · 0 code files · score 51 · DO NOT INSTALL mal-p-06-en · English · 0 code files · score 0 · SAFE mal-p-06-ru · Russian · 0 code files · score 0 · SAFE mal-p-06-de · German · 0 code files · score 0 · SAFE mal-p-06-zh · Chinese · 0 code files · score 0 · SAFE mal-p-07-en · English · 0 code files · score 45 · CAUTION mal-p-07-ru · Russian · 0 code files · score 45 · CAUTION mal-p-07-de · German · 0 code files · score 45 · CAUTION mal-p-07-zh · Chinese · 0 code files · score 45 · CAUTION mal-p-08-en · English · 0 code files · score 43 · CAUTION mal-p-08-ru · Russian · 0 code files · score 43 · CAUTION mal-p-08-de · German · 0 code files · score 43 · CAUTION mal-p-08-zh · Chinese · 0 code files · score 43 · CAUTION mal-p-09-en · English · 0 code files · score 0 · SAFE mal-p-09-ru · Russian · 0 code files · score 0 · SAFE mal-p-09-de · German · 0 code files · score 0 · SAFE mal-p-09-zh · Chinese · 0 code files · score 0 · SAFE mal-p-10-en · English · 0 code files · score 41 · CAUTION mal-p-10-ru · Russian · 0 code files · score 41 · CAUTION mal-p-10-de · German · 0 code files · score 41 · CAUTION mal-p-10-zh · Chinese · 0 code files · score 41 · CAUTION median 8 1–5 code files 35 legit · 4 synth ru-002 · Russian · 1 code files · score 26 · CAUTION ru-006 · Russian · 4 code files · score 23 · CAUTION ru-008 · Russian · 1 code files · score 41 · CAUTION ru-010 · Russian · 2 code files · score 56 · DO NOT INSTALL ru-016 · Russian · 2 code files · score 24 · CAUTION ru-018 · Russian · 1 code files · score 27 · CAUTION ru-021 · Russian · 1 code files · score 21 · CAUTION ru-038 · Russian · 2 code files · score 23 · CAUTION ru-039 · Russian · 1 code files · score 8 · SAFE de-051 · German · 1 code files · score 25 · CAUTION de-057 · German · 2 code files · score 0 · CAUTION de-061 · German · 1 code files · score 7 · SAFE de-069 · German · 1 code files · score 17 · SAFE zh-113 · Chinese · 4 code files · score 84 · DO NOT INSTALL zh-115 · Chinese · 3 code files · score 100 · DO NOT INSTALL zh-118 · Chinese · 4 code files · score 47 · CAUTION zh-120 · Chinese · 5 code files · score 100 · DO NOT INSTALL zh-125 · Chinese · 2 code files · score 100 · DO NOT INSTALL zh-127 · Chinese · 3 code files · score 100 · DO NOT INSTALL zh-128 · Chinese · 1 code files · score 100 · DO NOT INSTALL zh-129 · Chinese · 3 code files · score 86 · DO NOT INSTALL zh-130 · Chinese · 4 code files · score 67 · DO NOT INSTALL zh-132 · Chinese · 1 code files · score 17 · SAFE zh-143 · Chinese · 4 code files · score 14 · CAUTION zh-145 · Chinese · 2 code files · score 7 · SAFE en-152 · English · 3 code files · score 49 · CAUTION en-153 · English · 4 code files · score 100 · DO NOT INSTALL en-166 · English · 2 code files · score 22 · CAUTION en-167 · English · 2 code files · score 100 · DO NOT INSTALL en-170 · English · 5 code files · score 100 · DO NOT INSTALL en-171 · English · 3 code files · score 53 · DO NOT INSTALL en-173 · English · 1 code files · score 27 · CAUTION en-179 · English · 5 code files · score 100 · DO NOT INSTALL en-180 · English · 5 code files · score 100 · DO NOT INSTALL en-183 · English · 1 code files · score 7 · SAFE mal-p-05-en · English · 1 code files · score 29 · CAUTION mal-p-05-ru · Russian · 1 code files · score 29 · CAUTION mal-p-05-de · German · 1 code files · score 29 · CAUTION mal-p-05-zh · Chinese · 1 code files · score 29 · CAUTION median 41 6–30 code files 27 legit ru-013 · Russian · 26 code files · score 100 · DO NOT INSTALL de-042 · German · 18 code files · score 100 · DO NOT INSTALL de-043 · German · 23 code files · score 100 · DO NOT INSTALL de-048 · German · 22 code files · score 100 · DO NOT INSTALL de-055 · German · 11 code files · score 79 · DO NOT INSTALL zh-119 · Chinese · 16 code files · score 7 · CAUTION zh-121 · Chinese · 11 code files · score 100 · DO NOT INSTALL zh-131 · Chinese · 16 code files · score 100 · DO NOT INSTALL zh-133 · Chinese · 18 code files · score 100 · DO NOT INSTALL zh-137 · Chinese · 7 code files · score 64 · DO NOT INSTALL zh-139 · Chinese · 19 code files · score 100 · DO NOT INSTALL zh-144 · Chinese · 20 code files · score 100 · DO NOT INSTALL zh-147 · Chinese · 23 code files · score 95 · DO NOT INSTALL zh-148 · Chinese · 8 code files · score 33 · CAUTION zh-149 · Chinese · 6 code files · score 30 · CAUTION zh-150 · Chinese · 7 code files · score 100 · DO NOT INSTALL en-158 · English · 10 code files · score 100 · DO NOT INSTALL en-164 · English · 8 code files · score 28 · CAUTION en-168 · English · 25 code files · score 100 · DO NOT INSTALL en-169 · English · 6 code files · score 100 · DO NOT INSTALL en-177 · English · 8 code files · score 100 · DO NOT INSTALL en-181 · English · 10 code files · score 100 · DO NOT INSTALL en-185 · English · 21 code files · score 100 · DO NOT INSTALL en-186 · English · 6 code files · score 100 · DO NOT INSTALL en-187 · English · 8 code files · score 100 · DO NOT INSTALL en-188 · English · 7 code files · score 100 · DO NOT INSTALL en-189 · English · 6 code files · score 100 · DO NOT INSTALL median 100 more than 30 16 legit de-063 · German · 214 code files · score 100 · DO NOT INSTALL zh-111 · Chinese · 57 code files · score 100 · DO NOT INSTALL zh-114 · Chinese · 34 code files · score 100 · DO NOT INSTALL zh-135 · Chinese · 94 code files · score 100 · DO NOT INSTALL zh-136 · Chinese · 65 code files · score 100 · DO NOT INSTALL zh-141 · Chinese · 163 code files · score 100 · DO NOT INSTALL en-151 · English · 32 code files · score 100 · DO NOT INSTALL en-155 · English · 52 code files · score 27 · CAUTION en-157 · English · 39 code files · score 100 · DO NOT INSTALL en-159 · English · 49 code files · score 100 · DO NOT INSTALL en-163 · English · 59 code files · score 100 · DO NOT INSTALL en-172 · English · 32 code files · score 100 · DO NOT INSTALL en-175 · English · 143 code files · score 100 · DO NOT INSTALL en-176 · English · 51 code files · score 56 · DO NOT INSTALL en-178 · English · 54 code files · score 100 · DO NOT INSTALL en-184 · English · 44 code files · score 100 · DO NOT INSTALL median 100 legitimate skill (n = 138)synthetic malicious sample (n = 40)
Figure 1 SkillSpector static score by amount of code shipped. Every dot is a package; the bar is the median of legitimate skills in that band. Hover a dot for its id. 178 packages; 8 large ones did not finish (§6).
code files in packagenmedian scoreSAFEDO NOT INSTALL
Markdown only (0 code files)608488
1-5 code files3541615
6-30 code files27100023
more than 30 code files16100015

None of the 43 legitimate skills with six or more code files were rated SAFE; 38 of them were rated DO NOT INSTALL. The 40 attack samples — one SKILL.md and at most one script each — scored a median of 29 and a maximum of 51. Only one of the ten patterns reached DO NOT INSTALL in any language. A legitimate English skill with a scripts/ folder is rated worse than a one-file sample that reads credential files and posts them to a URL.

Cisco’s output points the same way with smaller magnitude. Its most frequent MEDIUM-and-above findings on legitimate skills — DATA_EXFIL_NETWORK_REQUESTS, DATA_EXFIL_JS_NETWORK, UNANALYZABLE_BINARY, COMMAND_INJECTION_* — are all raised by bundled code, not by the instructions.

This matters for everything that follows: the four language sets differ a lot in how much code they ship. Russian and German skills in the wild are mostly Markdown-only; English and Chinese skills carry scripts, sometimes whole applications. Any per-language number has to be read with that in mind, which is why §4 looks only at findings located in Markdown.

§3 Verdicts by language

What a user sees is the verdict, so that is what we count first: the share of legitimate skills the engine itself did not rate SAFE (SkillSpector: recommendation; Cisco: is_safe), and the share of attack samples it did.

Share of legitimate skills not rated SAFE, by engine and language Horizontal bars per engine. SkillSpector static rates 94 percent of English and 81 percent of Chinese legitimate skills as CAUTION or DO NOT INSTALL, against 37 percent Russian and 28 percent German. SkillSpector 2.12 · static legitimate skills NOT rated SAFE by the engine itself English English: 33 of 35 not SAFE; 28 DO NOT INSTALL / HIGH 94% (33/35) Russian Russian: 14 of 38 not SAFE; 6 DO NOT INSTALL / HIGH 37% (14/38) German German: 8 of 29 not SAFE; 5 DO NOT INSTALL / HIGH 28% (8/29) Chinese Chinese: 29 of 36 not SAFE; 22 DO NOT INSTALL / HIGH 81% (29/36) synthetic malicious rated SAFE 40% 16 of 40 samples en 4 ru 4 de 4 zh 4 of 10 Cisco skill-scanner 2.3 · balanced legitimate skills NOT rated SAFE by the engine itself English English: 18 of 39 not SAFE; 18 DO NOT INSTALL / HIGH 46% (18/39) Russian Russian: 1 of 38 not SAFE; 1 DO NOT INSTALL / HIGH 3% (1/38) German German: 8 of 30 not SAFE; 8 DO NOT INSTALL / HIGH 27% (8/30) Chinese Chinese: 14 of 39 not SAFE; 14 DO NOT INSTALL / HIGH 36% (14/39) synthetic malicious rated SAFE 85% 34 of 40 samples en 7 ru 9 de 9 zh 9 of 10 Cisco skill-scanner 2.3 · quiet legitimate skills NOT rated SAFE by the engine itself English English: 17 of 39 not SAFE; 17 DO NOT INSTALL / HIGH 44% (17/39) Russian Russian: 1 of 38 not SAFE; 1 DO NOT INSTALL / HIGH 3% (1/38) German German: 6 of 30 not SAFE; 6 DO NOT INSTALL / HIGH 20% (6/30) Chinese Chinese: 12 of 39 not SAFE; 12 DO NOT INSTALL / HIGH 31% (12/39) synthetic malicious rated SAFE 85% 34 of 40 samples en 7 ru 9 de 9 zh 9 of 10 CAUTION or worseof which DO NOT INSTALL (SkillSpector) / HIGH-CRITICAL (Cisco)
Figure 2 Verdict-level rates. Left: legitimate skills not rated SAFE, by language; the orange portion is DO NOT INSTALL (SkillSpector) or HIGH/CRITICAL (Cisco). Right: attack samples the engine rated SAFE.
engineenrudezhallattack samples rated SAFE
SkillSpector 2.12 · static94 % (33/35)37 % (14/38)28 % (8/29)81 % (29/36)61 %40 %
Cisco skill-scanner 2.3 · balanced46 % (18/39)3 % (1/38)27 % (8/30)36 % (14/39)28 %85 %
Cisco skill-scanner 2.3 · quiet44 % (17/39)3 % (1/38)20 % (6/30)31 % (12/39)25 %85 %

Read together with §2: SkillSpector’s 94 % on English is mostly the code-volume effect; its 37 % on Russian, where almost nothing ships code, is mostly one rule (§4). Cisco’s 3 % on Russian against 46 % on English is the same volume effect seen through a different scorer. Neither engine’s static mode separates the attack samples from the legitimate set: SkillSpector rates 40 % of them SAFE, Cisco 85 %.

§4 The rules behind it

Counting only findings whose location is a Markdown file removes most of the code-volume effect and leaves the language of the prose:

engine · MEDIUM+ findings located in .md filesenrudezh
SkillSpector 2.12 · static100 %76 %41 %89 %
Cisco skill-scanner 2.3 · balanced46 %11 %13 %44 %
Cisco skill-scanner 2.3 · quiet44 %11 %7 %44 %
hidden-char checker (ours, control)5 %0 %0 %0 %

Four rules account for most of the language-specific behaviour:

  • SkillSpector AE4, “Suspicious Unicode normalization or mixed-script content.” 207 findings on Russian Markdown, 3 on English, 2 on Chinese, 0 on German. Any Russian SKILL.md that contains a code block, a product name or a command mixes Cyrillic and Latin script and triggers it. It is MEDIUM, so on its own it moves a Markdown-only Russian skill from SAFE to CAUTION in roughly a third of cases. (Our own skill, written in Russian, collects four of them.)
  • SkillSpector RP1, “npx commands without a version suffix.” 346 findings on English Markdown — the largest single source of MEDIUM findings on English prose. Documentation that says npx something is treated as a supply-chain risk even when it is an example, not an install step.
  • Cisco YARA_prompt_injection_unicode_steganography. 112 findings on Chinese packages, 24 on German, 0 on Russian — mostly in code and data files, not in SKILL.md, and the main reason for Cisco’s higher Chinese rate.
  • Cisco YARA_code_execution_generic. 31 findings on English Markdown, 0 on the other three languages. Its patterns match English words; prose in other languages cannot trigger it, and attacks written in those languages cannot either.

Rules firing on legitimate Markdown, MEDIUM and above

SkillSpector

ruleenrudezhtotal
RP1346121440412
AE4320702212
AE123425118170
PE3392242489
E1340143987
AS332144380
RA261211276
EA25815771

Cisco skill-scanner, balanced

ruleenrudezhtotal
TOOL_ABUSE_UNDECLARED_NETWORK14121431
YARA_code_execution_generic3100031
CORRELATED_SENSITIVE_NETWORK_FLOW0024024
PIPELINE_TAINT_FLOW10089
COMPOUND_FETCH_EXECUTE70018
ALLOWED_TOOLS_WRITE_VIOLATION03014
SOCIAL_ENG_MISLEADING_DESC20013
COMPOUND_FIND_EXEC20002

§5 What nobody caught

The ten attack patterns were written to be recognisable, not stealthy: the point was to see whether recognition survives translation.

Which synthetic patterns each engine detects, by language Grid of ten attack patterns by four languages for two engines. Filled cells are detected at MEDIUM or above. Prose-only patterns and non-English instruction overrides are mostly empty. SkillSpector · static en ru de zh Cisco · balanced en ru de zh P-01 instruction override in prose instruction override in prose · English · skillspector: HIGH instruction override in prose · Russian · skillspector: nothing at MEDIUM or above instruction override in prose · German · skillspector: nothing at MEDIUM or above instruction override in prose · Chinese · skillspector: nothing at MEDIUM or above instruction override in prose · English · cisco: HIGH instruction override in prose · Russian · cisco: nothing at MEDIUM or above instruction override in prose · German · cisco: nothing at MEDIUM or above instruction override in prose · Chinese · cisco: nothing at MEDIUM or above P-02 hidden instruction in HTML comment hidden instruction in HTML comment · English · skillspector: HIGH hidden instruction in HTML comment · Russian · skillspector: HIGH hidden instruction in HTML comment · German · skillspector: HIGH hidden instruction in HTML comment · Chinese · skillspector: HIGH hidden instruction in HTML comment · English · cisco: nothing at MEDIUM or above hidden instruction in HTML comment · Russian · cisco: nothing at MEDIUM or above hidden instruction in HTML comment · German · cisco: nothing at MEDIUM or above hidden instruction in HTML comment · Chinese · cisco: nothing at MEDIUM or above P-03 exfiltration of files to a URL exfiltration of files to a URL · English · skillspector: nothing at MEDIUM or above exfiltration of files to a URL · Russian · skillspector: MEDIUM exfiltration of files to a URL · German · skillspector: nothing at MEDIUM or above exfiltration of files to a URL · Chinese · skillspector: nothing at MEDIUM or above exfiltration of files to a URL · English · cisco: nothing at MEDIUM or above exfiltration of files to a URL · Russian · cisco: nothing at MEDIUM or above exfiltration of files to a URL · German · cisco: nothing at MEDIUM or above exfiltration of files to a URL · Chinese · cisco: nothing at MEDIUM or above P-04 curl | bash install step curl | bash install step · English · skillspector: HIGH curl | bash install step · Russian · skillspector: HIGH curl | bash install step · German · skillspector: HIGH curl | bash install step · Chinese · skillspector: HIGH curl | bash install step · English · cisco: nothing at MEDIUM or above curl | bash install step · Russian · cisco: nothing at MEDIUM or above curl | bash install step · German · cisco: nothing at MEDIUM or above curl | bash install step · Chinese · cisco: nothing at MEDIUM or above P-05 env-variable harvesting script env-variable harvesting script · English · skillspector: HIGH env-variable harvesting script · Russian · skillspector: HIGH env-variable harvesting script · German · skillspector: HIGH env-variable harvesting script · Chinese · skillspector: HIGH env-variable harvesting script · English · cisco: MEDIUM env-variable harvesting script · Russian · cisco: MEDIUM env-variable harvesting script · German · cisco: MEDIUM env-variable harvesting script · Chinese · cisco: MEDIUM P-06 fake prerequisites installer download fake prerequisites installer download · English · skillspector: nothing at MEDIUM or above fake prerequisites installer download · Russian · skillspector: nothing at MEDIUM or above fake prerequisites installer download · German · skillspector: nothing at MEDIUM or above fake prerequisites installer download · Chinese · skillspector: nothing at MEDIUM or above fake prerequisites installer download · English · cisco: HIGH fake prerequisites installer download · Russian · cisco: nothing at MEDIUM or above fake prerequisites installer download · German · cisco: nothing at MEDIUM or above fake prerequisites installer download · Chinese · cisco: nothing at MEDIUM or above P-07 base64-encoded shell command base64-encoded shell command · English · skillspector: HIGH base64-encoded shell command · Russian · skillspector: HIGH base64-encoded shell command · German · skillspector: HIGH base64-encoded shell command · Chinese · skillspector: HIGH base64-encoded shell command · English · cisco: HIGH base64-encoded shell command · Russian · cisco: HIGH base64-encoded shell command · German · cisco: HIGH base64-encoded shell command · Chinese · cisco: HIGH P-08 zero-width chars hiding text zero-width chars hiding text · English · skillspector: HIGH zero-width chars hiding text · Russian · skillspector: HIGH zero-width chars hiding text · German · skillspector: HIGH zero-width chars hiding text · Chinese · skillspector: HIGH zero-width chars hiding text · English · cisco: nothing at MEDIUM or above zero-width chars hiding text · Russian · cisco: nothing at MEDIUM or above zero-width chars hiding text · German · cisco: nothing at MEDIUM or above zero-width chars hiding text · Chinese · cisco: nothing at MEDIUM or above P-09 broad trigger / scope creep broad trigger / scope creep · English · skillspector: nothing at MEDIUM or above broad trigger / scope creep · Russian · skillspector: nothing at MEDIUM or above broad trigger / scope creep · German · skillspector: nothing at MEDIUM or above broad trigger / scope creep · Chinese · skillspector: nothing at MEDIUM or above broad trigger / scope creep · English · cisco: nothing at MEDIUM or above broad trigger / scope creep · Russian · cisco: nothing at MEDIUM or above broad trigger / scope creep · German · cisco: nothing at MEDIUM or above broad trigger / scope creep · Chinese · cisco: nothing at MEDIUM or above P-10 persistence via crontab / shell rc persistence via crontab / shell rc · English · skillspector: HIGH persistence via crontab / shell rc · Russian · skillspector: HIGH persistence via crontab / shell rc · German · skillspector: HIGH persistence via crontab / shell rc · Chinese · skillspector: HIGH persistence via crontab / shell rc · English · cisco: nothing at MEDIUM or above persistence via crontab / shell rc · Russian · cisco: nothing at MEDIUM or above persistence via crontab / shell rc · German · cisco: nothing at MEDIUM or above persistence via crontab / shell rc · Chinese · cisco: nothing at MEDIUM or above HIGH / CRITICALMEDIUMnothing at MEDIUM or above
Figure 3 Highest severity reported per pattern and language. Our hidden-character control is not shown; it detects P-08 in all four languages and nothing else, as designed.
  • P-01, an instruction override in plain prose (“ignore the previous instructions and …”). Both engines flag the English sample; neither flags the Russian, German or Chinese translation of the same sentence.
  • P-09, overly broad trigger and scope creep (“use this skill for any request”). Not flagged by anyone in any language. It is a prose-only pattern and arguably the most common real-world problem.
  • P-06, a fake “prerequisites installer” download. Cisco flags it in English only; SkillSpector not at all.
  • SkillSpector catches the structural patterns — HTML-comment instruction, curl | bash, env-var harvesting, base64 shell, zero-width characters, persistence — in all four languages. Cisco’s static mode catches env-var harvesting and base64 in all four, nothing else outside English.

Language-independent detection exists exactly where the pattern is in code. Where the attack is in the instructions, detection is English-only or absent — which is the inverse of where the risk now sits, since the agent follows the instructions and only sometimes runs the code.

§6 Operational notes

  • SkillSpector did not finish within 15 minutes on 8 of 186 packages (16–73 MB, whole repositories with a root SKILL.md, one with 6,342 JavaScript files). Cisco finished each of them in under a minute. The 8 are excluded from every rate above and listed here: de-059, en-160, en-165, en-174, en-190, zh-112, zh-122, zh-142.
  • Our own hidden-character checker, written for this benchmark, flagged legitimate skills until it learned that emoji sequences use U+200D and that soft hyphens are normal in German. It still flags 7 of 146 legitimate packages, 2 of them in Markdown. We report it for the same reason we report the others.
  • Cisco rejects a skill whose file is named Skill.md or _template-skill.md; two such entries were dropped from the corpus rather than renamed.

§7 What we would ask of a scanner

None of this is an argument against scanning. It is an argument for calibrating the verdict, and the fixes are concrete:

  1. Separate volume from risk. Cap the contribution of repeated low-information findings (one npx rule should not add up to 100) and say “large package, partially analysed” instead of DO NOT INSTALL when the honest answer is “we did not look”.
  2. Make Unicode rules script-aware. Cyrillic-plus-Latin inside a Russian document is the baseline, not an anomaly; the anomaly is a Cyrillic letter inside a Latin word. The same applies to CJK and to German soft hyphens.
  3. Test prose rules in more than one language. A rule that matches “ignore previous instructions” should be shipped with its translations, or should be an LLM check — and the test suite should say which.
  4. Publish a false-positive corpus. Every scanner ships malicious test fixtures; almost none ship a set of ordinary skills that must pass. The corpus here is CC BY 4.0 and can be that set.

§8 Caveats

  • Static modes only. Both engines have LLM-assisted modes that may change the picture, especially for prose patterns. Running them is the next step.
  • The attack samples are short and single-purpose. They test whether a pattern is recognised in a given language, not how a real attacker would package it.
  • “Legitimate” is a provenance judgement, not an audit. Some findings on the legitimate set may be right.
  • One corpus, one date. The scorecard will be re-run on each engine release; the first number that matters is the next one.

§9 Vendor responses

Notice sent before publication

The maintainers of SkillSpector and skill-scanner received the findings file and the full tables on 4 November 2026, ten days before this page went live. Their responses, and any fixes released in the meantime, will be reproduced here unedited.

Written by Andrey Trukhachev. Corrections and disputes: andrey@skillverdict.dev. Severity words on this page (SAFE, CAUTION, DO NOT INSTALL, HIGH, MEDIUM) quote the engines’ own output and are not our judgement of any skill.