{"data":{"skill":{"slug":"waynehamadi-datacircle","name":"datacircle","icon":"📦","repo":"https://github.com/waynehamadi/datacircle-plugin/tree/3d573264733cdf7f2259bb9776e517f6bbce0917/skills/datacircle","status":"approved","author":"waynehamadi","authorVersion":null,"skillstoreRevision":1},"audit":{"id":"8799718a-a8df-4706-8d66-de45bfe10da7","skill_id":"d3d756ff-9cf5-4350-9496-4e86bd3f8508","version":1,"content_hash":"v3:5e1f762ecf28b75c366ed9b67053b444b2eb9ffd:b7e96e01baf38bdc55627b1df8d5fe0a61fffde938ecd31118fa50f7dc2d2b9d:821c553c333f60d5a74df30d8b1f3436c8316dad94ee56c09cd747714a76962f:736b696c6c732f7761796e6568616d6164692f64617461636972636c65:57a7e3013b1224e84ded6fad37236e6f","risk_level":"safe","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"All 12 static findings are false positives: Markdown identifiers, pricing disclosures, and download guidance do not execute commands or inspect the system. The skill requires spending approval and treats tool results as untrusted data. No evidence found of malicious intent or prompt injection in SKILL.md; the external MCP implementation was not included.","remediation":[],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":8,"line_start":8},{"file":"SKILL.md","line_end":12,"line_start":12},{"file":"SKILL.md","line_end":13,"line_start":13},{"file":"SKILL.md","line_end":14,"line_start":14},{"file":"SKILL.md","line_end":19,"line_start":19},{"file":"SKILL.md","line_end":31,"line_start":31},{"file":"SKILL.md","line_end":32,"line_start":32},{"file":"SKILL.md","line_end":33,"line_start":33},{"file":"SKILL.md","line_end":37,"line_start":37},{"file":"SKILL.md","line_end":39,"line_start":39}]}],"critical_findings":[],"high_findings":[],"medium_findings":[],"low_findings":[],"dangerous_patterns":[],"files_scanned":1,"total_lines":40,"audit_model":"codex","audited_at":"2026-10-10T16:57:59.072+00:00","created_at":"2026-10-11T03:54:55.551155+00:00","static_findings":[{"id":"external_commands:SKILL.md:8:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The `datacircle` MCP server's tools spend the user's own Datacircle balance, so use them only for wh","category":"external_commands","line_end":8,"severity":"medium","line_start":8},{"id":"external_commands:SKILL.md:12:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Call `get_linkedin_profile` once per LinkedIn URL the user gave you. Don't search for, guess or ad","category":"external_commands","line_end":12,"severity":"medium","line_start":12},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Use the default provider, `up2data`: a profile it can't find is free. Use `harvestapi` or `fetchin","category":"external_commands","line_end":13,"severity":"medium","line_start":13},{"id":"external_commands:SKILL.md:14:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"limit (`429`), `harvestapi` when the user needs the member's interests, which only it returns. Say w","category":"external_commands","line_end":14,"severity":"medium","line_start":14},{"id":"external_commands:SKILL.md:19:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Each answer carries `datacircle_meta`: `cost_usd` and `balance_usd`. For more than one lookup, tel","category":"external_commands","line_end":19,"severity":"medium","line_start":19},{"id":"external_commands:SKILL.md:31:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `get_balance` is free. When a lookup answers `402` (the balance is too low), say so.","category":"external_commands","line_end":31,"severity":"medium","line_start":31},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Call `add_funds` only when the user asks to add funds. It only returns a Stripe Checkout link (`ch","category":"external_commands","line_end":32,"severity":"medium","line_start":32},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"open and pay; nothing is charged until they do. Never claim funds were added until `get_balance` sho","category":"external_commands","line_end":33,"severity":"medium","line_start":33},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `list_files` shows each file with `is_unlocked`: the flat file is `coop_up2data`, `coop_harvestapi","category":"external_commands","line_end":37,"severity":"medium","line_start":37},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `get_download_link` returns a link valid for one hour. Give the link to the user; files are severa","category":"external_commands","line_end":39,"severity":"medium","line_start":39},{"id":"blocker:SKILL.md:15:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"- Every lookup is paid from the balance. Before any, even a single one, say which provider and what ","category":"blocker","line_end":15,"severity":"low","line_start":15},{"id":"blocker:SKILL.md:39:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"- `get_download_link` returns a link valid for one hour. Give the link to the user; files are severa","category":"blocker","line_end":39,"severity":"low","line_start":39}],"finding_verdicts":[{"id":"external_commands:SKILL.md:8:ruby-shell-backtick-execution","reason":"Backticks format the Datacircle MCP server name in Markdown. The surrounding instruction restricts tool use to user requests and contains no shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:12:ruby-shell-backtick-execution","reason":"The backticks format the get_linkedin_profile tool name, not executable shell syntax. The instruction limits lookups to URLs supplied by the user.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:13:ruby-shell-backtick-execution","reason":"Backticks mark provider identifiers in Markdown. The text describes provider selection for requested profile lookups and does not invoke Ruby or a shell.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:14:ruby-shell-backtick-execution","reason":"The backticks format an HTTP status code and a provider name. This is prose about rate limits and returned interests, not command execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:19:ruby-shell-backtick-execution","reason":"Backticks format response metadata keys for cost and balance reporting. No executable statement or shell command appears here.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:31:ruby-shell-backtick-execution","reason":"Backticks identify the free get_balance tool and an insufficient-balance HTTP status. The text requests a balance explanation, not shell execution.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","reason":"Backticks format add_funds and checkout_url as tool and response identifiers. The instruction requires an explicit funding request and returns a user-operated checkout link.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","reason":"Backticks format the get_balance tool name in a payment verification instruction. It prevents unsupported funding claims and contains no executable shell syntax.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","reason":"Backticks format list_files, is_unlocked, and provider file identifiers. This is documentation for listing service files, not a command execution mechanism.","verdict":"false_positive","confidence":1},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","reason":"Backticks format the get_download_link tool name. The instruction only shares an expiring link and explicitly prohibits fetching the large files.","verdict":"false_positive","confidence":1},{"id":"blocker:SKILL.md:15:system-reconnaissance","reason":"The line requires provider and price disclosure before paid lookups. It neither queries system information nor instructs the assistant to inspect the host.","verdict":"false_positive","confidence":1},{"id":"blocker:SKILL.md:39:system-reconnaissance","reason":"The line describes download link expiry and remote file sizes, not host reconnaissance. It explicitly tells the assistant not to fetch the files.","verdict":"false_positive","confidence":1}],"semantic_findings":[],"subject_marketplace_commit_sha":"5e1f762ecf28b75c366ed9b67053b444b2eb9ffd","subject_content_hash":"b7e96e01baf38bdc55627b1df8d5fe0a61fffde938ecd31118fa50f7dc2d2b9d","subject_tree_hash":"821c553c333f60d5a74df30d8b1f3436c8316dad94ee56c09cd747714a76962f","subject_plugin_path":"skills/waynehamadi/datacircle","audit_payload_hash":"57a7e3013b1224e84ded6fad37236e6f","confirmed_risk_level":"safe","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"5e1f762ecf28b75c366ed9b67053b444b2eb9ffd","contentHash":"b7e96e01baf38bdc55627b1df8d5fe0a61fffde938ecd31118fa50f7dc2d2b9d","treeHash":"821c553c333f60d5a74df30d8b1f3436c8316dad94ee56c09cd747714a76962f","pluginPath":"skills/waynehamadi/datacircle","auditPayloadHash":"57a7e3013b1224e84ded6fad37236e6f"},"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/waynehamadi-datacircle/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}}