SkillSpector v2.10.0
Released: 2026-08-26
Summary
SkillSpector 2.10.0 expands security coverage across concealed artifacts, referenced skills, structured skill bundles, and external model selection. It also makes incomplete analysis harder to mistake for a clean result, adds localized LLM finding text, and exposes the highest reported issue severity for downstream policy gates.
Highlights
- Inspect hidden files and ZIP-compatible nested artifacts under cumulative safety bounds, with HIGH SC9 findings for concealed executables and provenance-preserving virtual paths.
- Add opt-in transitive reference scanning with bounded traversal, source provenance, shared budgets, and fail-closed completeness reporting.
- Recognize AISOP/AISP structured skill bundles and render report-only workflow summaries without affecting risk scores.
- Add EA5 detection for external model or provider selection, including silent coding-CLI account switches and top-level model pins.
- Add
SKILLSPECTOR_OUTPUT_LANGUAGEfor human-readable LLM finding text andrisk_assessment.max_issue_severityfor machine-readable policy gates.
Added
- Add bounded local inspection of hidden and nested ZIP, DOCX, XLSX, and PPTX content without extracting or executing members.
- Add opt-in transitive scanning of supported skill references with
--transitive, plus--transitive-depth,--transitive-allow-prefix, and--transitive-deny-prefixcontrols. - Add structured skill summaries for valid AISOP/AISP bundles across terminal, Markdown, JSON, and SARIF output.
- Add dynamic analyzer discovery and validate risk-score inputs against the registered analyzer set.
- Add EA5 static findings for actionable external model or provider selection.
- Add configurable output-language instructions for discovery analyzers, the meta-analyzer, and MCP tool-poisoning analysis.
- Add
risk_assessment.max_issue_severity, withNONEwhen no active issue is reported.
Changed
- Move
langgraph-cli[inmem]from the base installation to thelanggraph-devoptional extra; thedevextra continues to include it. - Update the NVIDIA Build default model to a currently served model and declare accurate limits for GLM-5.2.
- Tailor LP1 least-privilege remediation to the scanned manifest type.
- Automatically update eligible pull-request branches after changes land on
main.
Fixed
- Mark requested LLM analysis as degraded when any call fails or the configured provider is unavailable, flooring an otherwise
SAFErecommendation toCAUTION. - Report and baseline only the active findings that actually drove the risk score.
- Normalize serialized multi-skill risk scores before computing aggregate exit codes, with malformed values safely falling back to zero.
- Preserve eligible findings from
SKILL.mdinstead of dropping them as code examples. - Parse
package.jsonas JSON for supply-chain analysis and route fatal CLI diagnostics to stderr. - Detect whitespace-tolerant environment harvesting and all supported
os.environread forms. - Reduce false positives across inactive Git hook samples, license boilerplate, wildcard tool grants, OAuth credential terminology, reference directories, and non-text artifact content.
- Require an operation tied to a keyring or keychain noun before reporting PE3 in Markdown and text prose, while preserving actionable credential-store findings.
- Preserve the original custom CLI-provider call contract for ordinary scans while forwarding explicit deadlines to providers used by bounded scan paths.
Security
- Strengthen cumulative resource bounds, inspection-ledger completeness, finding provenance, Unicode normalization, and fail-closed behavior across scan paths.
- Keep hidden and nested artifact content local to deterministic analysis and exclude it from LLM prompts.
- Preserve deterministic security findings through filtering, suppression, recursive, transitive, MCP, and report-rendering paths.
- Surface partial provider execution and traversal truncation so incomplete deep scans cannot silently appear clean.
Breaking Changes and Migration
- No existing CLI command, option, or report field was removed.
- LangGraph Studio users who install only the base package should install
skillspector[langgraph-dev];make install-devand thedevextra continue to include this tooling. - Custom CLI providers keep the original
complete(prompt, *, model, max_output_tokens)contract for ordinary scans. Providers used with new deadline-bounded paths may additionally accepttimeoutas an optional keyword.
Deprecations
- None.
Validation
uv lock --check— passed..venv/bin/pytest -q tests/unit/test_llm_utils.py tests/unit/test_create_github_release.py tests/unit/test_github_release_workflow.py tests/unit/test_wheel_contents.py— 54 passed..venv/bin/pytest -m 'not integration and not provider' --cov=src/skillspector --cov-report=term --cov-report=xml tests/— 2,937 passed, 13 skipped, 38 deselected, and 4 expected failures..venv/bin/ruff check src/ tests/ scripts/— passed..venv/bin/ruff format --check src/ tests/ scripts/— 196 files already formatted.- Built
skillspector-2.10.0-py3-none-any.whlandskillspector-2.10.0.tar.gz;twine checkpassed for both distributions. skillspector --version— reportedSkillSpector v2.10.0.- The GitHub release helper dry run resolved tag
v2.10.0and the matching versioned release notes. git diff --check— passed.
Known Limitations
- Transitive scanning remains opt-in and is limited to source types supported by the secure input handler; it is not a general-purpose web crawler and is not enabled for MCP scans.
- Nested inspection is limited to ZIP-compatible containers, enforces fixed cumulative bounds, and does not render, install, or execute nested content.
SKILLSPECTOR_OUTPUT_LANGUAGEaffects human-readable LLM-generated finding text only; deterministic findings and machine-readable schema values remain unchanged.- Legacy custom CLI providers that do not accept
timeoutremain compatible with ordinary scans but cannot participate in a new path that requires an explicit provider deadline until they add that optional keyword.
References
- GitHub PR #74
- GitHub PR #211
- GitHub PR #225
- GitHub PR #237
- GitHub PR #291
- GitHub PR #323
- GitHub PR #328
- GitHub commit 1d379dc
- GitHub PR #362
- GitHub PR #368
- GitHub PR #375
- GitHub PR #376
- GitHub PR #381
- GitHub PR #382
- GitHub PR #390
- GitHub PR #391
- GitHub PR #393
- GitHub PR #398
- GitHub PR #402
- GitHub PR #412
- GitHub PR #415
- GitHub PR #417
- GitHub PR #422
- GitHub PR #424
- GitHub PR #425
- GitHub PR #426
- GitHub commit 550b9f0