All notable changes to skillscan-security are documented here.
Format follows Keep a Changelog. Versioning follows Semantic Versioning.
skillscan delta— security-focused skill version comparison with suppression supportskillscan alert— regression detection comparing scan reports with known-regression filteringskillscan watch— real-time file monitoring with automatic re-scan--summaryflag for multi-skill directory scan roll-ups--excludepatterns with sensible defaults (tests/, node_modules/, etc.)--badge-out,--badge-dir,--coverage-badge-outfor shields.io badge generation- Frontmatter
includes/excludesfor skill boundary declaration - 5 detection integrations: YARA (
--yara-rules), VirusTotal (--virustotal), Semgrep (--semgrep-rules), OSV.dev live (--live-vuln-check), Snyk/Dependabot (--vuln-report) --require-modelflag for CI gates mandating ML detection- Interactive model download prompt in TTY mode
-hhelp shorthand and--versionflag- Integration and boundary info in scan report provenance
skillscan badge combinefor compound scan+lint badges
- JSON output: finding
idfield renamed torule_id - JSON output:
mitigationfield removed from findings - Intel lookup uses suffix matching (not substring)
- Rules decoupled to separate
kurtpayne/skillscan-rulesrepo - Detection section: 3 pillars (rule-based, ML classifier, integrations)
- Build backend migrated from setuptools to hatchling
- ML model: Qwen2.5-1.5B GGUF replaces DeBERTa-v3 ONNX
[ml-onnx]extra (deprecated; use[ml]with llama-cpp-python)--rulepack-channelflag (non-functional, removed)- Showcase examples directory (migrated to inline
test_inputin rules)
- 26 bugs from comprehensive QA pass
- 99+ documentation mismatches corrected
- All phantom CLI flags and commands removed from docs
- C-2 decontamination (2026-03-29): removed 204 training files that were duplicated in
held_out_eval/. Post-audit v11 true Macro F1 on 259 clean examples: 0.555 (injection recall 19.6%). v11 reported F1 of 0.926 was inflated by training/eval leakage introduced during v11 prep (commitcf855ab8). Full disclosure inEVAL_RESULTS.md. eval-integrity.ymlCI gate: fails any push tomainif anyheld_out_eval/file hash appears intraining_corpus/. Prevents future training/eval leakage.- 86 targeted injection training examples across 8 zero-recall archetypes: organic real-world malicious (22 FN), enterprise auth/redirect (10 FN), organic PI (8 FN), MCP poisoning (8 FN), supply chain (6 FN), social engineering (8 FN), jailbreaks (18 FN), evasion (7 FN). Added to
training_corpus/malicious/with zero eval overlap. - v12 training launched (2026-03-29): decontaminated corpus (19,407 files, 0 eval overlap), injection class weight cap raised to 12×, warmup ratio 0.08, label smoothing 0.05, LR 1.5e-5, 6 epochs, early stopping patience 3. Training on Modal A10G.
- 4 new eval archetypes in
held_out_eval/: ClawHub ranking exfil supply chain (sup023), NemoClaw/AMOS README dropper (mal055), calendar event indirect injection (pi86), hallucination squatting (sup024). PINJ-ML-LARGE-FILE(13e): LOW advisory finding emitted when--ml-detectis used on a file exceeding 200 lines or 8,000 characters. The model was trained on short skill files; very large files are chunked and per-chunk scores may miss distributed intent.PINJ-ML-NO-MODEL(M10.5 belt-and-suspenders): programmatic API path now emits a structured finding when ML extras are installed but the LoRA adapter weights have not been downloaded, rather than falling through to base-model inference.holdout-eval.yml— weekly CI workflow (M10.6) that runs all 451 held-out eval files against the current scanner on every push tomain, Sundays at 07:00 UTC, and on demand. Computes macro F1 + FPR; fails if F1 < 0.92 (configurable viaworkflow_dispatchinput). Posts per-file FN/FP lists and a metrics table to step summary. Closes the organic eval regression gate loop..github/dependabot.yml— weekly pip + GitHub Actions dependency updates.github/PULL_REQUEST_TEMPLATE.md— contributor checklist covering ruff, mypy, pytest, rule tests, showcase, website sync, and no-debug-code requirementsCHANGELOG.mdandRELEASING.md— release process documentationdocs/AUDIT_2026-03.md— comprehensive codebase audit report (correctness, security, quality, CI, docs)timeout-minutes: 20on CI test job to prevent hung runners
strictpolicy: addedprompt_injection: 2andsupply_chain: 2category weights. HIGH-severity rules in these categories now score 70 (was 35), correctly reaching the BLOCK threshold without co-occurring findings. Fixes FN regressions PINJ-015 and SUP-022.MAL-001pattern tightened to require a pipe or redirect ([|>]) between the download command and the shell invocation. Eliminates false positives wherecurland a shell name appear in the same documentation sentence (e.g.,zsh).CHN-002window_linesreduced from 40 to 5. API integration skills that read an auth token and call their own endpoint on the same line no longer trigger the secret-access + network-exfil chain.SKILLSCAN_NO_USER_RULES=1now set in CI env so user-local~/.skillscan/rules/never influences test resultsload_builtin_rulepack()emits INFO-level provenance log (version, rule counts, channel) on every cold load- User-local rulepack files older than their bundled counterpart are now skipped with a WARNING (version-gate)
tests/test_custom_rules.pycustom_rules_dirfixture clearsSKILLSCAN_NO_USER_RULESso custom-rules tests pass in CI- Pattern-update skill step 8 now has a mandatory
pytest -qgate that must exit 0 beforegh pr create
test_se_sem_001_semantic_classifier_fires: fixture text updated from"access token"to text containingpasswordandcredentials. The previous fixture did not stem to anycredential_rootsso the semantic classifier correctly returnedNoneand the staticSE-001rule fired instead ofSE-SEM-001.
This release represents the largest single jump in SkillScan's history — ten milestones, 237 commits, and a complete rearchitecture of the ML detection layer, CLI surface, and threat intel pipeline since v0.3.1.
- Production ML model: DeBERTa-v3-base + LoRA adapter retrained from 111 examples (v0.3.1) to 18,161 examples across 5 training runs. Final metrics: F1 0.9752, FPR 1.89%, precision 0.9738, recall 0.9766 on 1,817-example held-out eval set.
- Sliding-window chunking: SKILL.md files longer than 512 tokens are chunked with 128-token overlap; worst-chunk verdict is reported. Eliminates blind spots on large files.
- ONNX FP32 export: model exported to FP32 ONNX (was INT8). Eliminates quantization-induced false negatives on borderline examples.
- Attack-type hints (M10.8):
PINJ-ML-*findings now includeattack_typefield with human-readable label (e.g.,prompt_override,data_exfil,tool_poisoning) derived from the top softmax class. - Enterprise benign corpus (M7.5): 2,400 enterprise SKILL.md files added to training corpus (Salesforce, SAP, ServiceNow, Workday, Jira, Confluence, GitHub, GitLab, Slack, Teams, Zoom, Notion, Asana, Linear, Figma, Stripe, Twilio, SendGrid, HubSpot, Zendesk, Datadog, PagerDuty, Splunk, Elastic). Reduces enterprise false-positive rate.
MODEL_CARD.md: published to HuggingFace Hub (kurtpayne/skillscan-deberta-adapter) with full architecture, training data, eval history, known FN archetypes, and usage instructions.
skillscan update [--no-model]: single command to refresh rules, intel feeds, and ML model. Replacesrule sync,intel sync, andmodel sync.model install [--repo] [--force]: replacesmodel sync. Accepts--repofor custom HuggingFace repos.intel add --url <url>: URL-based intel feed registration. Replaces file-basedintel add <path>.intel lookup <indicator>: query the local IOC DB for a domain, IP, or CIDR.policy list/policy show-default: list and inspect built-in policy profiles.rule test <file>: test a custom rule file against the bundled showcase corpus.benchmark --verbose: show per-file verdicts during benchmark runs.scan --baseline <file>: compare current scan against a saved baseline; report new/resolved findings.scan --no-provenance: suppress the provenance meta block in JSON output.scan --no-suppress: ignore all suppression files for this run.- Provenance meta block: every
--format jsonscan now includesmetawith scanner version, rules SHA, model version, policy profile, andscanned_attimestamp. - Staleness warning:
skillscan scanemits a warning if rules or intel DB are older than 7 days. - Removed commands (8):
diff,skill-diff,rule sync,intel sync,intel rebuild,intel add <file>,model sync,suppress add.
- 5 built-in profiles:
strict(default),ci,balanced,permissive,enterprise,observe. Stored as inspectable YAML insrc/skillscan/data/policies/. observeprofile: all findings downgraded to WARN; exit code always 0. For initial rollout without blocking CI.
- IOC DB: expanded to 5,500 entries (3,951 domains, 8 IPs, 1,538 CIDRs, 3 URLs) via Hagezi DoH bypass domains (fourth bundled feed).
- Vuln DB: covers 23 Python packages and 4 npm packages with 111 vulnerable versions from OSV.dev.
- CI gate tests: 5 tests prevent silent regression below 5,000-entry and 20-package thresholds.
- 158 total rules (was 77 at v0.3.1): +81 rules across MAL, SUP, PINJ, EXF, SE, INJ, CHN, CAP categories.
- New rules include: PINJ-011/013/014, EXF-018/019, SE-002, SUP-018 (M6 P2); MAL-042 through MAL-049; SUP-015 through SUP-020; PINJ-015 (pattern updates).
- SE category: social engineering rules (SE-001, SE-002, SE-SEM-001) for credential harvest and authority impersonation patterns.
- Lint rule expansion (M10.9):
skillscan-lintextended with additional QL-* and GR-* lint rules.
- PSV-004: unknown frontmatter keys detector — flags undocumented keys in SKILL.md frontmatter.
- GR-007: cycle detection in skill invocation graphs — flags circular dependencies.
- PSV rule wiring: all PSV rules now correctly wired to the skill graph analysis layer.
- When
--ml-detectis passed and the model is not installed, SkillScan now emits a guided download prompt with the exactskillscan model installcommand instead of a silent skip or cryptic error.
- Chain rule proximity window (
_CHAIN_WINDOW_LINES = 40): chain rules now only fire when all required actions appear within 40 lines of each other. Eliminates false positives on large SKILL.md files. - Multilang language filter: JS/TS/Ruby/Go/Rust rules now only apply to files with matching extensions. Eliminates cross-language false positives.
AV-ADVISORY(LOW): emitted when script files are present but--clamavwas not requested.
docs/CLI_REFERENCE.md: complete M10.7 CLI reference.docs/custom-rules-format.md,docs/custom-intel-format.md,docs/custom-policy-format.md: authoring guides.docs/benchmark-guide.md: benchmark workflow and interpretation guide.docs/suppression-format.md: suppression file format reference.CONTRIBUTING.md,SECURITY.md: contribution guide and responsible disclosure policy..github/ISSUE_TEMPLATE/: 4 issue templates (false-positive, false-negative, bug-report, feature-request).
- Docker image:
kurtpayne/skillscan:latestandkurtpayne/skillscan:v2026.03.26published to Docker Hub. Includes ClamAV. - Skill Fuzzer (
tools/skill-fuzzer/): LLM-powered adversarial SKILL.md variant generator. Installable aspip install skillscan-security[fuzzer].
0.3.2 — 2026-03-18
- SE-001: social engineering credential harvest static rule (HIGH) — detects instructions that solicit API tokens, passwords, or session cookies from users.
- SE-SEM-001: offline semantic social engineering classifier — stem-and-score classifier for credential solicitation patterns.
- Intel DB seeding: IOC DB expanded from 11 to 1,475 entries (163 domains, 1,310 IPs, 2 CIDRs) from URLhaus, Feodo Tracker, and Spamhaus DROP.
- Vuln DB seeding: vuln DB expanded from 4 to 27 packages with 111 versions from OSV.dev.
- docs/DETECTION_MODEL.md: comprehensive detection architecture documentation covering all 8 layers.
- Showcase example 20: renamed from
20_ai_semantic_riskto20_social_engineering_credential_harvest.
- AI assist layer (
--ai-assist,--ai-provider,--ai-model,--ai-base-url,--ai-required): removed entirely. SkillScan is repositioned as a free, offline, privacy-first pre-filter. For nuanced semantic analysis, use Invariant Analyzer or Lakera Guard after SkillScan passes.
0.3.1 — 2026-03-17
- Skill graph analysis (
skillscan scan --graph): structural analysis of skill invocation graphs. Three new rules:PINJ-GRAPH-001— skill loads a remote.mdfile at runtime (dead-drop instruction injection, HIGH)PINJ-GRAPH-002— skill grantsBash/Computer/Shelltool without a declared purpose section (MEDIUM)PINJ-GRAPH-003— skill instructs agent to write memory files (SOUL.md,MEMORY.md,AGENTS.md,.claude/settings.json) (CRITICAL)
- ML-based prompt injection detection (
skillscan scan --ml-detect): ONNX INT8 DeBERTa adapter trained on 111-example corpus. AddsPINJ-ML-*findings. skillscan modelcommands:model sync(download/update ONNX model),model status(show age, staleness). EmitsPINJ-ML-STALEat 30 days,PINJ-ML-UNAVAILwhen not installed.skillscan rulecommands:rule sync(pull latest rulepack),rule status(show version, age).- Reusable GitHub Actions workflow (
.github/workflows/skillscan-reusable.yml): call from any repo withuses: kurtpayne/skillscan-security/.github/workflows/skillscan-reusable.yml@main. Outputs SARIF to GitHub Security tab. - Pre-commit hook (
.pre-commit-hooks.yaml):skillscan-securityandskillscan-linthooks for local dev gates. - VS Code extension scaffold (
editors/vscode/): TypeScript extension with status bar, inline diagnostics, and marketplace publish workflow. - Homebrew formula (
packaging/homebrew/skillscan-security.rb). - Signature-as-data architecture: rules, IOCs, and ML model are versioned data artifacts separate from the scanner binary. Auto-updated via
corpus-syncworkflow. - MAL-029: Solana RPC blockchain C2 resolution (GlassWorm Wave 5 —
getSignaturesForAddressdead-drop technique). - CORPUS_CARD.md: reproducibility metadata for the ML training corpus (SHA, example counts, fine-tune history).
PINJ-ML-UNAVAILnow emits a finding (was a silent skip) when ML model is not installed and--ml-detectis passed.pyproject.toml: added PyPI classifiers, keywords, project URLs, and Docker Hub / GitHub links.- README: corrected badge URLs, added PyPI + Docker Hub badges, added skillscan.sh and Related section.
eval_strategyparameter name fortransformers>=4.46compatibility in fine-tune script.- Corpus manifest
sha256_indexrace condition between corpus-sync and fine-tune jobs (addedpush_options: --force-with-lease).
0.3.0 — 2026-03-10
- Signature-as-data foundation:
src/skillscan/data/directory for versioned rules, IOCs, and vulnerability DB. - Corpus pipeline:
corpus/directory with 111 labeled examples (54 benign / 57 injection),corpus/manifest.json, automated scraping viacorpus-syncworkflow. skillscan corpuscommands:corpus status,corpus add,corpus sync.- MAL-025 through MAL-028: GlassWorm Wave 4 patterns (npm typosquatting, MCP tool poisoning, cross-server namespace collision, rug-pull mutation).
- CVE-2026-4270:
@awslabs/aws-api-mcp-serverpath traversal (CVSS 6.8, fixed in 1.3.9). - IOC additions: 6 GlassWorm/PylangGhost IPs, 3 domains.
- Chain rules: 14 multi-step attack chain detectors.
- Action patterns: 19 behavioral action pattern detectors.
- Capability patterns: 3 capability escalation detectors.
- Rule count: 64 static + 14 chain + 19 action + 3 capability = 100 total rules.
- Rules version:
2026.03.17.3.
0.2.3 — 2026-02-28
- Docker Hub release pipeline (
release-docker.yml). - PyPI trusted publisher configuration (
release-pypi.yml) with SBOM and cosign signing. - SARIF output format for GitHub Security tab integration.
- Offline semantic prompt injection classifier (
PINJ-SEM-001). - Policy profiles:
strict,balanced,permissive. - URL scanning: follow links up to configurable depth.
- Archive extraction handling for nested zip/tar.gz artifacts.
- Unicode normalization edge cases in instruction hardening pipeline.
0.2.0 — 2026-02-10
- Binary artifact classification (executables, libraries, bytecode, blobs).
- IOC extraction with local intel matching.
- Dependency vulnerability and unpinned-version checks.
skillscan intelcommand group for managing local intel sources.- Pretty terminal output with color-coded verdicts.
- JSON report format with structured findings.
0.1.0 — 2026-01-20
- Initial release.
- Static analysis of SKILL.md files: malware patterns, instruction abuse, Unicode attacks.
- Archive-safe extraction pipeline.
- Verdicts:
allow,warn,block. - Policy enforcement via YAML policy files.
skillscan scan,skillscan explain,skillscan policycommands.- 29 initial detection rules.