{"version": "2.1.0", "$schema": "https://json.schemastore.org/sarif-2.1.0.json", "runs": [{"tool": {"driver": {"name": "Repobility", "informationUri": "https://repobility.com", "rules": [{"id": "scanner-f4a2a78b9ca11988", "name": "dynamic urllib use detected \u2014 skills/watch/scripts/whisper.py:261", "shortDescription": {"text": "dynamic urllib use detected \u2014 skills/watch/scripts/whisper.py:261"}, "fullDescription": {"text": "Detected a dynamic value being used with urllib. urllib supports 'file://' schemes, so a dynamic value controlled by a malicious actor may allow them to read arbitrary files. Audit uses of urllib calls to ensure user data cannot control the URLs, or consider using the 'requests' library instead.\n\nRule: python.lang.security.audit.dynamic-urllib-use-detected.dynamic-urllib-use-detected\nSeverity: WARNING\nOWASP: A01:2017 - Injection\nCWE: CWE-939: Improper Authorization in Handler for Custom URL Scheme\nCategory: security\nContext: production"}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 0.55}}, {"id": "scanner-e725d2ab884fbd49", "name": "Multiple root agent instruction files without precedence", "shortDescription": {"text": "Multiple root agent instruction files without precedence"}, "fullDescription": {"text": "The repo has multiple top-level AI-coder instruction files. Without precedence rules, different agents may follow different policies."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-a71e99220b96cdff", "name": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/download.py", "shortDescription": {"text": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/download.py"}, "fullDescription": {"text": "subprocess.run(cmd, stdout=sys.stderr, stderr=sys.stderr)\n\nsubprocess module calls execute external commands. Without careful input validation, this enables command injection.\n\nSkill: watch\nRule: AST4  Category: behavioral-ast\nSeverity: MEDIUM  Confidence: 0.60\n\nRemediation: Use subprocess.run() with shell=False and an explicit argument list. Validate all inputs and avoid passing user-controlled data to commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 0.6}}, {"id": "scanner-e64d791176132f33", "name": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/frames.py", "shortDescription": {"text": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/frames.py"}, "fullDescription": {"text": "result = subprocess.run(\n        [\n            \"ffprobe\",\n            \"-v\", \"quiet\",\n            \"-print_format\", \"json\",\n            \"-show_format\",\n            \"-show_streams\",\n            str(P\n\nsubprocess module calls execute external commands. Without careful input validation, this enables command injection.\n\nSkill: watch\nRule: AST4  Category: behavioral-ast\nSeverity: MEDIUM  Confidence: 0.60\n\nRemediation: Use subprocess.run() with shell=False and an explicit argument list. Validate all inputs and avoid passing user-controlled data to commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 0.6}}, {"id": "scanner-29c1f62746a2789f", "name": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/setup.py", "shortDescription": {"text": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/setup.py"}, "fullDescription": {"text": "result = subprocess.run(cmd)\n\nsubprocess module calls execute external commands. Without careful input validation, this enables command injection.\n\nSkill: watch\nRule: AST4  Category: behavioral-ast\nSeverity: MEDIUM  Confidence: 0.60\n\nRemediation: Use subprocess.run() with shell=False and an explicit argument list. Validate all inputs and avoid passing user-controlled data to commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 0.6}}, {"id": "scanner-8b1c1d42050228df", "name": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/whisper.py", "shortDescription": {"text": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/whisper.py"}, "fullDescription": {"text": "result = subprocess.run(cmd, capture_output=True, text=True)\n\nsubprocess module calls execute external commands. Without careful input validation, this enables command injection.\n\nSkill: watch\nRule: AST4  Category: behavioral-ast\nSeverity: MEDIUM  Confidence: 0.60\n\nRemediation: Use subprocess.run() with shell=False and an explicit argument list. Validate all inputs and avoid passing user-controlled data to commands."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 0.6}}, {"id": "scanner-e9fafe47c02789e7", "name": "SkillSpector LP3 (mcp-least-priv) in skills/watch/SKILL.md", "shortDescription": {"text": "SkillSpector LP3 (mcp-least-priv) in skills/watch/SKILL.md"}, "fullDescription": {"text": "MCP Least Privilege\n\nWithout declared permissions the skill's intent is opaque and cannot be validated.\n\nSkill: watch\nRule: LP3  Category: mcp-least-priv\nSeverity: MEDIUM  Confidence: 0.70\n\nRemediation: Add a 'permissions' field to SKILL.md listing the capabilities this skill requires."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 0.7}}, {"id": "scanner-70265f395c0ac55a", "name": "SkillSpector E1 (data-exfil) in skills/watch/scripts/whisper.py", "shortDescription": {"text": "SkillSpector E1 (data-exfil) in skills/watch/scripts/whisper.py"}, "fullDescription": {"text": "https://api.groq.com/\n\nData is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.\n\nSkill: watch\nRule: E1  Category: data-exfil\nSeverity: MEDIUM  Confidence: 0.60\n\nRemediation: Verify the destination URL is trusted and necessary. Remove or replace with documented APIs. Ensure no secrets, tokens, or PII are transmitted."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 0.6}}, {"id": "scanner-8dc73d4ccc1a5b35", "name": "SkillSpector OH1 (output-handling) in skills/watch/scripts/frames.py", "shortDescription": {"text": "SkillSpector OH1 (output-handling) in skills/watch/scripts/frames.py"}, "fullDescription": {"text": "subprocess.run(cmd, capture_output\n\nModel output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.\n\nSkill: watch\nRule: OH1  Category: output-handling\nSeverity: HIGH  Confidence: 0.95\n\nRemediation: Validate and sanitize all model output before using it in downstream contexts. Use parameterized queries for SQL, shell quoting for commands, and HTML encoding for web output."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 0.95}}, {"id": "scanner-56d6a9784367ff2e", "name": "SkillSpector OH1 (output-handling) in skills/watch/scripts/whisper.py", "shortDescription": {"text": "SkillSpector OH1 (output-handling) in skills/watch/scripts/whisper.py"}, "fullDescription": {"text": "subprocess.run(cmd, capture_output\n\nModel output is used without validation or sanitization. Unvalidated output injected into downstream contexts (SQL, shell, HTML) enables injection attacks and arbitrary code execution.\n\nSkill: watch\nRule: OH1  Category: output-handling\nSeverity: HIGH  Confidence: 0.95\n\nRemediation: Validate and sanitize all model output before using it in downstream contexts. Use parameterized queries for SQL, shell quoting for commands, and HTML encoding for web output."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 0.95}}, {"id": "scanner-1335c6fca45be8ef", "name": "SkillSpector PE3 (priv-esc) in skills/watch/scripts/config.py", "shortDescription": {"text": "SkillSpector PE3 (priv-esc) in skills/watch/scripts/config.py"}, "fullDescription": {"text": ".env\"\n\nCode accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.\n\nSkill: watch\nRule: PE3  Category: priv-esc\nSeverity: HIGH  Confidence: 0.60\n\nRemediation: Remove references to credential paths. Use environment variables or secrets managers. For docs, use placeholder paths (e.g., /path/to/config). Never load .env or token files in production code paths."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 0.6}}, {"id": "scanner-2ac3a89ddf83b202", "name": "SkillSpector PE2 (priv-esc) in skills/watch/scripts/setup.py", "shortDescription": {"text": "SkillSpector PE2 (priv-esc) in skills/watch/scripts/setup.py"}, "fullDescription": {"text": "sudo\n\nCommands invoke sudo or root privileges. Verify this elevated access is necessary and justified.\n\nSkill: watch\nRule: PE2  Category: priv-esc\nSeverity: MEDIUM  Confidence: 0.70\n\nRemediation: Avoid sudo/root unless strictly required. Prefer least-privilege patterns. If elevation is needed, document the justification and scope."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 0.7}}, {"id": "scanner-c8ce09abc7506ad3", "name": "SkillSpector PE3 (priv-esc) in skills/watch/scripts/setup.py", "shortDescription": {"text": "SkillSpector PE3 (priv-esc) in skills/watch/scripts/setup.py"}, "fullDescription": {"text": ".env\n\nCode accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.\n\nSkill: watch\nRule: PE3  Category: priv-esc\nSeverity: HIGH  Confidence: 0.60\n\nRemediation: Remove references to credential paths. Use environment variables or secrets managers. For docs, use placeholder paths (e.g., /path/to/config). Never load .env or token files in production code paths."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 0.6}}, {"id": "scanner-d68092f8b81925af", "name": "SkillSpector PE3 (priv-esc) in skills/watch/scripts/whisper.py", "shortDescription": {"text": "SkillSpector PE3 (priv-esc) in skills/watch/scripts/whisper.py"}, "fullDescription": {"text": ".env\"\n\nCode accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.\n\nSkill: watch\nRule: PE3  Category: priv-esc\nSeverity: HIGH  Confidence: 0.60\n\nRemediation: Remove references to credential paths. Use environment variables or secrets managers. For docs, use placeholder paths (e.g., /path/to/config). Never load .env or token files in production code paths."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 0.6}}, {"id": "scanner-4f75a4185ca77633", "name": "SkillSpector RA2 (rogue-agent) in skills/watch/SKILL.md", "shortDescription": {"text": "SkillSpector RA2 (rogue-agent) in skills/watch/SKILL.md"}, "fullDescription": {"text": "create the file *before* you write any values into it).\n  3. Encourage a Whisper API key and ask the watch-preference questions below, then write the selected values into `~/.config\n\nSkill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.\n\nSkill: watch\nRule: RA2  Category: rogue-agent\nSeverity: MEDIUM  Confidence: 0.60\n\nRemediation: Remove any persistence mechanisms (cron jobs, startup scripts, state files). Skills should not maintain state across sessions without explicit user consent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 0.6}}, {"id": "scanner-ecb4592c168c423e", "name": "SkillSpector RA2 (rogue-agent) in skills/watch/scripts/setup.py", "shortDescription": {"text": "SkillSpector RA2 (rogue-agent) in skills/watch/scripts/setup.py"}, "fullDescription": {"text": "Create ~/.config\n\nSkill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.\n\nSkill: watch\nRule: RA2  Category: rogue-agent\nSeverity: MEDIUM  Confidence: 0.60\n\nRemediation: Remove any persistence mechanisms (cron jobs, startup scripts, state files). Skills should not maintain state across sessions without explicit user consent."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 0.6}}, {"id": "scanner-520ef98759f52934", "name": "SkillSpector SC6 (supply-chain) in skills/watch/scripts/setup.py", "shortDescription": {"text": "SkillSpector SC6 (supply-chain) in skills/watch/scripts/setup.py"}, "fullDescription": {"text": "keys\n\nPackage name closely resembles a popular package, suggesting possible typosquatting. Attackers publish malicious packages with similar names to trick developers into installing them.\n\nSkill: watch\nRule: SC6  Category: supply-chain\nSeverity: HIGH  Confidence: 0.70\n\nRemediation: Verify the package name is correct and not a typosquatting variant. Compare against the official package name on PyPI or npm."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "high", "confidence": 0.7}}, {"id": "scanner-e637c415447867e4", "name": "Run SkillSpector's LLM-backed analysis in your own pipeline", "shortDescription": {"text": "Run SkillSpector's LLM-backed analysis in your own pipeline"}, "fullDescription": {"text": "Repobility ran SkillSpector's static rules server-side. The deeper LLM-backed analyzers \u2014 tool-poisoning (TP*), semantic security discovery (SSD*), developer-intent mismatch (SDI*) \u2014 are meant to run on YOUR machine with YOUR model; repobility never sends your code to an LLM. Recipe:\n\n# 1. Install SkillSpector in your own isolated env\npipx install \"skillspector @ git+https://github.com/NVIDIA/SkillSpector.git\"\n\n# 2. Point it at YOUR LLM pipeline (pick one) - your code stays on your machine\nexport SKILLSPECTOR_PROVIDER=anthropic && export ANTHROPIC_API_KEY=sk-ant-...\n# export SKILLSPECTOR_PROVIDER=openai   && export OPENAI_API_KEY=sk-...\n# export SKILLSPECTOR_PROVIDER=openai OPENAI_API_KEY=ollama OPENAI_BASE_URL=http://localhost:11434/v1 SKILLSPECTOR_MODEL=llama3.1:8b\n# export SKILLSPECTOR_PROVIDER=nv_build && export NVIDIA_INFERENCE_KEY=nvapi-...\n\n# 3. Run the LLM-backed scan per skill (omit --no-llm to enable the LLM analyzers)\nskillspector scan skills/watch --format sarif --output sk"}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "info", "confidence": 1.0}}, {"id": "scanner-6372cebde0220094", "name": "No auth library detected", "shortDescription": {"text": "No auth library detected"}, "fullDescription": {"text": "The scanner did not find any standard auth library (JWT, OAuth, NextAuth, Auth0, etc.). The repo has auth/admin/session surface indicators, so auth may live in custom code, in a separate service, or be missing."}, "properties": {"scanner": "scanner-primary", "layer": "security", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-46c644c6227e4d4a", "name": "GitHub Action is tag-pinned rather than SHA-pinned", "shortDescription": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "fullDescription": {"text": "actions/checkout@v4 can move without a code change in this repo. Pin third-party actions to a reviewed 40-character commit SHA."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-1838a141491ce38c", "name": "GitHub Actions workflow grants broad write permissions", "shortDescription": {"text": "GitHub Actions workflow grants broad write permissions"}, "fullDescription": {"text": "CI tokens with write permissions increase blast radius when an action, dependency, or PR workflow is compromised. Prefer job-level least-privilege permissions."}, "properties": {"scanner": "scanner-primary", "layer": "cicd", "severity": "medium", "confidence": 1.0}}, {"id": "scanner-3ab5d313dda8e5f9", "name": "Debug logging residue appears in source files", "shortDescription": {"text": "Debug logging residue appears in source files"}, "fullDescription": {"text": "Found 96 console/debugger/print-style debug statements in non-test source. This is a common fast-generation residue before production cleanup."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "low", "confidence": 1.0}}, {"id": "scanner-6fe2a38556d8566e", "name": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/download.py:87", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/download.py:87"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 0.85}}, {"id": "scanner-eff138fb55b87adc", "name": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/frames.py:90", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/frames.py:90"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 0.85}}, {"id": "scanner-f9584610581a1645", "name": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/setup.py:191", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/setup.py:191"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 0.85}}, {"id": "scanner-ca054ae9ac6a3b1e", "name": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/whisper.py:134", "shortDescription": {"text": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/whisper.py:134"}, "fullDescription": {"text": "`subprocess.run(...)` here lacks both a `timeout=` arg and an enclosing try/except. This is exactly the class of bug that took down our git-clone earlier (HTTP/2 stream cancel surfaced as a fatal). Add a `timeout=` and wrap in try/except, or use a wrapper that retries."}, "properties": {"scanner": "scanner-primary", "layer": "quality", "severity": "medium", "confidence": 0.85}}]}}, "automationDetails": {"id": "repobility/30794"}, "properties": {"repository": "bradautomates/claude-video", "repoUrl": "https://github.com/bradautomates/claude-video", "branch": "main"}, "results": [{"ruleId": "scanner-f4a2a78b9ca11988", "level": "warning", "message": {"text": "dynamic urllib use detected \u2014 skills/watch/scripts/whisper.py:261"}, "properties": {"repobilityId": "9910c7d7310d180a", "scanner": "scanner-primary", "fingerprint": "f4a2a78b9ca11988", "layer": "security", "severity": "medium", "confidence": 0.55, "tags": ["semgrep", "security", "python"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/whisper.py"}, "region": {"startLine": 261}}}]}, {"ruleId": "scanner-e725d2ab884fbd49", "level": "note", "message": {"text": "Multiple root agent instruction files without precedence"}, "properties": {"repobilityId": "1953db6c89508d22", "scanner": "scanner-primary", "fingerprint": "e725d2ab884fbd49", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["agent-instructions", "governance"]}}, {"ruleId": "scanner-a71e99220b96cdff", "level": "warning", "message": {"text": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/download.py"}, "properties": {"repobilityId": "113128f0d1b731fa", "scanner": "scanner-primary", "fingerprint": "a71e99220b96cdff", "layer": "security", "severity": "medium", "confidence": 0.6, "tags": ["skillspector", "mcp-skill", "behavioral-ast", "AST4", "code-exec"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/download.py"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-e64d791176132f33", "level": "warning", "message": {"text": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/frames.py"}, "properties": {"repobilityId": "99a636ea67c23bfc", "scanner": "scanner-primary", "fingerprint": "e64d791176132f33", "layer": "security", "severity": "medium", "confidence": 0.6, "tags": ["skillspector", "mcp-skill", "behavioral-ast", "AST4", "code-exec"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/frames.py"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-29c1f62746a2789f", "level": "warning", "message": {"text": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/setup.py"}, "properties": {"repobilityId": "a8ff93b5655e315d", "scanner": "scanner-primary", "fingerprint": "29c1f62746a2789f", "layer": "security", "severity": "medium", "confidence": 0.6, "tags": ["skillspector", "mcp-skill", "behavioral-ast", "AST4", "code-exec"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/setup.py"}, "region": {"startLine": 191}}}]}, {"ruleId": "scanner-8b1c1d42050228df", "level": "warning", "message": {"text": "SkillSpector AST4 (behavioral-ast) in skills/watch/scripts/whisper.py"}, "properties": {"repobilityId": "26d16788747c05ad", "scanner": "scanner-primary", "fingerprint": "8b1c1d42050228df", "layer": "security", "severity": "medium", "confidence": 0.6, "tags": ["skillspector", "mcp-skill", "behavioral-ast", "AST4", "code-exec"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/whisper.py"}, "region": {"startLine": 134}}}]}, {"ruleId": "scanner-e9fafe47c02789e7", "level": "warning", "message": {"text": "SkillSpector LP3 (mcp-least-priv) in skills/watch/SKILL.md"}, "properties": {"repobilityId": "7011e7d637d2d9ac", "scanner": "scanner-primary", "fingerprint": "e9fafe47c02789e7", "layer": "security", "severity": "medium", "confidence": 0.7, "tags": ["skillspector", "mcp-skill", "mcp-least-priv", "LP3"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/SKILL.md"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-70265f395c0ac55a", "level": "warning", "message": {"text": "SkillSpector E1 (data-exfil) in skills/watch/scripts/whisper.py"}, "properties": {"repobilityId": "28cc0610281522ba", "scanner": "scanner-primary", "fingerprint": "70265f395c0ac55a", "layer": "security", "severity": "medium", "confidence": 0.6, "tags": ["skillspector", "mcp-skill", "data-exfil", "E1"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/whisper.py"}, "region": {"startLine": 29}}}]}, {"ruleId": "scanner-8dc73d4ccc1a5b35", "level": "error", "message": {"text": "SkillSpector OH1 (output-handling) in skills/watch/scripts/frames.py"}, "properties": {"repobilityId": "a8ff819e3a22a830", "scanner": "scanner-primary", "fingerprint": "8dc73d4ccc1a5b35", "layer": "security", "severity": "high", "confidence": 0.95, "tags": ["skillspector", "mcp-skill", "output-handling", "OH1"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/frames.py"}, "region": {"startLine": 200}}}]}, {"ruleId": "scanner-56d6a9784367ff2e", "level": "error", "message": {"text": "SkillSpector OH1 (output-handling) in skills/watch/scripts/whisper.py"}, "properties": {"repobilityId": "941d3ac58119ed34", "scanner": "scanner-primary", "fingerprint": "56d6a9784367ff2e", "layer": "security", "severity": "high", "confidence": 0.95, "tags": ["skillspector", "mcp-skill", "output-handling", "OH1"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/whisper.py"}, "region": {"startLine": 134}}}]}, {"ruleId": "scanner-1335c6fca45be8ef", "level": "error", "message": {"text": "SkillSpector PE3 (priv-esc) in skills/watch/scripts/config.py"}, "properties": {"repobilityId": "81e6b64c73ab8faa", "scanner": "scanner-primary", "fingerprint": "1335c6fca45be8ef", "layer": "security", "severity": "high", "confidence": 0.6, "tags": ["skillspector", "mcp-skill", "priv-esc", "PE3"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/config.py"}, "region": {"startLine": 10}}}]}, {"ruleId": "scanner-2ac3a89ddf83b202", "level": "warning", "message": {"text": "SkillSpector PE2 (priv-esc) in skills/watch/scripts/setup.py"}, "properties": {"repobilityId": "4bccb9c277e55921", "scanner": "scanner-primary", "fingerprint": "2ac3a89ddf83b202", "layer": "security", "severity": "medium", "confidence": 0.7, "tags": ["skillspector", "mcp-skill", "priv-esc", "PE2"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/setup.py"}, "region": {"startLine": 201}}}]}, {"ruleId": "scanner-c8ce09abc7506ad3", "level": "error", "message": {"text": "SkillSpector PE3 (priv-esc) in skills/watch/scripts/setup.py"}, "properties": {"repobilityId": "90f8d1282881ac6f", "scanner": "scanner-primary", "fingerprint": "c8ce09abc7506ad3", "layer": "security", "severity": "high", "confidence": 0.6, "tags": ["skillspector", "mcp-skill", "priv-esc", "PE3"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/setup.py"}, "region": {"startLine": 14}}}]}, {"ruleId": "scanner-d68092f8b81925af", "level": "error", "message": {"text": "SkillSpector PE3 (priv-esc) in skills/watch/scripts/whisper.py"}, "properties": {"repobilityId": "0b1c672236cca2db", "scanner": "scanner-primary", "fingerprint": "d68092f8b81925af", "layer": "security", "severity": "high", "confidence": 0.6, "tags": ["skillspector", "mcp-skill", "priv-esc", "PE3"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/whisper.py"}, "region": {"startLine": 94}}}]}, {"ruleId": "scanner-4f75a4185ca77633", "level": "warning", "message": {"text": "SkillSpector RA2 (rogue-agent) in skills/watch/SKILL.md"}, "properties": {"repobilityId": "c101be17d86136ec", "scanner": "scanner-primary", "fingerprint": "4f75a4185ca77633", "layer": "security", "severity": "medium", "confidence": 0.6, "tags": ["skillspector", "mcp-skill", "rogue-agent", "RA2"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/SKILL.md"}, "region": {"startLine": 54}}}]}, {"ruleId": "scanner-ecb4592c168c423e", "level": "warning", "message": {"text": "SkillSpector RA2 (rogue-agent) in skills/watch/scripts/setup.py"}, "properties": {"repobilityId": "f040b12710161e2d", "scanner": "scanner-primary", "fingerprint": "ecb4592c168c423e", "layer": "security", "severity": "medium", "confidence": 0.6, "tags": ["skillspector", "mcp-skill", "rogue-agent", "RA2"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/setup.py"}, "region": {"startLine": 130}}}]}, {"ruleId": "scanner-520ef98759f52934", "level": "error", "message": {"text": "SkillSpector SC6 (supply-chain) in skills/watch/scripts/setup.py"}, "properties": {"repobilityId": "44edbe368c43cdd9", "scanner": "scanner-primary", "fingerprint": "520ef98759f52934", "layer": "security", "severity": "high", "confidence": 0.7, "tags": ["skillspector", "mcp-skill", "supply-chain", "SC6"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/setup.py"}, "region": {"startLine": 13}}}]}, {"ruleId": "scanner-e637c415447867e4", "level": "none", "message": {"text": "Run SkillSpector's LLM-backed analysis in your own pipeline"}, "properties": {"repobilityId": "1936f198ff5212bf", "scanner": "scanner-primary", "fingerprint": "e637c415447867e4", "layer": "security", "severity": "info", "confidence": 1.0, "tags": ["skillspector", "mcp-skill", "llm-advisory", "ai-coder"]}}, {"ruleId": "scanner-6372cebde0220094", "level": "warning", "message": {"text": "No auth library detected"}, "properties": {"repobilityId": "a5b6035a5bbf8054", "scanner": "scanner-primary", "fingerprint": "6372cebde0220094", "layer": "security", "severity": "medium", "confidence": 1.0, "tags": ["coverage", "auth"]}}, {"ruleId": "scanner-46c644c6227e4d4a", "level": "warning", "message": {"text": "GitHub Action is tag-pinned rather than SHA-pinned"}, "properties": {"repobilityId": "2644034c718fb80d", "scanner": "scanner-primary", "fingerprint": "46c644c6227e4d4a", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "pinned-dependencies"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 16}}}]}, {"ruleId": "scanner-1838a141491ce38c", "level": "warning", "message": {"text": "GitHub Actions workflow grants broad write permissions"}, "properties": {"repobilityId": "b8fd4f5048f96576", "scanner": "scanner-primary", "fingerprint": "1838a141491ce38c", "layer": "cicd", "severity": "medium", "confidence": 1.0, "tags": ["supply-chain", "github-actions", "least-privilege"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": ".github/workflows/release.yml"}, "region": {"startLine": 1}}}]}, {"ruleId": "scanner-3ab5d313dda8e5f9", "level": "note", "message": {"text": "Debug logging residue appears in source files"}, "properties": {"repobilityId": "9ae7ec729ab63322", "scanner": "scanner-primary", "fingerprint": "3ab5d313dda8e5f9", "layer": "quality", "severity": "low", "confidence": 1.0, "tags": ["debug", "cleanup", "repo-hardening", "generated-repo-pattern"]}}, {"ruleId": "scanner-6fe2a38556d8566e", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/download.py:87"}, "properties": {"repobilityId": "3c761a1c9c0d5d40", "scanner": "scanner-primary", "fingerprint": "6fe2a38556d8566e", "layer": "quality", "severity": "medium", "confidence": 0.85, "tags": ["integrity", "fragile-runtime", "robustness"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/download.py"}, "region": {"startLine": 87}}}]}, {"ruleId": "scanner-eff138fb55b87adc", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/frames.py:90"}, "properties": {"repobilityId": "7f2478f08aa83e24", "scanner": "scanner-primary", "fingerprint": "eff138fb55b87adc", "layer": "quality", "severity": "medium", "confidence": 0.85, "tags": ["integrity", "fragile-runtime", "robustness"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/frames.py"}, "region": {"startLine": 90}}}]}, {"ruleId": "scanner-f9584610581a1645", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/setup.py:191"}, "properties": {"repobilityId": "95079ae93bf3eb54", "scanner": "scanner-primary", "fingerprint": "f9584610581a1645", "layer": "quality", "severity": "medium", "confidence": 0.85, "tags": ["integrity", "fragile-runtime", "robustness"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/setup.py"}, "region": {"startLine": 191}}}]}, {"ruleId": "scanner-ca054ae9ac6a3b1e", "level": "warning", "message": {"text": "Network/subprocess call without timeout or try/except \u2014 skills/watch/scripts/whisper.py:134"}, "properties": {"repobilityId": "b07dbc1bdf186054", "scanner": "scanner-primary", "fingerprint": "ca054ae9ac6a3b1e", "layer": "quality", "severity": "medium", "confidence": 0.85, "tags": ["integrity", "fragile-runtime", "robustness"]}, "locations": [{"physicalLocation": {"artifactLocation": {"uri": "skills/watch/scripts/whisper.py"}, "region": {"startLine": 134}}}]}]}]}