Merge upstream NVIDIA/SkillSpector keshavp/oss-release-2026-07-21 (v2.4.2) - #12
Merged
Conversation
Summary: This fix allows SkillSpector to run in environments that already have a running event loop, preventing RuntimeError when asyncio.run() is called from within an existing loop. Problem: When running SkillSpector in environments like: - Jupyter Notebooks - LangGraph Studio - FastAPI applications - Any programmatic usage within async code The call to asyncio.run() throws a RuntimeError: This event loop is already running and falls back to unfiltered static findings, silently disabling LLM analysis. The previous approach of detecting this state via error message substring matching is fragile and locale-dependent. Solution: 1. Add utility function in that properly detects running loops using 2. When no running loop exists, fall back to directly 3. When a loop is already running, offload execution to a separate thread with its own event loop via 4. Replace all calls across all analyzer nodes with the new helper 5. Remove unused asyncio imports from analyzer files Test: Add comprehensive unit tests for run_async covering: - Normal execution without existing running loop - Nested execution inside an already running loop - Exception propagation from async coroutines - Correct handling of async functions with await calls Signed-off-by: zhenliemao <494822673@qq.com>
Signed-off-by: zhenliemao <494822673@qq.com>
supply_chain (SC1-SC6) covers package dependencies but not the container-image supply chain. A skill pulling images with verification disabled (--disable-content-trust, DOCKER_CONTENT_TRUST=0, --insecure-registry) accepts tampered images but scored 9/SAFE (NVIDIA#223). Add SC7_PATTERNS to the supply_chain analyzer (is_code_example filter) with pattern_defaults entries and 5 tests. --tls-verify=false is excluded since TM3's verify=False already covers it. Signed-off-by: CharmingGroot <ohyes9711@gmail.com>
Signed-off-by: Rod Boev <rod.boev@gmail.com>
Signed-off-by: Rod Boev <rod.boev@gmail.com>
Signed-off-by: Rod Boev <rod.boev@gmail.com>
…utable bypass SC7 called is_code_example() with an unconditional continue, letting a nearby example marker (e.g. a '# for example' comment a few lines from a content-trust bypass) suppress the rule in executable files. The shared runner already filters examples in non-executable docs and only downweights executables, so the analyzer-level call was redundant and created an attacker-controlled bypass. Drop it and rely on the runner's file-type-aware handling; add an executable-file evasion regression test. Addresses review feedback on NVIDIA#224. Signed-off-by: CharmingGroot <ohyes9711@gmail.com>
Signed-off-by: zhenliemao <494822673@qq.com>
Signed-off-by: Rod Boev <rod.boev@gmail.com>
…sage Signed-off-by: WhereIs38 <CinderellaDoyle@icloud.com>
Signed-off-by: kigland <shuaizhicheng336@gmail.com>
…IDIA#228) Signed-off-by: Rod Boev <rod.boev@gmail.com>
Signed-off-by: Rod Boev <rod.boev@gmail.com>
Signed-off-by: Rod Boev <rod.boev@gmail.com>
…-enabled pulls clean Re-review on NVIDIA#224 flagged that the SC7 substring also matched --disable-content-trust=false, where verification stays enabled, producing a false HIGH. Add a negative lookahead (?!=false) so only bare/=true forms fire, plus a regression asserting =false yields no SC7. Signed-off-by: CharmingGroot <ohyes9711@gmail.com>
Signed-off-by: kigland <shuaizhicheng336@gmail.com>
Improve batch scan visibility: add README usage guide and rename contrib/multilingual → contrib/batch_scan
fix(mcp): prove stdio initialize compatibility (NVIDIA#199)
docs: correct MCP fixture expectations
Signed-off-by: Rod Boev <rod.boev@gmail.com>
…NVIDIA#251) Signed-off-by: Rod Boev <rod.boev@gmail.com>
Signed-off-by: Rod Boev <rod.boev@gmail.com>
Signed-off-by: Rod Boev <rod.boev@gmail.com>
Signed-off-by: Rod Boev <rod.boev@gmail.com>
Signed-off-by: zhenliemao <494822673@qq.com>
Signed-off-by: zhenliemao <494822673@qq.com>
Signed-off-by: zhenliemao <494822673@qq.com>
Signed-off-by: zhenliemao <494822673@qq.com>
Refresh the public SkillSpector tree from the internal OSS release branch release/oss-2026-07-13 at 5c6e07548aef93705ae5c87924751d392cb0ce8e. Changes: - Align GitHub CI with the deterministic lint, unit, and Docker smoke checks from the internal release snapshot. - Publish the 2.3.12 package metadata and lockfile update. - Carry forward the batch-scan README command whitespace cleanup. Verification: - ./scripts/create-oss-release.sh release/oss-2026-07-13 (includes make test-unit: 1269 passed, 34 deselected, 6 xfailed). - git diff --check origin/main. Signed-off-by: Keshav Pradeep <32313895+keshprad@users.noreply.github.com>
Sync OSS release snapshot (v2.3.12)
Fix: Allow running in environments with existing event loop
…data-229 fix(report): preserve full finding metadata in SARIF output (NVIDIA#229)
…ontainer-image feat(analyzer): detect untrusted container image pull as SC7
fix(yara): reduce packaged malware-signature false positives (NVIDIA#236)
…ema-228 fix(cli): preserve full per-skill JSON payload in recursive scans (NVIDIA#228)
fix(analyzer): gate documentation false positives for PE3/RA1/TM1/AR2
…-injection Avoid prompt injection false positives for emoji ZWJ sequences
feat(provider): allow scoped LLM provider injection (NVIDIA#243)
Refresh the public SkillSpector tree from the internal OSS release branch release/oss-2026-07-14 at a9a92062c299c94fdc078625b3e3cd435fa19e08. The snapshot is generated by scripts/create-oss-release.sh, which removes internal-only files and commits a single orphan-branch tree for public publication. Changes: - Bump public package metadata from 2.3.12 to 2.3.13. - Add development documentation for public GitHub and internal GitLab CI coverage. - Carry the YARA packaged-rule handling fix that compiles decoded rules in memory. - Refresh related YARA and event-loop regression tests. Verification: - scripts/create-oss-release.sh release/oss-2026-07-14 with PYTHONPATH pinned to the fresh clone (includes make test-unit: 1312 passed, 12 skipped, 34 deselected, 6 xfailed). - git diff --check origin/main. Signed-off-by: Keshav Pradeep <32313895+keshprad@users.noreply.github.com>
Sync OSS release snapshot
…VIDIA#283) Signed-off-by: Rod Boev <rod.boev@gmail.com>
…#284) Signed-off-by: Rod Boev <rod.boev@gmail.com>
…hs (NVIDIA#283) Signed-off-by: Rod Boev <rod.boev@gmail.com>
fix(analyzer): align file-size guard with character semantics (NVIDIA#284)
feat(provider): keep reasoning effort pass-through consistent across OpenAI and Anthropic providers
Signed-off-by: Keshav Pradeep <32313895+keshprad@users.noreply.github.com>
Sync OSS release snapshot
Refresh the public tree from internal release/oss-2026-07-21 at 40a7657. Publish the public-safe CHANGELOG.md, retain version 2.4.2 metadata, and preserve the OSS exclusions for internal-only release/provider tests. Signed-off-by: Keshav Pradeep <32313895+keshprad@users.noreply.github.com>
Brings in 51 upstream commits since c2d09df (last sync at v2.3.11), including the 2026-07-13, 2026-07-14 and 2026-07-20 OSS release snapshots. No file-level conflicts: upstream touched none of the paths carried by this fork (benchmark/, src/skillspector/exaforce/, tests/exaforce/).
smoy
approved these changes
Aug 3, 2026
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.
Summary
NVIDIA/SkillSpector:keshavp/oss-release-2026-07-21into the fork, covering the 2026-07-13, 2026-07-14 and 2026-07-20 OSS release snapshots.skillspector2.3.11 → 2.4.2, and syncsbenchmark/uv.lockto match the editable dep.Details
Last sync point was
c2d09df(v2.3.11, PR #9). No file-level conflicts — upstream touched none of the paths this fork carries (benchmark/,src/skillspector/exaforce/,tests/exaforce/); the changed-file sets intersect at zero files. Thecontrib/multilingual/→contrib/batch_scan/move came through as renames rather than add/delete.Notable upstream content: reasoning-effort pass-through for Anthropic and OpenAI-compatible providers (NVIDIA#283), documentation-false-positive gating for PE3/RA1/TM1/AR2 (NVIDIA#251), full finding metadata preserved in SARIF output (NVIDIA#229), scoped LLM provider injection (NVIDIA#243), YARA packaging/unicode fixes (NVIDIA#236), MCP stdio
initializecompatibility (NVIDIA#199), SC7 untrusted-container-image detection, and event-loop-reuse fixes.Fork-patch drift check. Upstream rewrote
meta_analyzer.py,llm_utils.py,providers/*andchat_models.py— all targets of this fork'sexaforceschema-pruning monkeypatch. A clean textual merge does not imply the patch still binds, so this matters:_patchlib.pyraisesPatchDriftErrorat import time on a missing field or changed prompt text, andapply_patches()runs fromsrc/skillspector/__init__.py, so any drift fails every test that importsskillspector. The suite passing is therefore real evidence the patch still applies to the new upstream code.NOTE
No notable improvements were observed when comparing to the current version but efficacy did not degrade. This is primarily an effort to keep drift from upstream manageable. Important observations between runs below.
Ver 2.3.11Bump to keshavp/oss-release-2026-07-21a1d8b9cd9a4b2994ce3de3dcOverall correctness (correct ÷ scanned, errors counted as wrong): 0.897 → 0.907 (▲ +0.010).
Verified locally:
uv run pytest tests/exaforce -quv run pytest -q(full)cd benchmark && uv run pytest -qThe 4 failures are the pre-existing, documented ones in
docs/superpowers/EXPECTED_TEST_FAILURES.md— upstream tests deliberately kept at upstream parity that assert the un-pruned schema. They fail the documented way (AssertionErroron a prunedexplanation/intentkey), not as import/collection errors.Known pre-existing CI failure, not introduced here:
make lint/make format-check(scoped tosrc/ tests/) is red on two fork-owned files —E402/import-order plus a formatting diff insrc/skillspector/__init__.py(theexaforceactivation import must come after the module body), andUP037atsrc/skillspector/exaforce/_schema_patches.py:18. Confirmed against pre-mergea57ac2awith the same ruff version, so this merge did not cause it. Left alone here to keep the merge reviewable; fixing__init__.pyalso pushes an upstream-parity file further from upstream.No structured plan — mechanical upstream merge; no fork code authored.