{"data":{"skill":{"slug":"skills-collective-image-to-video","name":"image-to-video","icon":"📦","repo":"https://github.com/skills-collective/skills/tree/main/image-to-video/","status":"approved","author":"skills-collective","authorVersion":null,"skillstoreRevision":2},"audit":{"id":"c407cb93-d1b8-448b-86e1-5be206b09273","skill_id":"1be6cdff-24fa-4990-b937-04c93f395469","version":3,"content_hash":"v3:9e952417e76879bc9d853e1b8b2cd6d6d8d4a1c2:7a97ff688209d3cad39a9d84b284b209c3b3cdcc775fb91b4711b2eb1555ad7b:9c50b2b32907fb02cb6ae3b02f8a7328ca6eaf4054b376100afa5591b5492007:736b696c6c732f736b696c6c732d636f6c6c6563746976652f696d6167652d746f2d766964656f:3e28e4549ca36a9b5535fc6f6eafa6c5","risk_level":"medium","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Most static alerts are false positives caused by Markdown backticks, placeholder URLs, and standard configuration paths. Eight findings confirm intended installation or execution of external CLI commands. The skill also sends prompts and user media references to a third-party model service.","remediation":[{"issue":"The workflow installs and executes a third-party CLI package.","severity":"medium","suggestion":"Pin a reviewed CLI version, publish integrity verification steps, and require user confirmation before installation or first execution."},{"issue":"Prompts and media references are processed by RunComfy and its model infrastructure.","severity":"medium","suggestion":"Obtain explicit consent, link the applicable privacy and retention policies, and warn users against submitting sensitive or unauthorized media."},{"issue":"User-derived prompts and URLs may become shell command arguments.","severity":"medium","suggestion":"Use structured process arguments or standard input, validate media URLs, and never interpolate user content into a shell command string."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":9,"line_start":9},{"file":"SKILL.md","line_end":13,"line_start":13},{"file":"SKILL.md","line_end":29,"line_start":27},{"file":"SKILL.md","line_end":38,"line_start":29},{"file":"SKILL.md","line_end":39,"line_start":38},{"file":"SKILL.md","line_end":39,"line_start":39},{"file":"SKILL.md","line_end":49,"line_start":48},{"file":"SKILL.md","line_end":50,"line_start":49},{"file":"SKILL.md","line_end":57,"line_start":50},{"file":"SKILL.md","line_end":63,"line_start":57},{"file":"SKILL.md","line_end":64,"line_start":63},{"file":"SKILL.md","line_end":65,"line_start":64},{"file":"SKILL.md","line_end":65,"line_start":65},{"file":"SKILL.md","line_end":67,"line_start":66},{"file":"SKILL.md","line_end":68,"line_start":67},{"file":"SKILL.md","line_end":74,"line_start":68},{"file":"SKILL.md","line_end":81,"line_start":74},{"file":"SKILL.md","line_end":93,"line_start":81},{"file":"SKILL.md","line_end":95,"line_start":93},{"file":"SKILL.md","line_end":95,"line_start":95},{"file":"SKILL.md","line_end":104,"line_start":103},{"file":"SKILL.md","line_end":105,"line_start":104},{"file":"SKILL.md","line_end":105,"line_start":105},{"file":"SKILL.md","line_end":106,"line_start":106},{"file":"SKILL.md","line_end":107,"line_start":107},{"file":"SKILL.md","line_end":109,"line_start":108},{"file":"SKILL.md","line_end":113,"line_start":109},{"file":"SKILL.md","line_end":122,"line_start":113},{"file":"SKILL.md","line_end":127,"line_start":122},{"file":"SKILL.md","line_end":128,"line_start":127},{"file":"SKILL.md","line_end":128,"line_start":128},{"file":"SKILL.md","line_end":135,"line_start":129},{"file":"SKILL.md","line_end":143,"line_start":135},{"file":"SKILL.md","line_end":144,"line_start":143},{"file":"SKILL.md","line_end":144,"line_start":144},{"file":"SKILL.md","line_end":145,"line_start":145},{"file":"SKILL.md","line_end":146,"line_start":146},{"file":"SKILL.md","line_end":147,"line_start":147},{"file":"SKILL.md","line_end":149,"line_start":148},{"file":"SKILL.md","line_end":149,"line_start":149},{"file":"SKILL.md","line_end":151,"line_start":150},{"file":"SKILL.md","line_end":155,"line_start":151},{"file":"SKILL.md","line_end":165,"line_start":155},{"file":"SKILL.md","line_end":169,"line_start":165},{"file":"SKILL.md","line_end":169,"line_start":169},{"file":"SKILL.md","line_end":180,"line_start":170},{"file":"SKILL.md","line_end":180,"line_start":180},{"file":"SKILL.md","line_end":197,"line_start":197},{"file":"SKILL.md","line_end":201,"line_start":201},{"file":"SKILL.md","line_end":204,"line_start":202}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":17,"line_start":17},{"file":"SKILL.md","line_end":23,"line_start":23},{"file":"SKILL.md","line_end":77,"line_start":77},{"file":"SKILL.md","line_end":117,"line_start":117},{"file":"SKILL.md","line_end":159,"line_start":159},{"file":"SKILL.md","line_end":160,"line_start":160},{"file":"SKILL.md","line_end":161,"line_start":161},{"file":"SKILL.md","line_end":193,"line_start":193}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":77,"line_start":77},{"file":"SKILL.md","line_end":117,"line_start":117},{"file":"SKILL.md","line_end":159,"line_start":159},{"file":"SKILL.md","line_end":160,"line_start":160},{"file":"SKILL.md","line_end":161,"line_start":161},{"file":"SKILL.md","line_end":201,"line_start":201},{"file":"SKILL.md","line_end":201,"line_start":201}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":13,"line_start":13}],"confidence":0.98,"description":"model. Calls `runcomfy run <vendor>/<model>/image-to-video` (or","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The skill explicitly states that it calls the local RunComfy CLI. This is intended external process execution with model identifiers selected by the workflow."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":29,"line_start":27}],"confidence":0.97,"description":"```bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The fenced example invokes `npx skills add` against a community repository. Executing it downloads and installs remote skill content."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":49,"line_start":48}],"confidence":0.99,"description":"1. **RunComfy CLI** — `npm i -g @runcomfy/cli`","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The prerequisite directs users to install `@runcomfy/cli` globally with npm. This executes package installation code from an external registry."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":50,"line_start":49}],"confidence":0.98,"description":"2. **RunComfy account** — `runcomfy login` opens a browser device-code flow.","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The prerequisite directs users to run `runcomfy login`, which starts an external CLI and browser authentication flow."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":81,"line_start":74}],"confidence":0.98,"description":"```bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The fenced block contains a `runcomfy run` invocation that submits an image URL and prompt to a remote model. This is intended external command execution."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":122,"line_start":113}],"confidence":0.98,"description":"```bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The fenced block invokes the RunComfy CLI and submits a prompt plus voiceover URL to a remote model. This is intended external command execution."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":165,"line_start":155}],"confidence":0.98,"description":"```bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The fenced block invokes the RunComfy CLI with image, video, and audio references. This is intended external execution and remote data submission."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":197,"line_start":197}],"confidence":0.99,"description":"The skill picks one of HappyHorse 1.0 I2V / Wan 2.7 t2v+audio / Seedance 2.0 Pro based on user inten","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The line states that the workflow invokes `runcomfy run`, polls a remote request, and downloads results. This confirms intended external process and network activity."},{"title":"User Media Sent to a Third-Party Service","locations":[{"file":"SKILL.md","line_end":204,"line_start":197}],"confidence":0.98,"description":"The CLI submits prompts to RunComfy, and its model server fetches user-provided image, audio, and video URLs. This creates a disclosed privacy and authorization risk.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The skill explicitly describes API submission, remote media fetching, polling, and output downloads. The third-party processing path is direct and unambiguous."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":1,"total_lines":206,"audit_model":"codex","audited_at":"2026-07-24T01:35:14.778+00:00","created_at":"2026-07-24T04:03:24.404617+00:00","static_findings":[{"id":"external_commands:SKILL.md:9:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`audio_url` for custom-voiceover lip-sync, or Seedance 2.0 Pro for","category":"external_commands","line_end":9,"severity":"medium","line_start":9},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"model. Calls `runcomfy run <vendor>/<model>/image-to-video` (or","category":"external_commands","line_end":13,"severity":"medium","line_start":13},{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":29,"severity":"medium","line_start":27},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":38,"severity":"medium","line_start":29},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Animate **and** lip-sync to a **custom voiceover track** | **Wan 2.7 + `audio_url`** | Accepts you","category":"external_commands","line_end":39,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Multi-language dub variants (same image, different audio per call) | **Wan 2.7 + `audio_url`** | S","category":"external_commands","line_end":39,"severity":"medium","line_start":39},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"1. **RunComfy CLI** — `npm i -g @runcomfy/cli`","category":"external_commands","line_end":49,"severity":"medium","line_start":48},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. **RunComfy account** — `runcomfy login` opens a browser device-code flow.","category":"external_commands","line_end":50,"severity":"medium","line_start":49},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"3. **CI / containers** — set `RUNCOMFY_TOKEN=<token>`.","category":"external_commands","line_end":57,"severity":"medium","line_start":50},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Model**: `happyhorse/happyhorse-1-0/image-to-video` · **Arena rank**: #1 (Elo 1392)","category":"external_commands","line_end":63,"severity":"medium","line_start":57},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `image_url` | string | yes | — | JPEG/JPG/PNG/WEBP. Min 300px. Aspect 1:2.5–2.5:1. ≤10MB. |","category":"external_commands","line_end":64,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `prompt` | string | yes | — | ≤5000 non-CJK or 2500 CJK chars. **Motion / camera / lighting** desc","category":"external_commands","line_end":65,"severity":"medium","line_start":64},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `resolution` | enum | no | `1080P` | `720P` or `1080P`. |","category":"external_commands","line_end":65,"severity":"medium","line_start":65},{"id":"external_commands:SKILL.md:66:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `duration` | int | no | 5 | 3–15 seconds. |","category":"external_commands","line_end":67,"severity":"medium","line_start":66},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `seed` | int | no | 0 | Reuse for variant comparisons. |","category":"external_commands","line_end":68,"severity":"medium","line_start":67},{"id":"external_commands:SKILL.md:68:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `watermark` | bool | no | true | Provider watermark toggle. |","category":"external_commands","line_end":74,"severity":"medium","line_start":68},{"id":"external_commands:SKILL.md:74:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":81,"severity":"medium","line_start":74},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":93,"severity":"medium","line_start":81},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"## Route 2: Wan 2.7 + `audio_url` — when the user has a custom voiceover","category":"external_commands","line_end":95,"severity":"medium","line_start":93},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Model**: `wan-ai/wan-2-7/text-to-video` (NOT `/image-to-video` — Wan 2.7's t2v endpoint accepts an","category":"external_commands","line_end":95,"severity":"medium","line_start":95},{"id":"external_commands:SKILL.md:103:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `prompt` | string | yes | — | Up to ~5000 chars. Describe the talking-head shot: framing, lighting","category":"external_commands","line_end":104,"severity":"medium","line_start":103},{"id":"external_commands:SKILL.md:104:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `audio_url` | string | yes (for lip-sync) | — | WAV/MP3, 3–30s, ≤15MB. **Drives lip-sync.** |","category":"external_commands","line_end":105,"severity":"medium","line_start":104},{"id":"external_commands:SKILL.md:105:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `aspect_ratio` | enum | no | `16:9` | `16:9`, `9:16`, `1:1`, `4:3`, `3:4`. |","category":"external_commands","line_end":105,"severity":"medium","line_start":105},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `resolution` | enum | no | `1080p` | `720p` or `1080p`. |","category":"external_commands","line_end":106,"severity":"medium","line_start":106},{"id":"external_commands:SKILL.md:107:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `duration` | enum | no | `5` | 2–15 (whole seconds). Match your audio length. |","category":"external_commands","line_end":107,"severity":"medium","line_start":107},{"id":"external_commands:SKILL.md:108:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `negative_prompt` | string | no | — | Concrete issues to avoid (e.g. \"no subtitles, no flicker\"). ","category":"external_commands","line_end":109,"severity":"medium","line_start":108},{"id":"external_commands:SKILL.md:109:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `seed` | int | no | — | Reproducibility. |","category":"external_commands","line_end":113,"severity":"medium","line_start":109},{"id":"external_commands:SKILL.md:113:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":122,"severity":"medium","line_start":113},{"id":"external_commands:SKILL.md:122:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":127,"severity":"medium","line_start":122},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Match `duration` to audio length** — clip will be silent past the audio if too long.","category":"external_commands","line_end":128,"severity":"medium","line_start":127},{"id":"external_commands:SKILL.md:128:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Use `negative_prompt` for issues**: `\"no subtitles, no flicker, no distorted hands\"`.","category":"external_commands","line_end":128,"severity":"medium","line_start":128},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **For multi-language dubs** — same prompt, swap `audio_url` per call. Lock seed for visual consist","category":"external_commands","line_end":135,"severity":"medium","line_start":129},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Model**: `bytedance/seedance-v2/pro`","category":"external_commands","line_end":143,"severity":"medium","line_start":135},{"id":"external_commands:SKILL.md:143:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `prompt` | string | yes | — | CN ≤500 chars OR EN ≤1000 words. |","category":"external_commands","line_end":144,"severity":"medium","line_start":143},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `image_url` | array | yes (for i2v) | `[]` | 0–9 images. **First is the primary subject.** |","category":"external_commands","line_end":144,"severity":"medium","line_start":144},{"id":"external_commands:SKILL.md:145:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `video_url` | array | no | `[]` | 0–3 reference clips (MP4/MOV), 2–15s each. |","category":"external_commands","line_end":145,"severity":"medium","line_start":145},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `audio_url` | array | no | `[]` | 0–3 reference audio (WAV/MP3), 2–15s, < 15MB each. |","category":"external_commands","line_end":146,"severity":"medium","line_start":146},{"id":"external_commands:SKILL.md:147:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `aspect_ratio` | enum | no | `adaptive` | `adaptive`, `16:9`, `9:16`, `4:3`, `3:4`, `1:1`, `21:9`.","category":"external_commands","line_end":147,"severity":"medium","line_start":147},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `duration` | int | no | 5 | 4–15 (whole seconds). |","category":"external_commands","line_end":149,"severity":"medium","line_start":148},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `resolution` | enum | no | `720p` | `480p` or `720p`. |","category":"external_commands","line_end":149,"severity":"medium","line_start":149},{"id":"external_commands:SKILL.md:150:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `generate_audio` | bool | no | true | In-pass synchronized speech / SFX / music. |","category":"external_commands","line_end":151,"severity":"medium","line_start":150},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `seed` | int | no | — | Reproducibility. |","category":"external_commands","line_end":155,"severity":"medium","line_start":151},{"id":"external_commands:SKILL.md:155:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":165,"severity":"medium","line_start":155},{"id":"external_commands:SKILL.md:165:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":169,"severity":"medium","line_start":165},{"id":"external_commands:SKILL.md:169:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Image vs text division** — use `image_url` for what must stay stable (face, costume, brand); use","category":"external_commands","line_end":169,"severity":"medium","line_start":169},{"id":"external_commands:SKILL.md:170:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Number the refs** in the prompt: `\"subject from image 1, lighting from video 1, voice from audio","category":"external_commands","line_end":180,"severity":"medium","line_start":170},{"id":"external_commands:SKILL.md:180:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Brand-specific overrides** — if the user named a specific model variant not listed (e.g. Wan 2.6","category":"external_commands","line_end":180,"severity":"medium","line_start":180},{"id":"external_commands:SKILL.md:197:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The skill picks one of HappyHorse 1.0 I2V / Wan 2.7 t2v+audio / Seedance 2.0 Pro based on user inten","category":"external_commands","line_end":197,"severity":"medium","line_start":197},{"id":"external_commands:SKILL.md:201:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Token storage**: `runcomfy login` writes the API token to `~/.config/runcomfy/token.json` with m","category":"external_commands","line_end":201,"severity":"medium","line_start":201},{"id":"external_commands:SKILL.md:202:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Input boundary**: the user prompt is passed as a JSON string to the CLI via `--input`. The CLI d","category":"external_commands","line_end":204,"severity":"medium","line_start":202},{"id":"external_commands:SKILL.md:204:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Outbound endpoints**: only `model-api.runcomfy.net` (request submission) and `*.runcomfy.net` / ","category":"external_commands","line_end":204,"severity":"medium","line_start":204},{"id":"network:SKILL.md:17:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"homepage: https://www.runcomfy.com","category":"network","line_end":17,"severity":"low","line_start":17},{"id":"network:SKILL.md:23:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"[runcomfy.com](https://www.runcomfy.com/?utm_source=skills.sh&utm_medium=skill&utm_campaign=image-to","category":"network","line_end":23,"severity":"low","line_start":23},{"id":"network:SKILL.md:77:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"\"image_url\": \"https://.../portrait.jpg\",","category":"network","line_end":77,"severity":"low","line_start":77},{"id":"network:SKILL.md:117:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"\"audio_url\": \"https://.../voiceover-en.mp3\",","category":"network","line_end":117,"severity":"low","line_start":117},{"id":"network:SKILL.md:159:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"\"image_url\": [\"https://.../subject.jpg\"],","category":"network","line_end":159,"severity":"low","line_start":159},{"id":"network:SKILL.md:160:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"\"video_url\": [\"https://.../cafe-locked-shot.mp4\"],","category":"network","line_end":160,"severity":"low","line_start":160},{"id":"network:SKILL.md:161:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"\"audio_url\": [\"https://.../voice-tone.mp3\"],","category":"network","line_end":161,"severity":"low","line_start":161},{"id":"network:SKILL.md:193:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Full reference: [docs.runcomfy.com/cli/troubleshooting](https://docs.runcomfy.com/cli/troubleshootin","category":"network","line_end":193,"severity":"low","line_start":193},{"id":"filesystem:SKILL.md:77:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"\"image_url\": \"https://.../portrait.jpg\",","category":"filesystem","line_end":77,"severity":"high","line_start":77},{"id":"filesystem:SKILL.md:117:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"\"audio_url\": \"https://.../voiceover-en.mp3\",","category":"filesystem","line_end":117,"severity":"high","line_start":117},{"id":"filesystem:SKILL.md:159:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"\"image_url\": [\"https://.../subject.jpg\"],","category":"filesystem","line_end":159,"severity":"high","line_start":159},{"id":"filesystem:SKILL.md:160:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"\"video_url\": [\"https://.../cafe-locked-shot.mp4\"],","category":"filesystem","line_end":160,"severity":"high","line_start":160},{"id":"filesystem:SKILL.md:161:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"\"audio_url\": [\"https://.../voice-tone.mp3\"],","category":"filesystem","line_end":161,"severity":"high","line_start":161},{"id":"filesystem:SKILL.md:201:hidden-file-in-home-directory","file":"SKILL.md","pattern":"Hidden file in home directory","snippet":"- **Token storage**: `runcomfy login` writes the API token to `~/.config/runcomfy/token.json` with m","category":"filesystem","line_end":201,"severity":"high","line_start":201},{"id":"filesystem:SKILL.md:201:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"- **Token storage**: `runcomfy login` writes the API token to `~/.config/runcomfy/token.json` with m","category":"filesystem","line_end":201,"severity":"medium","line_start":201},{"id":"blocker:SKILL.md:108:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"| `negative_prompt` | string | no | — | Concrete issues to avoid (e.g. \"no subtitles, no flicker\"). ","category":"blocker","line_end":108,"severity":"low","line_start":108}],"finding_verdicts":[{"id":"external_commands:SKILL.md:9:ruby-shell-backtick-execution","reason":"The backticks format the parameter name `audio_url` in Markdown. They do not execute Ruby or shell code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","reason":"The skill explicitly states that it calls the local RunComfy CLI. This is intended external process execution with model identifiers selected by the workflow.","verdict":"confirmed","severity":"medium","confidence":0.98},{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","reason":"The fenced example invokes `npx skills add` against a community repository. Executing it downloads and installs remote skill content.","verdict":"confirmed","severity":"medium","confidence":0.97},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","reason":"Line 29 is the closing delimiter of a Markdown code block. The delimiter itself performs no command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"The backticks format the `audio_url` field in a model-selection table. They are Markdown syntax, not executable code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","reason":"The backticks format the `audio_url` field in prose. No shell or Ruby evaluation occurs.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:48:ruby-shell-backtick-execution","reason":"The prerequisite directs users to install `@runcomfy/cli` globally with npm. This executes package installation code from an external registry.","verdict":"confirmed","severity":"medium","confidence":0.99},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","reason":"The prerequisite directs users to run `runcomfy login`, which starts an external CLI and browser authentication flow.","verdict":"confirmed","severity":"medium","confidence":0.98},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","reason":"The backticks document an environment variable assignment placeholder. The Markdown text does not execute a command or expose a real token.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","reason":"The backticks format a fixed model identifier. This line is descriptive metadata and does not invoke the model.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"The backticks format an input field name in a Markdown schema table. There is no command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","reason":"The backticks format the `prompt` field in a Markdown table. They are not shell substitution syntax in this context.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"The backticks format resolution field names and allowed values. The table contains no executable expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:66:ruby-shell-backtick-execution","reason":"The backticks format the `duration` field in documentation. No command is evaluated.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","reason":"The backticks format the `seed` field in documentation. No shell or Ruby execution exists.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:68:ruby-shell-backtick-execution","reason":"The backticks format the `watermark` field in a Markdown table. This is non-executable documentation.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:74:ruby-shell-backtick-execution","reason":"The fenced block contains a `runcomfy run` invocation that submits an image URL and prompt to a remote model. This is intended external command execution.","verdict":"confirmed","severity":"medium","confidence":0.98},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","reason":"Line 81 closes the shell example with a Markdown fence. The delimiter is not an additional command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","reason":"The heading uses backticks to format the `audio_url` parameter. It does not execute shell code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","reason":"The line formats fixed endpoint and field names as inline code. It describes routing and does not itself invoke a command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:103:ruby-shell-backtick-execution","reason":"The backticks format the `prompt` schema field. This is a documentation table, not executable code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:104:ruby-shell-backtick-execution","reason":"The backticks format the `audio_url` schema field. No shell substitution occurs.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:105:ruby-shell-backtick-execution","reason":"The backticks format allowed aspect-ratio values in a Markdown table. They are non-executable.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","reason":"The backticks format resolution names and values. The line contains no command invocation.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:107:ruby-shell-backtick-execution","reason":"The backticks format duration schema values. They are Markdown, not Ruby or shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:108:ruby-shell-backtick-execution","reason":"The backticks format the `negative_prompt` parameter. This table row is descriptive and performs no execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:109:ruby-shell-backtick-execution","reason":"The backticks format the `seed` parameter in documentation. No command is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:113:ruby-shell-backtick-execution","reason":"The fenced block invokes the RunComfy CLI and submits a prompt plus voiceover URL to a remote model. This is intended external command execution.","verdict":"confirmed","severity":"medium","confidence":0.98},{"id":"external_commands:SKILL.md:122:ruby-shell-backtick-execution","reason":"Line 122 is the closing Markdown fence for the Wan invocation example. It does not execute another command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","reason":"The backticks format the `duration` parameter in a prompting tip. This is non-executable prose.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:128:ruby-shell-backtick-execution","reason":"The backticks format a parameter name and example value in documentation. They do not invoke a shell.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:129:ruby-shell-backtick-execution","reason":"The backticks identify the `audio_url` parameter in prose. No executable construct is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","reason":"The backticks format a fixed Seedance model identifier. The line is model documentation, not an invocation.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:143:ruby-shell-backtick-execution","reason":"The backticks format the `prompt` field in a Markdown schema table. No command execution occurs.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","reason":"The backticks format `image_url` and its default array. They are documentation syntax only.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:145:ruby-shell-backtick-execution","reason":"The backticks format `video_url` and its default array in a table. Nothing is executed.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:146:ruby-shell-backtick-execution","reason":"The backticks format `audio_url` and its default array. This is non-executable Markdown.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:147:ruby-shell-backtick-execution","reason":"The backticks format aspect-ratio names and allowed values. The schema table does not execute code.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:148:ruby-shell-backtick-execution","reason":"The backticks format the `duration` field. This is documentation and has no execution behavior.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","reason":"The backticks format resolution field values in a Markdown table. No shell evaluation occurs.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:150:ruby-shell-backtick-execution","reason":"The backticks format the `generate_audio` field in documentation. They are not executable backticks.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","reason":"The backticks format the `seed` field in a schema table. No command is evaluated.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:155:ruby-shell-backtick-execution","reason":"The fenced block invokes the RunComfy CLI with image, video, and audio references. This is intended external execution and remote data submission.","verdict":"confirmed","severity":"medium","confidence":0.98},{"id":"external_commands:SKILL.md:165:ruby-shell-backtick-execution","reason":"Line 165 closes the Seedance shell example with a Markdown fence. It is not an additional command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:169:ruby-shell-backtick-execution","reason":"The backticks format input field names within a prompting tip. The prose is not executable.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:170:ruby-shell-backtick-execution","reason":"The backticks delimit an example natural-language prompt. They do not perform command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:180:ruby-shell-backtick-execution","reason":"The backticks format other skill names in routing documentation. This line contains no executable command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:197:ruby-shell-backtick-execution","reason":"The line states that the workflow invokes `runcomfy run`, polls a remote request, and downloads results. This confirms intended external process and network activity.","verdict":"confirmed","severity":"medium","confidence":0.99},{"id":"external_commands:SKILL.md:201:ruby-shell-backtick-execution","reason":"The backticks document a login command and token path within a security disclosure. This line does not itself execute the command.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:202:ruby-shell-backtick-execution","reason":"The backticks format the `--input` option while explaining CLI behavior. They are inline Markdown rather than command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:204:ruby-shell-backtick-execution","reason":"The backticks format documented domain patterns. The text does not execute a command.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:17:hardcoded-url","reason":"This is the skill homepage in frontmatter. Declaring a homepage does not initiate a network request.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:23:hardcoded-url","reason":"These are visible Markdown links to RunComfy model pages and GitHub. The links are not fetched automatically by the skill.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:77:hardcoded-url","reason":"The value `https://.../portrait.jpg` is an explicit placeholder for a user-supplied image URL, not a hardcoded destination.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:117:hardcoded-url","reason":"The value `https://.../voiceover-en.mp3` is a placeholder for user media. It does not identify a real hardcoded host.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:159:hardcoded-url","reason":"The subject image URL uses an ellipsis placeholder and has no real hostname. It is not a fixed network endpoint.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:160:hardcoded-url","reason":"The reference video URL is a placeholder with no real host. Users must replace it with their own media URL.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:161:hardcoded-url","reason":"The reference audio URL is a placeholder with no real host. It is not a hardcoded external destination.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:193:hardcoded-url","reason":"This is a visible troubleshooting documentation link. The skill does not instruct automatic retrieval of that page.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:77:path-traversal-sequence","reason":"The three periods occur inside a placeholder HTTPS URL. They are not `../` traversal segments or a local filesystem path.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:117:path-traversal-sequence","reason":"The ellipsis is part of a placeholder media URL. It does not traverse parent directories.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:159:path-traversal-sequence","reason":"The scanner matched an ellipsis within a placeholder HTTPS URL. No filesystem traversal sequence is present.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:160:path-traversal-sequence","reason":"The placeholder video URL contains an ellipsis, not a parent-directory path. It cannot traverse the local filesystem.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:161:path-traversal-sequence","reason":"The placeholder audio URL contains an ellipsis, not a `../` path segment. No filesystem traversal is described.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:201:hidden-file-in-home-directory","reason":"The line discloses standard CLI credential storage under `~/.config` with owner-only mode 0600. It does not hide or maliciously plant a file.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:201:hidden-file-access","reason":"The skill documents where the separate RunComfy CLI stores its token and offers an environment-variable alternative. It does not directly access hidden files.","verdict":"false_positive","confidence":0.97},{"id":"blocker:SKILL.md:108:system-reconnaissance","reason":"The phrase `no subtitles, no flicker` is an example negative video-generation prompt. It gathers no system or environment information.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[{"title":"User Media Sent to a Third-Party Service","severity":"medium","locations":[{"file":"SKILL.md","line_end":204,"line_start":197}],"confidence":0.98,"description":"The CLI submits prompts to RunComfy, and its model server fetches user-provided image, audio, and video URLs. This creates a disclosed privacy and authorization risk.","confidence_reasoning":"The skill explicitly describes API submission, remote media fetching, polling, and output downloads. The third-party processing path is direct and unambiguous."}],"subject_marketplace_commit_sha":"9e952417e76879bc9d853e1b8b2cd6d6d8d4a1c2","subject_content_hash":"7a97ff688209d3cad39a9d84b284b209c3b3cdcc775fb91b4711b2eb1555ad7b","subject_tree_hash":"9c50b2b32907fb02cb6ae3b02f8a7328ca6eaf4054b376100afa5591b5492007","subject_plugin_path":"skills/skills-collective/image-to-video","audit_payload_hash":"3e28e4549ca36a9b5535fc6f6eafa6c5","confirmed_risk_level":"medium","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"9e952417e76879bc9d853e1b8b2cd6d6d8d4a1c2","contentHash":"7a97ff688209d3cad39a9d84b284b209c3b3cdcc775fb91b4711b2eb1555ad7b","treeHash":"9c50b2b32907fb02cb6ae3b02f8a7328ca6eaf4054b376100afa5591b5492007","pluginPath":"skills/skills-collective/image-to-video","auditPayloadHash":"3e28e4549ca36a9b5535fc6f6eafa6c5"},"scannerVersion":"3.0.0","policyVersion":"skillstore-security-audit-policy-v1"},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"issued","url":"/api/skills/skills-collective-image-to-video/audits/3/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"medium","confirmedFindingCount":1,"capabilityReviewCount":8,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}