{"data":{"skill":{"slug":"aaron-he-zhu-competitor-tracker","name":"competitor-tracker","icon":"📦","repo":"https://github.com/aaron-he-zhu/aaron-marketing-skills/tree/main/influencer/plan/competitor-tracker","status":"approved","author":"aaron-he-zhu","authorVersion":null,"skillstoreRevision":null},"audit":{"id":"cd0e0c77-1bb0-4e34-9ae0-dffdff3e5893","skill_id":"691ca742-4ea1-4c8a-9fa3-5b31575ca5ee","version":1,"content_hash":"121c2547b8977afcbfbdb480c8ebb5a0","risk_level":"medium","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"No prompt-injection or data-exfiltration intent was found in SKILL.md or references/templates.md. Most static findings are Markdown links, code fences, connector placeholders, or public documentation URLs. The only confirmed risks are optional shell commands in SKILL.md lines 59 and 61, which should require user confirmation before execution.","remediation":[{"issue":"Optional connector commands are embedded directly in SKILL.md.","severity":"medium","suggestion":"Mark the gdelt.py, youtube.py, and rss_monitor.py examples as manual-only, and require user confirmation before any connector command runs."},{"issue":"The YouTube connector note mentions an API key without secret-handling guidance.","severity":"low","suggestion":"Add a short note that API keys must stay local, should not be pasted into prompts, and must not be logged in reports."}],"risk_factor_evidence":[{"factor":"filesystem","evidence":[{"file":"references/templates.md","line_end":3,"line_start":3},{"file":"SKILL.md","line_end":38,"line_start":38},{"file":"SKILL.md","line_end":43,"line_start":43},{"file":"SKILL.md","line_end":47,"line_start":47},{"file":"SKILL.md","line_end":59,"line_start":59},{"file":"SKILL.md","line_end":63,"line_start":63},{"file":"SKILL.md","line_end":87,"line_start":87},{"file":"SKILL.md","line_end":88,"line_start":88},{"file":"SKILL.md","line_end":89,"line_start":89},{"file":"SKILL.md","line_end":90,"line_start":90},{"file":"SKILL.md","line_end":91,"line_start":91},{"file":"SKILL.md","line_end":95,"line_start":95},{"file":"SKILL.md","line_end":96,"line_start":96},{"file":"SKILL.md","line_end":97,"line_start":97}]},{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":26,"line_start":24},{"file":"SKILL.md","line_end":30,"line_start":26},{"file":"SKILL.md","line_end":32,"line_start":30},{"file":"SKILL.md","line_end":37,"line_start":32},{"file":"SKILL.md","line_end":38,"line_start":37},{"file":"SKILL.md","line_end":38,"line_start":38},{"file":"SKILL.md","line_end":55,"line_start":53},{"file":"SKILL.md","line_end":56,"line_start":55},{"file":"SKILL.md","line_end":57,"line_start":56},{"file":"SKILL.md","line_end":59,"line_start":57},{"file":"SKILL.md","line_end":61,"line_start":59},{"file":"SKILL.md","line_end":61,"line_start":61}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":10,"line_start":10},{"file":"SKILL.md","line_end":13,"line_start":13},{"file":"SKILL.md","line_end":61,"line_start":61}]},{"factor":"env_access","evidence":[{"file":"SKILL.md","line_end":61,"line_start":61}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":61,"line_start":59}],"confidence":0.78,"description":"**Keyless news read on rivals**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connectors/gdelt.py\" '\"<com","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"Line 59 instructs running python3 with a local gdelt.py connector and a user-supplied competitor string. It is an intentional external command with network-facing behavior, so host execution should require confirmation."},{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":61,"line_start":61}],"confidence":0.82,"description":"**Rival-partner channel watch (free key / keyless)**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connec","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"Line 61 instructs running python3 with a YouTube connector and mentions piping a YouTube RSS feed into rss_monitor.py. These are explicit external commands and data fetches, so they should not auto-run without consent."}],"low_findings":[],"dangerous_patterns":[],"files_scanned":2,"total_lines":551,"audit_model":"codex","audited_at":"2026-07-04T15:46:23.596+00:00","created_at":"2026-07-05T00:39:24.439904+00:00","static_findings":[{"id":"filesystem:references/templates.md:3:path-traversal-sequence","file":"references/templates.md","pattern":"Path traversal sequence","snippet":"Fill-in templates for each Instructions step in [../SKILL.md](../SKILL.md), plus extended usage note","category":"filesystem","line_end":3,"severity":"high","line_start":3},{"id":"blocker:references/templates.md:271:system-reconnaissance","file":"references/templates.md","pattern":"System reconnaissance","snippet":"| Paid partnerships | ✅/❌ | ✅/❌ | ✅/❌ |","category":"blocker","line_end":271,"severity":"low","line_start":271},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":26,"severity":"medium","line_start":24},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":30,"severity":"medium","line_start":26},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":32,"severity":"medium","line_start":30},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":37,"severity":"medium","line_start":32},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Writes**: a competitive intelligence report saved to `memory/influencer/competitor-tracker/YYYY-","category":"external_commands","line_end":38,"severity":"medium","line_start":37},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **Promotes**: durable facts (named competitors, their primary tiers/platforms, confirmed exclusive","category":"external_commands","line_end":38,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:53:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Where a tool could speed things up, use `~~` connector placeholders:","category":"external_commands","line_end":55,"severity":"medium","line_start":53},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `~~influencer database` — pull a competitor's known partner roster and tier mix.","category":"external_commands","line_end":56,"severity":"medium","line_start":55},{"id":"external_commands:SKILL.md:56:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `~~social platform analytics` — estimate reach, engagement rate, and post cadence per creator.","category":"external_commands","line_end":57,"severity":"medium","line_start":56},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `~~CRM` — cross-check whether a former competitor partner has already touched your pipeline.","category":"external_commands","line_end":59,"severity":"medium","line_start":57},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Keyless news read on rivals**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connectors/gdelt.py\" '\"<com","category":"external_commands","line_end":61,"severity":"medium","line_start":59},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"**Rival-partner channel watch (free key / keyless)**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connec","category":"external_commands","line_end":61,"severity":"medium","line_start":61},{"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:13:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"metadata: {\"author\": \"aaron-he-zhu\", \"version\": \"13.0.0\", \"discipline\": \"influencer\", \"phase\": \"plan","category":"network","line_end":13,"severity":"low","line_start":13},{"id":"network:SKILL.md:61:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"**Rival-partner channel watch (free key / keyless)**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connec","category":"network","line_end":61,"severity":"low","line_start":61},{"id":"filesystem:SKILL.md:38:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- **Promotes**: durable facts (named competitors, their primary tiers/platforms, confirmed exclusive","category":"filesystem","line_end":38,"severity":"high","line_start":38},{"id":"filesystem:SKILL.md:43:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- **Primary next skill**: [campaign-planner](../campaign-planner/SKILL.md)","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":"> Emit the standard shape from [skill-contract.md §Handoff Summary Format](../../../references/skill","category":"filesystem","line_end":47,"severity":"high","line_start":47},{"id":"filesystem:SKILL.md:59:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"**Keyless news read on rivals**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connectors/gdelt.py\" '\"<com","category":"filesystem","line_end":59,"severity":"high","line_start":59},{"id":"filesystem:SKILL.md:63:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"Label every estimate as an estimate. See [CONNECTORS.md](../../../CONNECTORS.md) for the keyless/fre","category":"filesystem","line_end":63,"severity":"high","line_start":63},{"id":"filesystem:SKILL.md:87:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- [skill-contract.md](../../../references/skill-contract.md) — shared contract and handoff summary f","category":"filesystem","line_end":87,"severity":"high","line_start":87},{"id":"filesystem:SKILL.md:88:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- [state-model.md](../../../references/state-model.md) — memory tiers and save-path conventions.","category":"filesystem","line_end":88,"severity":"high","line_start":88},{"id":"filesystem:SKILL.md:89:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- [CONNECTORS.md](../../../CONNECTORS.md) — keyless/free data recipe per `~~` connector category.","category":"filesystem","line_end":89,"severity":"high","line_start":89},{"id":"filesystem:SKILL.md:90:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- Sibling Map skills: [influencer-discovery](../../discover/influencer-discovery/SKILL.md) — find cr","category":"filesystem","line_end":90,"severity":"high","line_start":90},{"id":"filesystem:SKILL.md:91:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- [trend-spotter](../../discover/trend-spotter/SKILL.md) — spot trends competitors are riding.","category":"filesystem","line_end":91,"severity":"high","line_start":91},{"id":"filesystem:SKILL.md:95:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- **Primary**: [campaign-planner](../campaign-planner/SKILL.md) — turn competitive gaps into a diffe","category":"filesystem","line_end":95,"severity":"high","line_start":95},{"id":"filesystem:SKILL.md:96:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- **Alternate (Map)**: [influencer-discovery](../../discover/influencer-discovery/SKILL.md) — pursue","category":"filesystem","line_end":96,"severity":"high","line_start":96},{"id":"filesystem:SKILL.md:97:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"- **Alternate (Map)**: [fit-scorer](../../discover/fit-scorer/SKILL.md) — score a competitor's roste","category":"filesystem","line_end":97,"severity":"high","line_start":97},{"id":"env_access:SKILL.md:61:generic-api-secret-keys","file":"SKILL.md","pattern":"Generic API/secret keys","snippet":"**Rival-partner channel watch (free key / keyless)**: `python3 \"${CLAUDE_PLUGIN_ROOT}/scripts/connec","category":"env_access","line_end":61,"severity":"high","line_start":61}],"finding_verdicts":[{"id":"filesystem:references/templates.md:3:path-traversal-sequence","reason":"Line 3 is a Markdown link to ../SKILL.md in a reference document. It is not file access, path construction, or user-controlled traversal.","verdict":"false_positive","confidence":0.97},{"id":"blocker:references/templates.md:271:system-reconnaissance","reason":"Line 271 is a table row showing yes/no flags for paid partnerships. It does not enumerate system details or request host reconnaissance.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:24:ruby-shell-backtick-execution","reason":"Line 24 begins a fenced example prompt. The content is natural-language invocation text, not shell syntax.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:26:ruby-shell-backtick-execution","reason":"Line 26 closes the prompt example. No command is present or executed.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","reason":"Line 30 begins another fenced prompt example. It is documentation for user wording, not executable shell content.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","reason":"This finding covers the end of an example prompt and plain Markdown contract text. No Ruby backtick execution or shell command appears there.","verdict":"false_positive","confidence":0.94},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","reason":"Line 37 contains an inline output path in Markdown describing where a report is saved. It does not invoke a command.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"Line 38 lists memory files and a Markdown link to creator-registry. This is documentation, not shell execution.","verdict":"false_positive","confidence":0.93},{"id":"external_commands:SKILL.md:53:ruby-shell-backtick-execution","reason":"Line 53 uses backticks to mark connector placeholder syntax. No executable command or interpreter call is present.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:55:ruby-shell-backtick-execution","reason":"Line 55 is a connector placeholder name for an influencer database. It is not command syntax and takes no shell input.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:56:ruby-shell-backtick-execution","reason":"Line 56 is a connector placeholder name for social platform analytics. It documents a possible data source, not a command.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","reason":"Line 57 is a connector placeholder name for CRM lookup. It is plain Markdown and does not execute code.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","reason":"Line 59 instructs running python3 with a local gdelt.py connector and a user-supplied competitor string. It is an intentional external command with network-facing behavior, so host execution should require confirmation.","verdict":"confirmed","severity":"medium","confidence":0.78},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","reason":"Line 61 instructs running python3 with a YouTube connector and mentions piping a YouTube RSS feed into rss_monitor.py. These are explicit external commands and data fetches, so they should not auto-run without consent.","verdict":"confirmed","severity":"medium","confidence":0.82},{"id":"network:SKILL.md:10:hardcoded-url","reason":"Line 10 is homepage metadata pointing to the public project repository. It is not a hidden runtime callback or data exfiltration target.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:13:hardcoded-url","reason":"Line 13 contains frontmatter metadata with the same public homepage URL. Metadata alone does not trigger a network request.","verdict":"false_positive","confidence":0.98},{"id":"network:SKILL.md:61:hardcoded-url","reason":"Line 61 documents a public YouTube RSS endpoint for optional monitoring. The network destination is disclosed and tied to user-selected channel data, not a hidden exfiltration endpoint.","verdict":"false_positive","confidence":0.86},{"id":"filesystem:SKILL.md:38:path-traversal-sequence","reason":"Line 38 contains fixed memory filenames and a relative Markdown link. There is no user-controlled path traversal or filesystem escape.","verdict":"false_positive","confidence":0.95},{"id":"filesystem:SKILL.md:43:path-traversal-sequence","reason":"Line 43 links to a sibling skill using a relative Markdown path. It is documentation navigation, not file access.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:47:path-traversal-sequence","reason":"Line 47 links to a shared reference document with a relative Markdown path. It does not construct or traverse filesystem paths at runtime.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:59:path-traversal-sequence","reason":"Line 59 uses a plugin-root script path and a relative documentation link. The path is fixed to the plugin root and is not user-controlled traversal.","verdict":"false_positive","confidence":0.88},{"id":"filesystem:SKILL.md:63:path-traversal-sequence","reason":"Line 63 links to CONNECTORS.md using a relative Markdown path. This is documentation, not a filesystem operation.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:87:path-traversal-sequence","reason":"Line 87 links to a shared skill-contract reference. The parent-directory segments are static Markdown navigation only.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:88:path-traversal-sequence","reason":"Line 88 links to a shared state-model reference. It is not runtime path traversal.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:89:path-traversal-sequence","reason":"Line 89 links to CONNECTORS.md using a static relative path. No user-controlled filesystem access is implied.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:90:path-traversal-sequence","reason":"Line 90 links to sibling skill files with relative Markdown paths. This is normal cross-reference documentation.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:91:path-traversal-sequence","reason":"Line 91 links to a sibling trend-spotter skill. The relative path is static documentation, not a traversal exploit.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:95:path-traversal-sequence","reason":"Line 95 links to the campaign-planner skill with a static relative Markdown path. It does not read or write files.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:96:path-traversal-sequence","reason":"Line 96 links to the influencer-discovery skill with a static relative Markdown path. It is not path traversal at runtime.","verdict":"false_positive","confidence":0.97},{"id":"filesystem:SKILL.md:97:path-traversal-sequence","reason":"Line 97 links to the fit-scorer skill with a static relative Markdown path. No dynamic filesystem path is built.","verdict":"false_positive","confidence":0.97},{"id":"env_access:SKILL.md:61:generic-api-secret-keys","reason":"Line 61 names a conventional YOUTUBE_API_KEY credential for an optional YouTube connector, but it contains no secret value and gives no instruction to reveal the key. No exfiltration or logging behavior is shown.","verdict":"false_positive","confidence":0.87}],"semantic_findings":[],"subject_marketplace_commit_sha":null,"subject_content_hash":null,"subject_tree_hash":null,"subject_plugin_path":null,"audit_payload_hash":null,"confirmed_risk_level":null,"scanner_version":null,"policy_version":null,"subject":{"marketplaceCommitSha":null,"contentHash":null,"treeHash":null,"pluginPath":null,"auditPayloadHash":null},"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":false}}