skillspector 2.12.0 - #313189
Merged
Merged
skillspector 2.12.0#313189
Conversation
daeho-ro
approved these changes
Sep 24, 2026
Contributor
|
馃 An automated task has requested bottles to be published to this PR. Caution Please do not push to this PR branch before the bottle commits have been pushed, as this results in a state that is difficult to recover from. If you need to resolve a merge conflict, please use a merge commit. Do not force-push to this PR branch. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Created by
brew bumpCreated with
brew bump-formula-pr.resourceblocks have been checked for updates.release notes
opencode_cliprovider and invoke SkillSpector from OpenCode through a native/skillspectorcommand andskillspector_scantool.gemini-3.5-flashthrough the existing OpenAI-compatible provider, and see bounded live progress plus a control-safe discovered-file tree during non-verbose interactive scans./blob/links as their raw file contents instead of forge HTML.SAFErecommendation.skills/<name>/SKILL.mdpath identifies the skill currently being scanned, while retaining peer-skill, transformed, and enumeration findings.Added
metadata.llm_provenance(schema version 1), distinguishing configured, resolved, and effective providers and requested versus observed forwarded sampling/reasoning controls. It records bounded, sanitized model/package/source identity without endpoint URLs or credentials, and explicitly does not guarantee deterministic provider behavior.SKILLSPECTOR_BUILD_REVISIONcan supply source revision metadata when unavailable from the installed package (#556).SKILL.md/README.md. Deterministic HIGH findings survive optional LLM filtering, subject to explicit runtime/finding budgets; intentional private registries may need reviewed baseline suppression. This is not a registry reputation or network-reachability check (#383)./tree/URLs can select an existing repository subdirectory. Resolution uses the longest advertised branch/tag name, including refs containing slashes, and rejects decoded traversal or out-of-checkout selections. Arbitrary commit-SHA tree URLs are not supported by this ref-resolution path (#561).SKILLSPECTOR_COMPACT_PROMPTS=1,true, oryesenables unpadded LLM prompt line labels such asL1:instead ofL01:. Values are trimmed and case-insensitive; unset and other values retain the existing format (#542).SKILLSPECTOR_PROVIDER=opencode_cliruns semantic analysis through a local OpenCode login. The verified deny-all policy requires exactly OpenCode 1.18.31; authentication, version, policy, empty-output, or event-envelope failures fail closed.SKILLSPECTOR_MODELremains optional (#536, #575)./skillspectorcommand andskillspector_scantool. Copy.opencode/from a checkout to install it; the wheel does not install the extension. It resolves the binary fromSKILLSPECTOR_BIN, a worktree.venv, orPATH, requests required host capabilities before launch, rejects symlinked target/output/binary paths, and uses a 120-second timeout with bounded, redacted output. Semantic analysis is opt-in throughnoLlm=falseand the provider environment (#537).SKILLSPECTOR_MAX_STATIC_ANALYSIS_SECONDS_PER_ARTIFACTconfigures the static pattern and YARA time allowance per artifact; its default increases from 30 to 300 seconds. The remaining workflow deadline still bounds both analyzers.skillspector scan --fail-on-findingsexits with code 1 when a scan reports any active finding, including findings below the default risk-score threshold. It applies to single-skill, recursive, and MCP registry scans. Skill scans evaluate active findings after suppression (#469).gemini-3.5-flashmodel budgets are registered for the root and OpenAI-compatible registries, with a Gemini setup example using the existingopenaiprovider (#7).Changed
MODERATEseverity maps toMEDIUM, correcting the previousLOWfallback and potentially increasing affected supply-chain risk scores (#588).reference_missing; ambiguous matches retainreference_unresolved. The MCP skill-scan installation decision can allow a scan whose only caveats are missing references, provided all discovered files were inspected and the other risk, execution, and requested-analysis checks pass. Completeness metadata and the report recommendation still retain the caveat (#526).SKILLSPECTOR_MODEL_REGISTRYfor context and output-token limits. Missing entries retain the existing fallback behavior; malformed registry structures or invalid and non-positive budgets warn and fall back (#463).contrib/batch_scantool reuses the graph's validatedllm_file_cachefor multilingual language detection and gap-fill, avoiding a second raw filesystem read and retaining provider/local-only boundaries.contribremains outside the wheel (#558).Fixed
printfand executable wrappers, boundedeval/shell-cstrings, shell commands embedded in PowerShell, unsupported brace expansion, and commands crossing analysis windows. Parser and deadline uncertainty remains visible throughstatic_parse_limitand CLI/MCP completeness gates even when semantic analysis succeeds. Literal/documentation controls remain distinct; this is bounded analysis, not general shell emulation (#514)..gitmetadata only while a clone is active, then strictly remeasure the completed checkout. Permission errors, checkout failures, and final ingestion limits still fail closed (#514).unsupported_primary_contentfor recognized unsupported selected inputs and in-profileSKILL.md/skill.mdinstructions, including nested or renamed ZIP members. Preserve required-file identity, reject lossy required UTF-8 decoding, retain canonical bytes, and omit rejected primary text from provider input. Supported ZIP inspection and incidental-asset policy remain bounded and unchanged; a valid UTF-8 code point cut by a recorded byte limit remains partial rather than an unsupported-encoding failure (#563).obfuscated_instruction_textpartial evidence. The projection preserves structural boundaries and uses interruptible, workflow-bounded matching; it does not manufacture a confirmed P3/P4 finding or claim universal deobfuscation (#563)..plas Perl while retaining its existing security checks, and avoid false shell-parse-limit AE1 for narrowly proven standalone non-interpolated print literals. Printed content still receives security analysis; interpolation, quote-like syntax, heredocs, ambiguous fragments, and genuine limits remain conservative (#615).--output. Actual execution failures return exit 2; bounded static path postprocessing shares analysis budgets and preserves syntax/coverage limitations (#576).analyzer_load_error, so a missing analyzer cannot silently yield complete coverage. This remains a coverage gap rather than an execution crash (#591).CAUTION, strict incomplete gates, and MCP installation blocking remain. Other uses of resolved targets, malformed or non-PNG content, concealed payloads, and mixed/unknown limitations retain AE1. DEX and Lua bytecode signatures are also recognized as binary/executable content (#597).triggersare absent or empty, covering broad trigger phrases, command interception, and catch-all activation while excluding ordinary capability prose. Excess signal-bearing clauses are recorded as incomplete coverage; explicit legacy triggers retain their behavior (#541).Truevariables passed to subprocessshell=, with reassignment and Python-scope checks to avoid treating unrelated assignments as data flow (#560).getattrnames: dangerous names produce AST9, while unresolved or constructed benign names retain AST7. Prospective output length is checked before allocation (#544).ROPtoken, retainingROP(elf)controls without false HIGH findings for Rustdrop(&mut self)(#607).Retry-Afterhandling. Retry waits respect the workflow deadline; Bedrock SDK retries are disabled to avoid stacking retry budgets, and unrecovered failures retain incomplete analysis with sanitized diagnostics (#555).__dict__orvars(module)using subscripts,get,setdefault, andpop: dynamic keys produce AST7 and dangerous literal names produce AST9 (#517)..venv,venv, and.toxfor shipped.pyc/.pyofiles under existing traversal limits so Python environments cannot silently hide SC8 bytecode findings (#571).opaque_contentcoverage, making completeness false and preventing aSAFErecommendation (#573).--format sarifscans without--outputnow emit the merged SARIF log to standard output. SARIF advisories, progress, verbose status, and transitive warnings stay on standard error so the output remains parseable (#565)./blob/file URLs are rewritten to their raw-file forms before download, preventing scans of forge HTML in place of the requested file (#566).DO_NOT_INSTALL); the narrow exception for direct, non-binary.git/hooks/*.samplefiles remains (#548).Testing and Portability
Security
opaque_content, preventing a complete orSAFEresult for those hooks..git/hooks/*.samplefiles.Breaking Changes and Migration
unsupported_primary_contentand CLI exit 2 regardless of strict flags. Use supported UTF-8 instructions or supported ZIP inputs; required identity also applies inside bounded nested archives.SAFEresult to partial/CAUTION,--fail-on-incompleteexit 1, and MCPsafe_to_install=false. Default CLI exit 0 is not proof of completeness; AE6 marks unresolved interpretation rather than confirmed semantic wrongdoing.Incomplete referenced artifact analysispattern and bounded evidence fields such astarget_path,target_disposition,reasons, andreasons_truncated. Proven literal Perl help text can lose false AE1 findings without exempting its payload or ambiguous source from analysis.metadata.llm_provenancefields and ledger reasons such asanalyzer_load_errorandtransitive_child_scan_failed, preserve aggregate omission/failure evidence, and handle JSON zero-based versus SARIF one-based Unicode-codepoint columns.SKILLSPECTOR_BUILD_REVISION.--verboseto retain the non-streamed diagnostic path.View the full release notes at https://github.com/NVIDIA/SkillSpector/releases/tag/v2.12.0.