{"data":{"skill":{"slug":"antropos17-gif-cinema","name":"gif-cinema","icon":"📦","repo":"https://github.com/antropos17/chatgpt-gif-cinema/tree/cf7b09282e816c1efe73d3f570a81f37a95d7367/.agents/skills/gif-cinema","status":"approved","author":"antropos17","authorVersion":null,"skillstoreRevision":1,"license":null},"licenseCorrection":null,"audit":{"id":"91160c9c-1a54-4746-9be7-2164db61c278","skill_id":"c60b812d-e73c-4f33-9633-3df292943c35","version":1,"content_hash":"v3:c993c6abcbffafea2683d7748b53b3dfaf438415:20853cca11d73cdbc3470054fcec08fbf9133be3cbc5d1fdbc2cafd7ff3ce318:6d1b04b0f89195d770f20eceb2e6626e19e08da2b7397feb94f7ca2230d285c2:736b696c6c732f616e74726f706f7331372f6769662d63696e656d61:d52a9496fd33636f297434bc4e9ec4ea","risk_level":"safe","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"All 32 static findings are false positives in context: Markdown delimiters, offline subprocess tests, defensive credential handling, and documented setup links. No evidence found of prompt injection, credential exfiltration, or destructive behavior in the reviewed files. The external runtime is not included in this review; paid generation requires user authorization, billing, and model access.","remediation":[],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"scripts/smoke_test.py","line_end":27,"line_start":27},{"file":"scripts/smoke_test.py","line_end":64,"line_start":64},{"file":"SKILL.md","line_end":19,"line_start":17},{"file":"SKILL.md","line_end":23,"line_start":19},{"file":"SKILL.md","line_end":29,"line_start":23},{"file":"SKILL.md","line_end":33,"line_start":29},{"file":"SKILL.md","line_end":49,"line_start":33},{"file":"SKILL.md","line_end":50,"line_start":49},{"file":"SKILL.md","line_end":52,"line_start":50},{"file":"SKILL.md","line_end":55,"line_start":52},{"file":"SKILL.md","line_end":63,"line_start":55},{"file":"SKILL.md","line_end":65,"line_start":63},{"file":"SKILL.md","line_end":69,"line_start":65},{"file":"SKILL.md","line_end":71,"line_start":69},{"file":"SKILL.md","line_end":73,"line_start":71},{"file":"SKILL.md","line_end":81,"line_start":73},{"file":"SKILL.md","line_end":81,"line_start":81},{"file":"SKILL.md","line_end":85,"line_start":82},{"file":"SKILL.md","line_end":85,"line_start":85},{"file":"SKILL.md","line_end":94,"line_start":90},{"file":"SKILL.md","line_end":95,"line_start":94},{"file":"SKILL.md","line_end":99,"line_start":95}]},{"factor":"env_access","evidence":[{"file":"scripts/smoke_test.py","line_end":21,"line_start":21},{"file":"scripts/smoke_test.py","line_end":22,"line_start":22},{"file":"SKILL.md","line_end":74,"line_start":74}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":25,"line_start":25},{"file":"SKILL.md","line_end":31,"line_start":31},{"file":"SKILL.md","line_end":45,"line_start":45}]}],"critical_findings":[],"high_findings":[],"medium_findings":[],"low_findings":[],"dangerous_patterns":[],"files_scanned":4,"total_lines":283,"audit_model":"codex","audited_at":"2026-11-06T13:42:49.367+00:00","created_at":"2026-11-09T15:32:44.122278+00:00","static_findings":[{"id":"external_commands:scripts/smoke_test.py:27:python-subprocess-run","file":"scripts/smoke_test.py","pattern":"Python subprocess.run","snippet":"result = subprocess.run([sys.executable, \"-m\", \"gif_cinema\", *parts],","category":"external_commands","line_end":27,"severity":"high","line_start":27},{"id":"external_commands:scripts/smoke_test.py:64:python-subprocess-run","file":"scripts/smoke_test.py","pattern":"Python subprocess.run","snippet":"subprocess.run([\"ffmpeg\", \"-v\", \"error\", \"-xerror\", \"-i\", str(root / \"film.mp4\"),","category":"external_commands","line_end":64,"severity":"high","line_start":64},{"id":"env_access:scripts/smoke_test.py:21:python-environment-access","file":"scripts/smoke_test.py","pattern":"Python environment access","snippet":"env = os.environ.copy()","category":"env_access","line_end":21,"severity":"low","line_start":21},{"id":"env_access:scripts/smoke_test.py:22:generic-api-secret-keys","file":"scripts/smoke_test.py","pattern":"Generic API/secret keys","snippet":"env.pop(\"OPENAI_API_KEY\", None)","category":"env_access","line_end":22,"severity":"high","line_start":22},{"id":"blocker:scripts/smoke_test.py:41:system-reconnaissance","file":"scripts/smoke_test.py","pattern":"System reconnaissance","snippet":"raise ValueError(\"CLI output did not include a JSON object\")","category":"blocker","line_end":41,"severity":"low","line_start":41},{"id":"external_commands:SKILL.md:17:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```text","category":"external_commands","line_end":19,"severity":"medium","line_start":17},{"id":"external_commands:SKILL.md:19:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":23,"severity":"medium","line_start":19},{"id":"external_commands:SKILL.md:23:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```text","category":"external_commands","line_end":29,"severity":"medium","line_start":23},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":33,"severity":"medium","line_start":29},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Run this skill's `scripts/smoke_test.py --out NEW_DIRECTORY` with that environment's","category":"external_commands","line_end":49,"severity":"medium","line_start":33},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The skill includes a real three-shot astronaut example in `assets/example/`: three","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":"16-frame GPT GIFs plus `film.json`. From this skill's folder, run:","category":"external_commands","line_end":52,"severity":"medium","line_start":50},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```text","category":"external_commands","line_end":55,"severity":"medium","line_start":52},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":63,"severity":"medium","line_start":55},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```text","category":"external_commands","line_end":65,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":69,"severity":"medium","line_start":65},{"id":"external_commands:SKILL.md:69:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```text","category":"external_commands","line_end":71,"severity":"medium","line_start":69},{"id":"external_commands:SKILL.md:71:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":73,"severity":"medium","line_start":71},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"For authorized generation, use the agreed call cap and `--retries 0` initially.","category":"external_commands","line_end":81,"severity":"medium","line_start":73},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Use `endpoints SHOT.gif -o UNIQUE_PREFIX` to obtain `UNIQUE_PREFIX-last.png`.","category":"external_commands","line_end":81,"severity":"medium","line_start":81},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"For the next generated shot, the JSON `references` field accepts local still PNG,","category":"external_commands","line_end":85,"severity":"medium","line_start":82},{"id":"external_commands:SKILL.md:85:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"supports explicit references in `render`, not in the simple `generate` command.","category":"external_commands","line_end":85,"severity":"medium","line_start":85},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Then assemble accepted GIFs as `source` entries in a final import-only script.","category":"external_commands","line_end":94,"severity":"medium","line_start":90},{"id":"external_commands:SKILL.md:94:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"the target shot, then dry-run again. Execute with `--force-shot SHOT_ID`, an explicit call cap","category":"external_commands","line_end":95,"severity":"medium","line_start":94},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"and `--retries 0`. Accepted unchanged neighbors are reused by hash. The runtime","category":"external_commands","line_end":99,"severity":"medium","line_start":95},{"id":"network:SKILL.md:25:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"python -m pip install --no-build-isolation \"gif-cinema @ git+https://github.com/antropos17/chatgpt-g","category":"network","line_end":25,"severity":"low","line_start":25},{"id":"network:SKILL.md:31:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Keep the runtime's [evaluation license](https://github.com/antropos17/chatgpt-gif-cinema/blob/41c06d","category":"network","line_end":31,"severity":"low","line_start":31},{"id":"network:SKILL.md:45:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"Read the pinned runtime's [script schema](https://github.com/antropos17/chatgpt-gif-cinema/blob/41c0","category":"network","line_end":45,"severity":"low","line_start":45},{"id":"env_access:SKILL.md:74:generic-api-secret-keys","file":"SKILL.md","pattern":"Generic API/secret keys","snippet":"Read OPENAI_API_KEY from the user's environment without displaying or saving it.","category":"env_access","line_end":74,"severity":"high","line_start":74},{"id":"sensitive:SKILL.md:114:crypto-seed-private-key-mention","file":"SKILL.md","pattern":"Crypto seed/private key mention","snippet":"Describe remaining visual faults directly and keep private keys, prompts and","category":"sensitive","line_end":114,"severity":"high","line_start":114},{"id":"blocker:SKILL.md:61:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"Plan first, without a key or paid request:","category":"blocker","line_end":61,"severity":"low","line_start":61},{"id":"blocker:SKILL.md:77:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"errors and uncertain delivery need review before another paid attempt.","category":"blocker","line_end":77,"severity":"low","line_start":77}],"finding_verdicts":[{"id":"external_commands:scripts/smoke_test.py:27:python-subprocess-run","reason":"The helper invokes the documented CLI with an argument list, no shell, a timeout, and locally generated test inputs. Paid execution uses a zero-call cap, and the child environment excludes OPENAI_API_KEY.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:scripts/smoke_test.py:64:python-subprocess-run","reason":"FFmpeg decodes the newly assembled local test film into a null output to detect errors. The fixed argument list and timeout expose no shell injection or unrelated command execution.","verdict":"false_positive","confidence":0.99},{"id":"env_access:scripts/smoke_test.py:21:python-environment-access","reason":"The environment copy configures local test subprocesses, removes OPENAI_API_KEY, and redirects temporary files into the new output directory. No evidence found of environment logging or transmission.","verdict":"false_positive","confidence":0.97},{"id":"env_access:scripts/smoke_test.py:22:generic-api-secret-keys","reason":"env.pop removes OPENAI_API_KEY from the child environment without displaying or persisting its value. This prevents credential use during offline tests rather than stealing credentials.","verdict":"false_positive","confidence":1},{"id":"blocker:scripts/smoke_test.py:41:system-reconnaissance","reason":"This line raises a fixed error when CLI output lacks JSON. It neither enumerates the system nor collects host information.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:17:ruby-shell-backtick-execution","reason":"The backticks delimit a Markdown text block containing virtual-environment setup. They are not executable Ruby or shell command substitution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:19:ruby-shell-backtick-execution","reason":"This is a closing Markdown fence, followed by normal environment-activation instructions and another fenced example. The backticks do not execute commands.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:23:ruby-shell-backtick-execution","reason":"This Markdown fence introduces explicit installation and version-check commands for the declared runtime. It is not hidden backtick execution or an injected shell expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","reason":"The matched backticks close the documented setup block. Adjacent prose explains licensing and the smoke test, not shell command substitution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","reason":"Inline backticks identify the local smoke-test invocation and bundled example directory. The helper performs scoped offline checks and refuses an existing output directory.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","reason":"Backticks format the bundled example directory and script filename. They do not represent executable shell substitution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:50:ruby-shell-backtick-execution","reason":"The matched text names the example film script and introduces a fenced command example. This is Markdown formatting, not Ruby execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:52:ruby-shell-backtick-execution","reason":"The fenced example dry-runs and assembles bundled GIFs with --max-api-calls 0 into a designated output directory. No hidden command substitution is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","reason":"This closing Markdown fence precedes output-location guidance and another example. It does not trigger shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"This fenced text block documents a render dry-run without paid requests. Its delimiters are not executable backticks.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"The match spans Markdown fences around dry-run and source-only montage examples. No Ruby code or shell substitution is present.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:69:ruby-shell-backtick-execution","reason":"The fenced command assembles a source-only montage with an explicit zero API-call cap. This is documented task-related CLI use, not backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:71:ruby-shell-backtick-execution","reason":"The closing fence and inline retry option are Markdown formatting. Nearby instructions require authorization and an agreed call cap before paid generation.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:73:ruby-shell-backtick-execution","reason":"Inline code names retry controls and the endpoint-extraction command. The prose limits paid generation and protects the API key rather than executing hidden commands.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:81:ruby-shell-backtick-execution","reason":"Inline backticks document endpoint extraction and its output filename. They are not command substitution, and extraction directly supports shot continuity.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","reason":"Backticks name a script field and CLI subcommands while explaining local still-image references. No executable backtick expression is present.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:85:ruby-shell-backtick-execution","reason":"The words render and generate are formatted as inline command names to distinguish their reference support. This is explanatory Markdown, not code execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","reason":"Inline backticks mark the source field and the force-shot option in documented assembly and retake workflows. No shell substitution or unrelated command is present.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:94:ruby-shell-backtick-execution","reason":"The prose documents an explicit retake selector, call cap, and disabled retries. These are ordinary CLI options, not executable backticks.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","reason":"Inline code formats a retry option and the montage source field. The surrounding workflow preserves prior outputs for rollback rather than directing destructive commands.","verdict":"false_positive","confidence":1},{"id":"network:SKILL.md:25:hardcoded-url","reason":"The URL installs the declared public runtime from GitHub at a full commit hash in an isolated environment. No evidence found of secret transmission or an unrelated destination.","verdict":"false_positive","confidence":0.97},{"id":"network:SKILL.md:31:hardcoded-url","reason":"The URL links to the pinned runtime license and explains its evaluation restrictions. It is a documentation reference, not a data-upload endpoint.","verdict":"false_positive","confidence":1},{"id":"network:SKILL.md:45:hardcoded-url","reason":"The URL links to the pinned runtime script-format documentation needed for authoring film scripts. It carries no credentials or user data.","verdict":"false_positive","confidence":0.99},{"id":"env_access:SKILL.md:74:generic-api-secret-keys","reason":"Environment-based API authentication is explicitly scoped to authorized generation with an agreed call cap. The instruction prohibits displaying or saving the key; no unrelated credential destination is specified.","verdict":"false_positive","confidence":0.97},{"id":"sensitive:SKILL.md:114:crypto-seed-private-key-mention","reason":"The sentence instructs users to exclude private keys and other private material from public deliverables. It does not request wallet seeds, private-key collection, or disclosure.","verdict":"false_positive","confidence":1},{"id":"blocker:SKILL.md:61:system-reconnaissance","reason":"This heading recommends planning without a key or paid request. It contains no system-enumeration instruction.","verdict":"false_positive","confidence":1},{"id":"blocker:SKILL.md:77:system-reconnaissance","reason":"This sentence requires review of permission errors and uncertain request delivery before another paid attempt. It neither probes the host nor bypasses access controls.","verdict":"false_positive","confidence":1}],"semantic_findings":[],"subject_marketplace_commit_sha":"c993c6abcbffafea2683d7748b53b3dfaf438415","subject_content_hash":"20853cca11d73cdbc3470054fcec08fbf9133be3cbc5d1fdbc2cafd7ff3ce318","subject_tree_hash":"6d1b04b0f89195d770f20eceb2e6626e19e08da2b7397feb94f7ca2230d285c2","subject_plugin_path":"skills/antropos17/gif-cinema","audit_payload_hash":"d52a9496fd33636f297434bc4e9ec4ea","confirmed_risk_level":"safe","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"c993c6abcbffafea2683d7748b53b3dfaf438415","contentHash":"20853cca11d73cdbc3470054fcec08fbf9133be3cbc5d1fdbc2cafd7ff3ce318","treeHash":"6d1b04b0f89195d770f20eceb2e6626e19e08da2b7397feb94f7ca2230d285c2","pluginPath":"skills/antropos17/gif-cinema","auditPayloadHash":"d52a9496fd33636f297434bc4e9ec4ea"},"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/antropos17-gif-cinema/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"safe","confirmedFindingCount":0,"capabilityReviewCount":0,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}