{"data":{"skill":{"slug":"aaron-he-zhu-serp-analysis","name":"serp-analysis","icon":"📦","repo":"https://github.com/aaron-he-zhu/aaron-marketing-skills/tree/main/seo-geo/research/serp-analysis","status":"approved","author":"aaron-he-zhu","authorVersion":"17.0.0","skillstoreRevision":1},"audit":{"id":"1d150c92-bbe4-449d-a944-ce9bbd014ca7","skill_id":"7e098604-b0d8-4641-adcc-302bac78d83e","version":5,"content_hash":"v3:d71c7417a35d5c2624161bd2fe8de8a41a362128:8be56dbf45baca714e7faf9b0e6a66ecbfded24f7dc38ed6067f5e0227688f17:b5f6a3ce420ed86e0c24ae133d40855276b4f7c4ed75e7bdc6221a0e4bc2524f:736b696c6c732f6161726f6e2d68652d7a68752f736572702d616e616c79736973:cd527b841c1774c3813f8bc4c4bdf364","risk_level":"safe","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Two command findings are confirmed because the skill directs agents to execute connector scripts outside the audited package, which also initiate network searches. The other 26 alerts are Markdown fences, documentation links, local output paths, or harmless metadata references, and no semantic threat was found.","remediation":[{"issue":"The live-search instructions execute connector scripts that are outside the audited skill package.","severity":"medium","suggestion":"Bundle and review the connector scripts, or use a host-approved search tool with explicit user consent before network access."},{"issue":"The declared WebFetch tool contract does not cover the documented Python commands.","severity":"medium","suggestion":"Remove the shell commands or declare the required command and network capabilities so users can make an informed installation decision."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":25,"line_start":23},{"file":"SKILL.md","line_end":27,"line_start":25},{"file":"SKILL.md","line_end":29,"line_start":27},{"file":"SKILL.md","line_end":33,"line_start":29},{"file":"SKILL.md","line_end":37,"line_start":33},{"file":"SKILL.md","line_end":37,"line_start":37},{"file":"SKILL.md","line_end":49,"line_start":49},{"file":"SKILL.md","line_end":51,"line_start":51},{"file":"SKILL.md","line_end":84,"line_start":82},{"file":"SKILL.md","line_end":88,"line_start":84},{"file":"SKILL.md","line_end":90,"line_start":88},{"file":"SKILL.md","line_end":94,"line_start":90},{"file":"SKILL.md","line_end":96,"line_start":94},{"file":"SKILL.md","line_end":100,"line_start":96},{"file":"SKILL.md","line_end":102,"line_start":100},{"file":"SKILL.md","line_end":116,"line_start":102},{"file":"SKILL.md","line_end":116,"line_start":116}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":10,"line_start":10},{"file":"SKILL.md","line_end":14,"line_start":14}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":39,"line_start":39},{"file":"SKILL.md","line_end":43,"line_start":43},{"file":"SKILL.md","line_end":47,"line_start":47},{"file":"SKILL.md","line_end":49,"line_start":49},{"file":"SKILL.md","line_end":112,"line_start":112},{"file":"SKILL.md","line_end":116,"line_start":116},{"file":"SKILL.md","line_end":123,"line_start":123},{"file":"SKILL.md","line_end":127,"line_start":127}]},{"factor":"env_access","evidence":[{"file":"SKILL.md","line_end":49,"line_start":49}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":49,"line_start":49}],"confidence":0.88,"description":"**Zero-dependency live SERP (keyless)**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connectors/firecraw","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"Line 49 instructs the agent to run a Python connector outside this audited skill package and perform a live network search. The connector implementation is unavailable here, so its command and data-handling behavior cannot be verified."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":51,"line_start":51}],"confidence":0.88,"description":"**Second keyless engine for corroboration**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connectors/tavi","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"Line 51 instructs the agent to execute another external Python connector that performs network searches and optional answer synthesis. The referenced script is outside the audited files."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":4,"total_lines":416,"audit_model":"codex","audited_at":"2026-07-12T14:02:46.143+00:00","created_at":"2026-07-14T15:54:05.824109+00:00","static_findings":[{"id":"external_commands:SKILL.md:23:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":25,"severity":"medium","line_start":23},{"id":"external_commands:SKILL.md:25:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":27,"severity":"medium","line_start":25},{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","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":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":"**Expected output**: a prioritized SERP brief plus the standard handoff summary for `memory/research","category":"external_commands","line_end":37,"severity":"medium","line_start":33},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Promotes**: durable keyword priorities, competitor facts, and pending strategy decisions to `mem","category":"external_commands","line_end":37,"severity":"medium","line_start":37},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Zero-dependency live SERP (keyless)**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connectors/firecraw","category":"external_commands","line_end":49,"severity":"medium","line_start":49},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Second keyless engine for corroboration**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connectors/tavi","category":"external_commands","line_end":51,"severity":"medium","line_start":51},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":84,"severity":"medium","line_start":82},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":88,"severity":"medium","line_start":84},{"id":"external_commands:SKILL.md:88:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":90,"severity":"medium","line_start":88},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","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":"```","category":"external_commands","line_end":96,"severity":"medium","line_start":94},{"id":"external_commands:SKILL.md:96:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":100,"severity":"medium","line_start":96},{"id":"external_commands:SKILL.md:100:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":102,"severity":"medium","line_start":100},{"id":"external_commands:SKILL.md:102:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":116,"severity":"medium","line_start":102},{"id":"external_commands:SKILL.md:116:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Write path: `memory/research/serp-analysis/YYYY-MM-DD-<topic>.md`; promote durable difficulty/intent","category":"external_commands","line_end":116,"severity":"medium","line_start":116},{"id":"network:SKILL.md:10:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"homepage: \"https://github.com/aaron-he-zhu/aaron-marketing-skills\"","category":"network","line_end":10,"severity":"low","line_start":10},{"id":"network:SKILL.md:14:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"metadata: {\"author\": \"aaron-he-zhu\", \"version\": \"17.0.0\", \"discipline\": \"seo-geo\", \"phase\": \"researc","category":"network","line_end":14,"severity":"low","line_start":14},{"id":"filesystem:SKILL.md:39:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- **Primary next skill**: [content-writer](../../build/content-writer/SKILL.md) when the user is rea","category":"filesystem","line_end":39,"severity":"high","line_start":39},{"id":"filesystem:SKILL.md:43:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"> Emit the standard shape from [skill-contract.md §Handoff Summary Format](../../../references/skill","category":"filesystem","line_end":43,"severity":"high","line_start":43},{"id":"filesystem:SKILL.md:47:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"Optional integrations: ~~SEO tool, ~~search console, ~~AI monitor. Before fetching third-party SERP ","category":"filesystem","line_end":47,"severity":"high","line_start":47},{"id":"filesystem:SKILL.md:49:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"**Zero-dependency live SERP (keyless)**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connectors/firecraw","category":"filesystem","line_end":49,"severity":"high","line_start":49},{"id":"filesystem:SKILL.md:112:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"See [references/platforms/youtube.md](../../../references/platforms/youtube.md) for YouTube-as-citat","category":"filesystem","line_end":112,"severity":"high","line_start":112},{"id":"filesystem:SKILL.md:116:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"Write path: `memory/research/serp-analysis/YYYY-MM-DD-<topic>.md`; promote durable difficulty/intent","category":"filesystem","line_end":116,"severity":"high","line_start":116},{"id":"filesystem:SKILL.md:123:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- [YouTube as citation surface](../../../references/platforms/youtube.md) — Video SERP / outlier pac","category":"filesystem","line_end":123,"severity":"high","line_start":123},{"id":"filesystem:SKILL.md:127:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"Primary: [content-writer](../../build/content-writer/SKILL.md).","category":"filesystem","line_end":127,"severity":"high","line_start":127},{"id":"env_access:SKILL.md:49:generic-api-secret-keys","file":"SKILL.md","pattern":"Generic API/secret keys","snippet":"**Zero-dependency live SERP (keyless)**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connectors/firecraw","category":"env_access","line_end":49,"severity":"high","line_start":49}],"finding_verdicts":[{"id":"external_commands:SKILL.md:23:ruby-shell-backtick-execution","reason":"Lines 23-25 are a fenced Markdown example containing a natural-language prompt. They do not invoke Ruby, a shell, or any executable.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:25:ruby-shell-backtick-execution","reason":"Line 25 closes a Markdown code fence around a prompt example. No shell expression or command execution is present.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:27:ruby-shell-backtick-execution","reason":"Lines 27-29 are another fenced natural-language prompt example. The backticks are Markdown formatting, not shell execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:29:ruby-shell-backtick-execution","reason":"Line 29 closes a Markdown code fence and does not execute its contents. No external command is specified.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","reason":"The backticks format the memory/research path in prose. The line contains no shell syntax or executable invocation.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","reason":"The backticks identify three documentation paths for saved research. They are not Ruby backticks or command substitutions.","verdict":"false_positive","confidence":0.98},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","reason":"Line 49 instructs the agent to run a Python connector outside this audited skill package and perform a live network search. The connector implementation is unavailable here, so its command and data-handling behavior cannot be verified.","verdict":"confirmed","severity":"medium","confidence":0.88},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","reason":"Line 51 instructs the agent to execute another external Python connector that performs network searches and optional answer synthesis. The referenced script is outside the audited files.","verdict":"confirmed","severity":"medium","confidence":0.88},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","reason":"Lines 82-84 are a fenced natural-language prompt for comparing keywords. They contain no executable command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:84:ruby-shell-backtick-execution","reason":"Line 84 closes a Markdown prompt fence. It does not perform shell or Ruby execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:88:ruby-shell-backtick-execution","reason":"Lines 88-90 contain a natural-language historical analysis prompt inside a Markdown fence. No external command is invoked.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","reason":"Line 90 is only the closing delimiter for a Markdown prompt example. It has no executable semantics.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:94:ruby-shell-backtick-execution","reason":"Lines 94-96 are a fenced natural-language location comparison prompt. They do not contain a program or shell command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:96:ruby-shell-backtick-execution","reason":"Line 96 closes a Markdown code fence and does not execute any content.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:100:ruby-shell-backtick-execution","reason":"Lines 100-102 present a natural-language mobile and desktop comparison prompt. The fence is formatting only.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:102:ruby-shell-backtick-execution","reason":"Line 102 closes the Markdown prompt example. It does not invoke an interpreter or external process.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:116:ruby-shell-backtick-execution","reason":"Backticks format local output paths in documentation. The line requests a file write but contains no external command.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:10:hardcoded-url","reason":"The URL is project homepage metadata pointing to the author's GitHub repository. It does not trigger a request or transmit data.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:14:hardcoded-url","reason":"The URL appears inside package metadata as the project homepage. It is descriptive metadata, not executable network behavior.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:39:path-traversal-sequence","reason":"The parent-directory sequence is a static Markdown link to a related skill. It is not constructed from user input or used in a filesystem operation.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:43:path-traversal-sequence","reason":"The sequence occurs in a Markdown link to shared documentation. No runtime path resolution or file access instruction is present.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:47:path-traversal-sequence","reason":"The parent-directory paths are fixed links to security and connector documentation. They do not accept user-controlled path segments.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:49:path-traversal-sequence","reason":"The command uses a fixed connector path beneath CLAUDE_PLUGIN_ROOT and the line has no parent-directory traversal. External execution is separately confirmed for this line.","verdict":"false_positive","confidence":0.96},{"id":"filesystem:SKILL.md:112:path-traversal-sequence","reason":"This is a fixed Markdown link to a YouTube reference document. It does not use untrusted input or perform a filesystem operation.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:116:path-traversal-sequence","reason":"The documented write target stays under memory/research, and the topic placeholder names a report rather than authorizing directory traversal. No parent-directory sequence appears in the write path.","verdict":"false_positive","confidence":0.94},{"id":"filesystem:SKILL.md:123:path-traversal-sequence","reason":"The sequence is part of a fixed Markdown link to shared reference material. It is not passed to a filesystem API.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:127:path-traversal-sequence","reason":"The parent-directory path is a static Markdown link to the content-writer skill. It is not a user-controlled file access operation.","verdict":"false_positive","confidence":0.98},{"id":"env_access:SKILL.md:49:generic-api-secret-keys","reason":"The command expands CLAUDE_PLUGIN_ROOT only to locate a connector, while FIRECRAWL_API_KEY is mentioned as an optional configuration name. The line does not read, print, or transmit a secret value.","verdict":"false_positive","confidence":0.93}],"semantic_findings":[],"subject_marketplace_commit_sha":"d71c7417a35d5c2624161bd2fe8de8a41a362128","subject_content_hash":"8be56dbf45baca714e7faf9b0e6a66ecbfded24f7dc38ed6067f5e0227688f17","subject_tree_hash":"b5f6a3ce420ed86e0c24ae133d40855276b4f7c4ed75e7bdc6221a0e4bc2524f","subject_plugin_path":"skills/aaron-he-zhu/serp-analysis","audit_payload_hash":"cd527b841c1774c3813f8bc4c4bdf364","confirmed_risk_level":null,"scanner_version":null,"policy_version":null,"subject":{"marketplaceCommitSha":"d71c7417a35d5c2624161bd2fe8de8a41a362128","contentHash":"8be56dbf45baca714e7faf9b0e6a66ecbfded24f7dc38ed6067f5e0227688f17","treeHash":"b5f6a3ce420ed86e0c24ae133d40855276b4f7c4ed75e7bdc6221a0e4bc2524f","pluginPath":"skills/aaron-he-zhu/serp-analysis","auditPayloadHash":"cd527b841c1774c3813f8bc4c4bdf364"},"scannerVersion":null,"policyVersion":null},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"not_attestable","url":null,"status":null,"reason":"confirmed_risk_level does not match the canonical trust resolver"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"safe","confirmedFindingCount":0,"capabilityReviewCount":2,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"not_attestable","verificationState":"not_verified"},"isLatest":true}}