{"data":{"skill":{"slug":"prime-skills-nano-banana-2","name":"nano-banana-2","icon":"📦","repo":"https://github.com/prime-skills/runcomfy-agent-skills/tree/fca19ae084c2ae4667f5c8affbb99da5103d5832/nano-banana-2","status":"approved","author":"prime-skills","authorVersion":null,"skillstoreRevision":1},"audit":{"id":"f90e1183-998f-44e9-8a0b-de784ef9a289","skill_id":"c22a6105-ccfd-4b86-b9a4-e1bcfb92b128","version":1,"content_hash":"v3:82e420d34e563f97415f9311e0073bed4fd28da1:794b82e5f8cc0dcac5c350127ac44b3134c1f1af6d83a46b2dc1cf00f2dc8db3:089c69126483a7f09c66ea0a2b6b62291e400df93af72694533dc7376e4f2798:736b696c6c732f7072696d652d736b696c6c732f6e616e6f2d62616e616e612d32:95b2969c8c87483f5a63e67102e281c9","risk_level":"high","is_blocked":false,"safe_to_publish":false,"analysis_status":"ok","agent_auto_install_policy":"confirmation_required","manual_install_policy":"allowed","summary":"All 51 static findings are false positives covering Markdown, documented service calls, normal credential storage, and model descriptions. A separate semantic finding identifies unsafe prompt interpolation in shell examples, compounded by an unsupported assurance that prompt content cannot cause shell injection. The external CLI implementation was unavailable, so its claimed protections were not independently verified.","remediation":[{"issue":"Shell examples embed arbitrary prompts inside single-quoted JSON arguments without shell-safe handling.","severity":"high","suggestion":"Serialize input with a JSON library and invoke the CLI with an argument array, without a shell; test apostrophes and shell metacharacters."},{"issue":"The input-boundary section claims no shell injection surface without addressing the calling shell.","severity":"medium","suggestion":"Distinguish CLI parsing from shell parsing and replace the blanket assurance with explicit safe invocation guidance."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":13,"line_start":13},{"file":"SKILL.md","line_end":29,"line_start":27},{"file":"SKILL.md","line_end":39,"line_start":29},{"file":"SKILL.md","line_end":50,"line_start":39},{"file":"SKILL.md","line_end":51,"line_start":50},{"file":"SKILL.md","line_end":52,"line_start":51},{"file":"SKILL.md","line_end":52,"line_start":52},{"file":"SKILL.md","line_end":60,"line_start":56},{"file":"SKILL.md","line_end":61,"line_start":60},{"file":"SKILL.md","line_end":62,"line_start":61},{"file":"SKILL.md","line_end":63,"line_start":62},{"file":"SKILL.md","line_end":63,"line_start":63},{"file":"SKILL.md","line_end":64,"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":70,"line_start":68},{"file":"SKILL.md","line_end":76,"line_start":70},{"file":"SKILL.md","line_end":80,"line_start":76},{"file":"SKILL.md","line_end":84,"line_start":80},{"file":"SKILL.md","line_end":93,"line_start":84},{"file":"SKILL.md","line_end":97,"line_start":93},{"file":"SKILL.md","line_end":106,"line_start":97},{"file":"SKILL.md","line_end":110,"line_start":106},{"file":"SKILL.md","line_end":117,"line_start":110},{"file":"SKILL.md","line_end":125,"line_start":117},{"file":"SKILL.md","line_end":127,"line_start":125},{"file":"SKILL.md","line_end":144,"line_start":127},{"file":"SKILL.md","line_end":151,"line_start":144},{"file":"SKILL.md","line_end":155,"line_start":151},{"file":"SKILL.md","line_end":159,"line_start":155},{"file":"SKILL.md","line_end":164,"line_start":159},{"file":"SKILL.md","line_end":168,"line_start":164},{"file":"SKILL.md","line_end":173,"line_start":168},{"file":"SKILL.md","line_end":181,"line_start":173},{"file":"SKILL.md","line_end":198,"line_start":181},{"file":"SKILL.md","line_end":198,"line_start":198},{"file":"SKILL.md","line_end":202,"line_start":202},{"file":"SKILL.md","line_end":205,"line_start":203},{"file":"SKILL.md","line_end":205,"line_start":205}]},{"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":194,"line_start":194},{"file":"SKILL.md","line_end":198,"line_start":198}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":70,"line_start":70},{"file":"SKILL.md","line_end":202,"line_start":202},{"file":"SKILL.md","line_end":202,"line_start":202}]}],"critical_findings":[],"high_findings":[{"title":"Unsafe Shell Interpolation Guidance for User Prompts","locations":[{"file":"SKILL.md","line_end":79,"line_start":76},{"file":"SKILL.md","line_end":93,"line_start":84},{"file":"SKILL.md","line_end":203,"line_start":203}],"confidence":0.86,"description":"Examples embed '<user prompt>' inside single-quoted JSON shell arguments without escaping guidance. Verbatim substitution permits apostrophes to terminate shell quoting and introduce commands. The claim 'No shell injection surface from prompt content' overlooks parsing by the calling shell.","review_kind":"security","source_category":"semantic","source_severity":"high","confidence_reasoning":"The examples visibly place prompt placeholders inside shell single quotes, and the safety claim ignores caller-side parsing. Exploitation depends on verbatim substitution; no executable wrapper was supplied."}],"medium_findings":[],"low_findings":[],"dangerous_patterns":[],"files_scanned":1,"total_lines":207,"audit_model":"codex","audited_at":"2026-11-01T14:40:55.948+00:00","created_at":"2026-11-01T15:21:10.468253+00:00","static_findings":[{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`runcomfy run google/nano-banana-2/text-to-image` through the local","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":39,"severity":"medium","line_start":29},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| Web-grounded image (current events / real entities) | **Nano Banana 2** + `enable_web_search` |","category":"external_commands","line_end":50,"severity":"medium","line_start":39},{"id":"external_commands:SKILL.md:50: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":51,"severity":"medium","line_start":50},{"id":"external_commands:SKILL.md:51: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":52,"severity":"medium","line_start":51},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"3. **CI / containers** — set `RUNCOMFY_TOKEN=<token>` instead of `runcomfy login`.","category":"external_commands","line_end":52,"severity":"medium","line_start":52},{"id":"external_commands:SKILL.md:56:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"### `google/nano-banana-2/text-to-image`","category":"external_commands","line_end":60,"severity":"medium","line_start":56},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `prompt` | string | yes | — | Subject-first description. |","category":"external_commands","line_end":61,"severity":"medium","line_start":60},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `num_images` | int | no | 1 | 1–4. Use 4 for ideation rounds. |","category":"external_commands","line_end":62,"severity":"medium","line_start":61},{"id":"external_commands:SKILL.md:62:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `seed` | int | no | 0 | Reuse for reproducibility. |","category":"external_commands","line_end":63,"severity":"medium","line_start":62},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `aspect_ratio` | enum | no | `auto` | `auto`, `21:9`, `16:9`, `3:2`, `4:3`, `5:4`, `1:1`, `4:5`, `","category":"external_commands","line_end":63,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `resolution` | enum | no | `1K` | `0.5K` (drafts), `1K` (default), `2K` (final), `4K` (max). |","category":"external_commands","line_end":64,"severity":"medium","line_start":64},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `output_format` | enum | no | `png` | `png`, `jpeg`, `webp`. |","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":"| `safety_tolerance` | int | no | 4 | 1 (strict) – 6 (permissive). |","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":"| `limit_generations` | bool | no | true | Limit each prompt round to one generation. |","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":"| `enable_web_search` | bool | no | false | Adds web grounding (extra cost + latency). |","category":"external_commands","line_end":70,"severity":"medium","line_start":68},{"id":"external_commands:SKILL.md:70:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"For image edit (preserve subject + apply changes), see the sibling [`nano-banana-edit`](../nano-bana","category":"external_commands","line_end":76,"severity":"medium","line_start":70},{"id":"external_commands:SKILL.md:76:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":80,"severity":"medium","line_start":76},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":84,"severity":"medium","line_start":80},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":93,"severity":"medium","line_start":84},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":97,"severity":"medium","line_start":93},{"id":"external_commands:SKILL.md:97:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":106,"severity":"medium","line_start":97},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":110,"severity":"medium","line_start":106},{"id":"external_commands:SKILL.md:110:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":117,"severity":"medium","line_start":110},{"id":"external_commands:SKILL.md:117:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":125,"severity":"medium","line_start":117},{"id":"external_commands:SKILL.md:125:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Consistent seeds for refinement.** Lock `seed` when iterating a single prompt across small variant","category":"external_commands","line_end":127,"severity":"medium","line_start":125},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Web-grounding, sparingly.** Turn on `enable_web_search` only when the prompt names current events ","category":"external_commands","line_end":144,"severity":"medium","line_start":127},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| **Web-grounded current-event imagery** | `enable_web_search` integrates fresh info |","category":"external_commands","line_end":151,"severity":"medium","line_start":144},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","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":"```","category":"external_commands","line_end":159,"severity":"medium","line_start":155},{"id":"external_commands:SKILL.md:159:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":164,"severity":"medium","line_start":159},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":168,"severity":"medium","line_start":164},{"id":"external_commands:SKILL.md:168:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":173,"severity":"medium","line_start":168},{"id":"external_commands:SKILL.md:173:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":181,"severity":"medium","line_start":173},{"id":"external_commands:SKILL.md:181:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **For image edit, use the `/edit` endpoint** — not this one.","category":"external_commands","line_end":198,"severity":"medium","line_start":181},{"id":"external_commands:SKILL.md:198:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The skill invokes `runcomfy run google/nano-banana-2/text-to-image` with a JSON body matching the sc","category":"external_commands","line_end":198,"severity":"medium","line_start":198},{"id":"external_commands:SKILL.md:202: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":202,"severity":"medium","line_start":202},{"id":"external_commands:SKILL.md:203: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":205,"severity":"medium","line_start":203},{"id":"external_commands:SKILL.md:205: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":205,"severity":"medium","line_start":205},{"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=nano-ban","category":"network","line_end":23,"severity":"low","line_start":23},{"id":"network:SKILL.md:194: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":194,"severity":"low","line_start":194},{"id":"network:SKILL.md:198:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"The skill invokes `runcomfy run google/nano-banana-2/text-to-image` with a JSON body matching the sc","category":"network","line_end":198,"severity":"low","line_start":198},{"id":"filesystem:SKILL.md:70:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"For image edit (preserve subject + apply changes), see the sibling [`nano-banana-edit`](../nano-bana","category":"filesystem","line_end":70,"severity":"high","line_start":70},{"id":"filesystem:SKILL.md:202: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":202,"severity":"high","line_start":202},{"id":"filesystem:SKILL.md:202: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":202,"severity":"medium","line_start":202},{"id":"blocker:SKILL.md:9:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"(rapid iteration, in-image typography rendering, predictable framing,","category":"blocker","line_end":9,"severity":"low","line_start":9},{"id":"blocker:SKILL.md:25:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"Google **Nano Banana 2** — the flash-tier text-to-image model in the Gemini family — hosted on the *","category":"blocker","line_end":25,"severity":"low","line_start":25},{"id":"blocker:SKILL.md:37:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"| Rapid drafts, social thumbnails, batch variants | **Nano Banana 2** |","category":"blocker","line_end":37,"severity":"low","line_start":37},{"id":"blocker:SKILL.md:46:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"If the user said \"Nano Banana\" / \"nano-banana-2\" / \"Gemini image\" explicitly, route here regardless.","category":"blocker","line_end":46,"severity":"low","line_start":46}],"finding_verdicts":[{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","reason":"Backticks format the documented RunComfy command in Markdown; they are not Ruby execution or shell command substitution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","reason":"This is a Markdown fence around a standard skill installation example, not executable backtick substitution. No malicious installation behavior is shown.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","reason":"The closing Markdown fence and following model-selection table are documentation, not a backtick execution expression.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","reason":"The enable_web_search option is inline Markdown code in a model-selection table, not a command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","reason":"The npm command documents installation of the required CLI. Markdown backticks do not execute it, and no malicious package behavior is evidenced.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","reason":"The documented login command initiates the service authentication workflow; its backticks are Markdown formatting, not shell substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","reason":"The line documents a placeholder environment token and an alternative login command. It neither executes backticks nor exposes an actual secret.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:56:ruby-shell-backtick-execution","reason":"The endpoint identifier is formatted as inline code in a heading, not executed as a command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","reason":"The backticks identify the prompt field in a schema table. There is no executable expression.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","reason":"The num_images field is a documented image count, not shell or Ruby execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:62:ruby-shell-backtick-execution","reason":"The seed field is Markdown-formatted schema documentation for generation settings, not a command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"The line lists aspect ratio enum values as inline code. These literals do not execute.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","reason":"Resolution tier names are Markdown-formatted enum values, not shell substitutions.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"The output_format field lists supported file formats; backticks only distinguish literal names.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:66:ruby-shell-backtick-execution","reason":"The safety_tolerance field documents a service parameter. No executable backtick expression or instruction to bypass service controls appears.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","reason":"The limit_generations field describes a boolean setting, not command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:68:ruby-shell-backtick-execution","reason":"The optional web-search setting is inline schema documentation. Markdown backticks do not invoke network or shell operations.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:70:ruby-shell-backtick-execution","reason":"The sibling skill name is formatted inside a Markdown hyperlink. It is not an executable backtick expression.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:76:ruby-shell-backtick-execution","reason":"The detected backticks open a Markdown command example, not shell substitution. Unsafe placeholder handling is assessed separately as a semantic finding.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:80:ruby-shell-backtick-execution","reason":"This is a closing Markdown fence followed by another example heading, not executable backticks.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","reason":"The backticks delimit a Markdown batch-generation example. They are not Ruby execution or shell command substitution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:93:ruby-shell-backtick-execution","reason":"The line closes a Markdown code block; it does not execute its contents.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:97:ruby-shell-backtick-execution","reason":"This Markdown fence introduces an intended image-generation command, not a backtick execution construct.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:106:ruby-shell-backtick-execution","reason":"The closing code fence and next example heading are Markdown documentation, not executable shell syntax.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:110:ruby-shell-backtick-execution","reason":"The opening fence marks a documented web-grounded generation example. It is not shell backtick substitution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:117:ruby-shell-backtick-execution","reason":"The detected marker closes a Markdown block before prompting guidance; it does not execute a command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:125:ruby-shell-backtick-execution","reason":"The seed option is inline code within refinement guidance, not executable syntax.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:127:ruby-shell-backtick-execution","reason":"The enable_web_search name is Markdown-formatted guidance for an optional setting, not a shell command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:144:ruby-shell-backtick-execution","reason":"The table describes optional web grounding and uses inline code for a parameter name. No execution expression is present.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:151:ruby-shell-backtick-execution","reason":"This Markdown fence encloses a natural-language portrait prompt, not executable code.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:155:ruby-shell-backtick-execution","reason":"This closes the natural-language portrait prompt block. The Markdown delimiter does not run shell commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:159:ruby-shell-backtick-execution","reason":"The fence opens a product-card image prompt consisting of descriptive prose, not Ruby or shell code.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:164:ruby-shell-backtick-execution","reason":"The closing fence terminates an image prompt example. It is Markdown syntax rather than command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:168:ruby-shell-backtick-execution","reason":"The fence encloses a descriptive vertical-image prompt, not an executable expression.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:173:ruby-shell-backtick-execution","reason":"The backticks close a sample image prompt before a limitations section. There is no shell substitution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:181:ruby-shell-backtick-execution","reason":"The edit endpoint name is inline Markdown code in a limitation. It is not an executable command.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:198:ruby-shell-backtick-execution","reason":"Inline backticks identify the intended CLI command, service endpoint, and output option. They do not implement shell command substitution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:202:ruby-shell-backtick-execution","reason":"The backticks format a login command, credential path, and environment variable in prose. None is executed by this Markdown line.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:203:ruby-shell-backtick-execution","reason":"The --input option is formatted as inline code, not shell substitution. The misleading input-safety assurance is assessed in the semantic finding.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:205:ruby-shell-backtick-execution","reason":"The backticks delimit documented service hostnames. They do not execute commands, and the claimed whitelist cannot be verified from this file.","verdict":"false_positive","confidence":1},{"id":"network:SKILL.md:17:hardcoded-url","reason":"The URL is homepage metadata for the service used by this skill. It does not transmit information.","verdict":"false_positive","confidence":1},{"id":"network:SKILL.md:23:hardcoded-url","reason":"These are public service, model, and repository links. The marketing query parameters contain campaign identifiers, not user secrets.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:194:hardcoded-url","reason":"The URL links to CLI troubleshooting documentation. No automatic request or sensitive payload is specified.","verdict":"false_positive","confidence":1},{"id":"network:SKILL.md:198:hardcoded-url","reason":"The endpoint receives prompts for the explicitly requested hosted image-generation workflow. No unrelated destination or unauthorized data transfer is evidenced.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:70:path-traversal-sequence","reason":"The parent-directory segment is a Markdown link to a sibling skill, not input to a filesystem operation or an access-control bypass.","verdict":"false_positive","confidence":1},{"id":"filesystem:SKILL.md:202:hidden-file-in-home-directory","reason":"The path documents the CLI's own token storage with owner-only permissions. No unrelated credential harvesting or unauthorized hidden-file access is instructed.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:202:hidden-file-access","reason":"The hidden configuration path belongs to the documented authentication workflow. This line does not instruct reading or transmitting existing unrelated secrets.","verdict":"false_positive","confidence":0.98},{"id":"blocker:SKILL.md:9:system-reconnaissance","reason":"The text lists image-model strengths such as typography and framing. It does not inspect the operating system or environment.","verdict":"false_positive","confidence":1},{"id":"blocker:SKILL.md:25:system-reconnaissance","reason":"The paragraph describes a hosted image model and intended design tasks. No host enumeration or reconnaissance is present.","verdict":"false_positive","confidence":1},{"id":"blocker:SKILL.md:37:system-reconnaissance","reason":"The table recommends a model for drafts and thumbnails. It contains no system inspection instructions.","verdict":"false_positive","confidence":1},{"id":"blocker:SKILL.md:46:system-reconnaissance","reason":"This is task-specific model-routing guidance based on the user's named model and portrait needs, not system reconnaissance or audit manipulation.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[{"title":"Unsafe Shell Interpolation Guidance for User Prompts","severity":"high","locations":[{"file":"SKILL.md","line_end":79,"line_start":76},{"file":"SKILL.md","line_end":93,"line_start":84},{"file":"SKILL.md","line_end":203,"line_start":203}],"confidence":0.86,"description":"Examples embed '<user prompt>' inside single-quoted JSON shell arguments without escaping guidance. Verbatim substitution permits apostrophes to terminate shell quoting and introduce commands. The claim 'No shell injection surface from prompt content' overlooks parsing by the calling shell.","confidence_reasoning":"The examples visibly place prompt placeholders inside shell single quotes, and the safety claim ignores caller-side parsing. Exploitation depends on verbatim substitution; no executable wrapper was supplied."}],"subject_marketplace_commit_sha":"82e420d34e563f97415f9311e0073bed4fd28da1","subject_content_hash":"794b82e5f8cc0dcac5c350127ac44b3134c1f1af6d83a46b2dc1cf00f2dc8db3","subject_tree_hash":"089c69126483a7f09c66ea0a2b6b62291e400df93af72694533dc7376e4f2798","subject_plugin_path":"skills/prime-skills/nano-banana-2","audit_payload_hash":"95b2969c8c87483f5a63e67102e281c9","confirmed_risk_level":"high","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"82e420d34e563f97415f9311e0073bed4fd28da1","contentHash":"794b82e5f8cc0dcac5c350127ac44b3134c1f1af6d83a46b2dc1cf00f2dc8db3","treeHash":"089c69126483a7f09c66ea0a2b6b62291e400df93af72694533dc7376e4f2798","pluginPath":"skills/prime-skills/nano-banana-2","auditPayloadHash":"95b2969c8c87483f5a63e67102e281c9"},"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/prime-skills-nano-banana-2/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"high","confirmedFindingCount":1,"capabilityReviewCount":0,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"confirmation_required","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}