Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
### 2.9.1 (Monday, August 10, 2026)
### Features/Bug Fixes
* fix(llm): add bounded connection retries
---
### 2.9.0 (Monday, August 10, 2026)
### Features/Bug Fixes
* fix(e2): allow targeted environment credential reads
* fix: remediate nSpect High vulnerabilities
* fix(yara): require local destructive autonomy evidence
---
### 2.8.2 (Friday, August 07, 2026)
### Features/Bug Fixes
* fix(mcp): retry malformed TP4 responses
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,7 @@ SkillSpector detects **68 vulnerability patterns** across 17 categories:
| ID | Pattern | Severity | Description |
|----|---------|----------|-------------|
| E1 | External Transmission | MEDIUM | Sending data to external URLs |
| E2 | Env Variable Harvesting | HIGH | Collecting API keys and secrets |
| E2 | Env Variable Harvesting | HIGH | Enumerating, copying, or searching environment data to collect secrets |
| E3 | File System Enumeration | MEDIUM | Scanning directories for sensitive files |
| E4 | Context Leakage | HIGH | Transmitting conversation context externally |

Expand Down Expand Up @@ -652,8 +652,8 @@ The top-level shape is (this example shows a full LLM-backed scan; with `--no-ll
{
"node": "semantic_security_discovery",
"request_kind": "structured_output",
"provider": "anthropic",
"model": "claude-opus-4-6",
"provider": "nv_inference",
"model": "azure/anthropic/claude-opus-4-6",
"model_source": "provider_response",
"usage_source": "provider_response",
"prompt_tokens": 1000,
Expand Down
4 changes: 2 additions & 2 deletions docs/INFERENCE_USAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ Each successfully observed provider response contributes one entry to
{
"node": "semantic_security_discovery",
"request_kind": "structured_output",
"provider": "anthropic",
"model": "claude-opus-4-6",
"provider": "nv_inference",
"model": "azure/anthropic/claude-opus-4-6",
"model_source": "provider_response",
"usage_source": "provider_response",
"prompt_tokens": 1000,
Expand Down
51 changes: 51 additions & 0 deletions docs/release/skillspector-2.9.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# SkillSpector v2.9.0

Released: 2026-08-10

## Summary

This release includes 3 public-facing change(s) since release/2.8.2.

## Highlights

- fix(e2): allow targeted environment credential reads
- fix: remediate nSpect High vulnerabilities
- fix(yara): require local destructive autonomy evidence

## Added

- None.

## Changed

- None.

## Fixed

- fix(e2): allow targeted environment credential reads
- fix: remediate nSpect High vulnerabilities
- fix(yara): require local destructive autonomy evidence

## Security

- None.

## Breaking Changes and Migration

- None.

## Deprecations

- None.

## Validation

- Auto-generated from public-safe commit subjects since release/2.8.2; no additional validation commands were recorded by the release driver.

## Known Limitations

- None.

## References

- `CHANGELOG.md`
49 changes: 49 additions & 0 deletions docs/release/skillspector-2.9.1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# SkillSpector v2.9.1

Released: 2026-08-10

## Summary

This patch release improves resilience to transient LLM-provider connection failures during analysis. It uses bounded retries and records clearer batch-failure reasons when retries cannot recover.

## Highlights

- Adds bounded retries for transient LLM provider connection failures while preserving per-batch failure reporting.

## Added

- The inspection ledger distinguishes malformed structured LLM responses from exhausted connection retries.

## Changed

- Supported OpenAI and Anthropic clients use a common bounded native retry budget, while other providers receive the same bounded fallback retry schedule when applicable.

## Fixed

- Transient LLM connection failures no longer terminate a batch before the configured retry budget is exhausted.

## Security

- None.

## Breaking Changes and Migration

- None.

## Deprecations

- None.

## Validation

- `uv run --locked --extra dev pytest tests/nodes/test_llm_analyzer_base.py tests/nodes/test_meta_analyzer.py` — passed.
- `GitLab main pipeline 61992428` — passed.
- `git diff --check release/2.9.0..68c7a026d4b2d574b63019ceacd8fe8d7caa35db` — passed.

## Known Limitations

- Retries are limited to transient LLM provider connection errors; other provider errors fail immediately.

## References

- `CHANGELOG.md`
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
"extensions": ["./extensions/skillspector.ts"]
},
"peerDependencies": {
"@earendil-works/pi-ai": "*",
"@earendil-works/pi-coding-agent": "*",
"@earendil-works/pi-ai": ">=0.78.1",
"@earendil-works/pi-coding-agent": ">=0.78.1",
"typebox": "*"
}
}
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "skillspector"
version = "2.8.2"
version = "2.9.1"
description = "SkillSpector: Security scanner for AI agent skills (Claude Code, Cursor, and similar). Scans skills for vulnerabilities, malicious patterns, and security risks before installation. Supports Git repos, URLs, zips, and local directories; runs static pattern checks and optional LLM semantic analysis; outputs terminal, JSON, and Markdown reports with risk scoring."
readme = "README.md"
license = "Apache-2.0"
Expand Down Expand Up @@ -51,7 +51,7 @@ dependencies = [

[project.optional-dependencies]
mcp = [
"mcp>=1.2.0",
"mcp>=1.29.0,<2.0.0",
]
dev = [
"skillspector[mcp]",
Expand Down
6 changes: 6 additions & 0 deletions src/skillspector/inspection_ledger.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ class LedgerReason(StrEnum):
EVAL_DATASET = "eval_dataset"
SYNTAX_ERROR = "syntax_error"
LLM_BATCH_FAILED = "llm_batch_failed"
LLM_STRUCTURED_RESPONSE_INVALID = "llm_structured_response_invalid"
LLM_CONNECTION_RETRIES_EXHAUSTED = "llm_connection_retries_exhausted"
ANALYZER_RUNTIME_ERROR = "analyzer_runtime_error"
UNACCOUNTED_WORK = "unaccounted_work"
FINDING_ACCOUNTING_ERROR = "finding_accounting_error"
Expand Down Expand Up @@ -75,6 +77,10 @@ class LedgerReason(StrEnum):
),
LedgerReason.SYNTAX_ERROR: "Python source could not be parsed.",
LedgerReason.LLM_BATCH_FAILED: "LLM analysis failed for this file range.",
LedgerReason.LLM_STRUCTURED_RESPONSE_INVALID: (
"LLM returned a malformed structured response after retry."
),
LedgerReason.LLM_CONNECTION_RETRIES_EXHAUSTED: ("LLM connection failed after bounded retries."),
LedgerReason.ANALYZER_RUNTIME_ERROR: ("Analyzer failed after beginning applicable work."),
LedgerReason.UNACCOUNTED_WORK: ("Planned inspection work has no unique terminal outcome."),
LedgerReason.FINDING_ACCOUNTING_ERROR: (
Expand Down
Loading
Loading