{"data":{"skill":{"slug":"supatest-ai-alan-review-pr","name":"alan-review-pr","icon":"📦","repo":"https://github.com/supatest-ai/alan-skills/tree/e6ebae2c86d4d3ad8597e588f3e820ab0c90658f/skills/alan-review-pr","status":"approved","author":"supatest-ai","authorVersion":"1.0.0","skillstoreRevision":1},"audit":{"id":"25fd72fb-a2c7-47a1-9be4-e80df0890b61","skill_id":"11be9ea1-8913-4fbf-83b3-d04b4d7b1847","version":1,"content_hash":"v3:bdb71a4bc34515f37772ae85fd5501f9c2ff33b0:ac45c49d550ae5e4afd278bf4b501b4e5a533e2106ccfea0b6507bc32f4dc8e9:b673148cc56ccbaa146f975335e3c00ab663c7e333de83dd45460a111fb17107:736b696c6c732f73757061746573742d61692f616c616e2d7265766965772d7072:b1304f503c1153a6459422b43f339e80","risk_level":"high","is_blocked":false,"safe_to_publish":false,"analysis_status":"ok","agent_auto_install_policy":"confirmation_required","manual_install_policy":"allowed","summary":"Most static findings are false positives caused by Markdown backticks or examples that explicitly prohibit credential access. Three Alan URLs are real low-risk network references, while session URL publication, untrusted PR content, and automatic review posting create meaningful semantic risks.","remediation":[{"issue":"Session URLs are published in GitHub review content.","severity":"high","suggestion":"Use a non-sensitive public review URL, validate its origin, remove access tokens, and require confirmation before posting it."},{"issue":"Untrusted PR content is processed beside write-capable GitHub tools.","severity":"high","suggestion":"Treat repository text as data, ignore embedded instructions, and expose only the minimum tools required for the approved review step."},{"issue":"The skill posts comments or requests changes without user approval.","severity":"medium","suggestion":"Present a review preview and require explicit confirmation before calling the review creation tool."},{"issue":"Review comments load an image from an external Alan host.","severity":"low","suggestion":"Remove the remote image or document the external request and let users disable branding."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":11,"line_start":11},{"file":"SKILL.md","line_end":18,"line_start":18},{"file":"SKILL.md","line_end":19,"line_start":19},{"file":"SKILL.md","line_end":20,"line_start":20},{"file":"SKILL.md","line_end":21,"line_start":21},{"file":"SKILL.md","line_end":30,"line_start":30},{"file":"SKILL.md","line_end":37,"line_start":37},{"file":"SKILL.md","line_end":38,"line_start":38},{"file":"SKILL.md","line_end":39,"line_start":39},{"file":"SKILL.md","line_end":45,"line_start":42},{"file":"SKILL.md","line_end":49,"line_start":45},{"file":"SKILL.md","line_end":57,"line_start":49},{"file":"SKILL.md","line_end":58,"line_start":57},{"file":"SKILL.md","line_end":59,"line_start":58},{"file":"SKILL.md","line_end":60,"line_start":59},{"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":64,"line_start":63},{"file":"SKILL.md","line_end":65,"line_start":64},{"file":"SKILL.md","line_end":66,"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":69,"line_start":68},{"file":"SKILL.md","line_end":85,"line_start":69},{"file":"SKILL.md","line_end":87,"line_start":85},{"file":"SKILL.md","line_end":88,"line_start":87},{"file":"SKILL.md","line_end":90,"line_start":88},{"file":"SKILL.md","line_end":92,"line_start":90},{"file":"SKILL.md","line_end":95,"line_start":92},{"file":"SKILL.md","line_end":98,"line_start":95},{"file":"SKILL.md","line_end":101,"line_start":98},{"file":"SKILL.md","line_end":112,"line_start":101},{"file":"SKILL.md","line_end":135,"line_start":112},{"file":"SKILL.md","line_end":137,"line_start":135},{"file":"SKILL.md","line_end":147,"line_start":137},{"file":"SKILL.md","line_end":147,"line_start":147},{"file":"SKILL.md","line_end":149,"line_start":149},{"file":"SKILL.md","line_end":167,"line_start":158},{"file":"SKILL.md","line_end":169,"line_start":167},{"file":"SKILL.md","line_end":182,"line_start":169},{"file":"SKILL.md","line_end":185,"line_start":182},{"file":"SKILL.md","line_end":188,"line_start":185},{"file":"SKILL.md","line_end":200,"line_start":188},{"file":"SKILL.md","line_end":205,"line_start":200},{"file":"SKILL.md","line_end":207,"line_start":205},{"file":"SKILL.md","line_end":211,"line_start":207},{"file":"SKILL.md","line_end":212,"line_start":211},{"file":"SKILL.md","line_end":212,"line_start":212},{"file":"SKILL.md","line_end":214,"line_start":213}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":79,"line_start":79},{"file":"SKILL.md","line_end":155,"line_start":155},{"file":"SKILL.md","line_end":194,"line_start":194},{"file":"SKILL.md","line_end":207,"line_start":207}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":21,"line_start":21},{"file":"SKILL.md","line_end":21,"line_start":21}]}],"critical_findings":[],"high_findings":[{"title":"Session URL Published in GitHub Reviews","locations":[{"file":"SKILL.md","line_end":207,"line_start":202},{"file":"SKILL.md","line_end":224,"line_start":220}],"confidence":0.86,"description":"The skill requires the current Alan session URL in every inline comment and summary. Posting a private or access-bearing URL could disclose session access.","review_kind":"security","source_category":"semantic","source_severity":"high","confidence_reasoning":"The publication requirement is explicit, but the source does not establish whether Alan session URLs are public or contain access credentials."},{"title":"Untrusted Pull Request Content Lacks an Instruction Boundary","locations":[{"file":"SKILL.md","line_end":69,"line_start":57},{"file":"SKILL.md","line_end":106,"line_start":87}],"confidence":0.83,"description":"The workflow sends PR descriptions, diffs, reviews, and comments to an agent with write-capable GitHub tools without directing it to ignore embedded instructions.","review_kind":"security","source_category":"semantic","source_severity":"high","confidence_reasoning":"The skill explicitly combines untrusted repository content with tools that can comment, merge, close, label, and request reviewers. No prompt-injection boundary is stated."}],"medium_findings":[{"title":"GitHub Review Is Posted Without Confirmation","locations":[{"file":"SKILL.md","line_end":113,"line_start":112},{"file":"SKILL.md","line_end":225,"line_start":209}],"confidence":0.98,"description":"The workflow always posts inline comments and can request changes based on model findings. It does not require user approval before mutating the pull request.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The posting requirement and event selection are explicit. The workflow contains no confirmation step before the write operation."}],"low_findings":[{"title":"Hardcoded URL","locations":[{"file":"SKILL.md","line_end":155,"line_start":155}],"confidence":0.9,"description":"<img src=\"https://app.tryalan.ai/logo.png\" alt=\"Open in Alan\" height=\"20\">","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The skill embeds an image hosted by app.tryalan.ai in posted GitHub reviews. Rendering the review can cause an external request and disclose request metadata."},{"title":"Hardcoded URL","locations":[{"file":"SKILL.md","line_end":194,"line_start":194}],"confidence":0.9,"description":"<img src=\"https://app.tryalan.ai/logo.png\" alt=\"Open in Alan\" height=\"20\">","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The skill embeds an image hosted by app.tryalan.ai in posted GitHub reviews. Rendering the review can cause an external request and disclose request metadata."},{"title":"Hardcoded URL","locations":[{"file":"SKILL.md","line_end":207,"line_start":207}],"confidence":0.9,"description":"If no session URL is provided, fall back to `https://app.tryalan.ai`.","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The skill instructs reviews to link to a fixed external Alan endpoint when no session URL exists. This creates an off-platform navigation and trust boundary."}],"dangerous_patterns":[],"files_scanned":1,"total_lines":226,"audit_model":"codex","audited_at":"2026-08-20T08:31:39.34+00:00","created_at":"2026-08-20T09:52:40.61205+00:00","static_findings":[{"id":"external_commands:SKILL.md:11:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"They are named with the prefix `mcp__alan__github_`.","category":"external_commands","line_end":11,"severity":"medium","line_start":11},{"id":"external_commands:SKILL.md:18:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `curl` or `wget` to api.github.com","category":"external_commands","line_end":18,"severity":"medium","line_start":18},{"id":"external_commands:SKILL.md:19:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `gh` CLI commands (gh pr, gh api, etc.)","category":"external_commands","line_end":19,"severity":"medium","line_start":19},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `env | grep` or scanning for tokens/secrets","category":"external_commands","line_end":20,"severity":"medium","line_start":20},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `cat ~/.netrc`, `git credential`, or `ssh -T git@github.com`","category":"external_commands","line_end":21,"severity":"medium","line_start":21},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Before starting, confirm you can see `mcp__alan__github_*` tools in your","category":"external_commands","line_end":30,"severity":"medium","line_start":30},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `owner` (string): GitHub org or username, e.g. \"supatest-ai\"","category":"external_commands","line_end":37,"severity":"medium","line_start":37},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `repo` (string): Repository name, e.g. \"alan\"","category":"external_commands","line_end":38,"severity":"medium","line_start":38},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `prNumber` (integer): PR number, e.g. 42","category":"external_commands","line_end":39,"severity":"medium","line_start":39},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":45,"severity":"medium","line_start":42},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":49,"severity":"medium","line_start":45},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"If the user only provides a PR number, run `git remote get-url origin` to get","category":"external_commands","line_end":57,"severity":"medium","line_start":49},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `mcp__alan__github_get_pull_request` | Get PR details (title, state, labels, merge status) |","category":"external_commands","line_end":58,"severity":"medium","line_start":57},{"id":"external_commands:SKILL.md:58:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `mcp__alan__github_get_pr_diff` | Get unified diff of a PR |","category":"external_commands","line_end":59,"severity":"medium","line_start":58},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `mcp__alan__github_list_pr_comments` | List all comments on a PR |","category":"external_commands","line_end":60,"severity":"medium","line_start":59},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `mcp__alan__github_list_pr_reviews` | List all reviews on a PR |","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":"| `mcp__alan__github_list_pr_files` | List changed files with additions/deletions |","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":"| `mcp__alan__github_get_issue` | Get issue details |","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":"| `mcp__alan__github_get_ci_status` | Get CI check run status for a ref |","category":"external_commands","line_end":64,"severity":"medium","line_start":63},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `mcp__alan__github_add_comment` | Add a comment to an issue or PR |","category":"external_commands","line_end":65,"severity":"medium","line_start":64},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `mcp__alan__github_create_pr_review` | Submit a review (APPROVE/REQUEST_CHANGES/COMMENT) |","category":"external_commands","line_end":66,"severity":"medium","line_start":65},{"id":"external_commands:SKILL.md:66:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `mcp__alan__github_add_labels` | Add labels to an issue or PR |","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":"| `mcp__alan__github_merge_pull_request` | Merge a PR |","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":"| `mcp__alan__github_close_issue` | Close an issue or PR |","category":"external_commands","line_end":69,"severity":"medium","line_start":68},{"id":"external_commands:SKILL.md:69:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"| `mcp__alan__github_request_reviewers` | Request reviewers on a PR |","category":"external_commands","line_end":85,"severity":"medium","line_start":69},{"id":"external_commands:SKILL.md:85:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"run `git remote get-url origin` to parse owner and repo.","category":"external_commands","line_end":87,"severity":"medium","line_start":85},{"id":"external_commands:SKILL.md:87:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"2. **Fetch PR metadata** — call `mcp__alan__github_get_pull_request` with","category":"external_commands","line_end":88,"severity":"medium","line_start":87},{"id":"external_commands:SKILL.md:88:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"`{ owner, repo, prNumber }` to get title, description, state, labels, branches.","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":"3. **Fetch the diff** — call `mcp__alan__github_get_pr_diff` to get the unified diff.","category":"external_commands","line_end":92,"severity":"medium","line_start":90},{"id":"external_commands:SKILL.md:92:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"4. **Fetch changed files** — call `mcp__alan__github_list_pr_files` to see","category":"external_commands","line_end":95,"severity":"medium","line_start":92},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"5. **Fetch existing reviews** — call `mcp__alan__github_list_pr_reviews` to see","category":"external_commands","line_end":98,"severity":"medium","line_start":95},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"6. **Fetch existing comments** — call `mcp__alan__github_list_pr_comments` for","category":"external_commands","line_end":101,"severity":"medium","line_start":98},{"id":"external_commands:SKILL.md:101:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"7. **Check CI status** — call `mcp__alan__github_get_ci_status` with the head","category":"external_commands","line_end":112,"severity":"medium","line_start":101},{"id":"external_commands:SKILL.md:112:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"10. **Post review** — call `mcp__alan__github_create_pr_review` with inline","category":"external_commands","line_end":135,"severity":"medium","line_start":112},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Each finding becomes its own inline comment on the PR. Format the `body` of each comment like this:","category":"external_commands","line_end":137,"severity":"medium","line_start":135},{"id":"external_commands:SKILL.md:137:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```markdown","category":"external_commands","line_end":147,"severity":"medium","line_start":137},{"id":"external_commands:SKILL.md:147:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"\\`\\`\\`","category":"external_commands","line_end":147,"severity":"medium","line_start":147},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"\\`\\`\\`","category":"external_commands","line_end":149,"severity":"medium","line_start":149},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":167,"severity":"medium","line_start":158},{"id":"external_commands:SKILL.md:167:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"The `body` parameter of the review (top-level summary) should be:","category":"external_commands","line_end":169,"severity":"medium","line_start":167},{"id":"external_commands:SKILL.md:169:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```markdown","category":"external_commands","line_end":182,"severity":"medium","line_start":169},{"id":"external_commands:SKILL.md:182:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **{title}** — \\`{file_path}:{line}\\` — {one_line_description}","category":"external_commands","line_end":185,"severity":"medium","line_start":182},{"id":"external_commands:SKILL.md:185:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **{title}** — \\`{file_path}:{line}\\` — {one_line_description}","category":"external_commands","line_end":188,"severity":"medium","line_start":185},{"id":"external_commands:SKILL.md:188:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- **{title}** — \\`{file_path}:{line}\\` — {one_line_description}","category":"external_commands","line_end":200,"severity":"medium","line_start":188},{"id":"external_commands:SKILL.md:200:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":205,"severity":"medium","line_start":200},{"id":"external_commands:SKILL.md:205:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"session URL. Replace `{alan_session_url}` in every badge with the actual URL.","category":"external_commands","line_end":207,"severity":"medium","line_start":205},{"id":"external_commands:SKILL.md:207:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"If no session URL is provided, fall back to `https://app.tryalan.ai`.","category":"external_commands","line_end":211,"severity":"medium","line_start":207},{"id":"external_commands:SKILL.md:211:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"Call `mcp__alan__github_create_pr_review` with:","category":"external_commands","line_end":212,"severity":"medium","line_start":211},{"id":"external_commands:SKILL.md:212:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `owner`, `repo`, `prNumber`: from step 1","category":"external_commands","line_end":212,"severity":"medium","line_start":212},{"id":"external_commands:SKILL.md:213:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `body`: the summary comment above","category":"external_commands","line_end":214,"severity":"medium","line_start":213},{"id":"external_commands:SKILL.md:214:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `event`: \"REQUEST_CHANGES\" if any 🔴 blocking findings, otherwise \"COMMENT\"","category":"external_commands","line_end":215,"severity":"medium","line_start":214},{"id":"external_commands:SKILL.md:215:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `comments`: array of inline comments, each with:","category":"external_commands","line_end":216,"severity":"medium","line_start":215},{"id":"external_commands:SKILL.md:216:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `path`: relative file path from repo root","category":"external_commands","line_end":217,"severity":"medium","line_start":216},{"id":"external_commands:SKILL.md:217:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `line`: the end line number of the finding","category":"external_commands","line_end":218,"severity":"medium","line_start":217},{"id":"external_commands:SKILL.md:218:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- `body`: the formatted inline comment body above","category":"external_commands","line_end":224,"severity":"medium","line_start":218},{"id":"network:SKILL.md:79:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"- A PR URL (e.g. \"https://github.com/owner/repo/pull/42\")","category":"network","line_end":79,"severity":"low","line_start":79},{"id":"network:SKILL.md:155:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"<img src=\"https://app.tryalan.ai/logo.png\" alt=\"Open in Alan\" height=\"20\">","category":"network","line_end":155,"severity":"low","line_start":155},{"id":"network:SKILL.md:194:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"<img src=\"https://app.tryalan.ai/logo.png\" alt=\"Open in Alan\" height=\"20\">","category":"network","line_end":194,"severity":"low","line_start":194},{"id":"network:SKILL.md:207:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"If no session URL is provided, fall back to `https://app.tryalan.ai`.","category":"network","line_end":207,"severity":"low","line_start":207},{"id":"filesystem:SKILL.md:21:hidden-file-in-home-directory","file":"SKILL.md","pattern":"Hidden file in home directory","snippet":"- `cat ~/.netrc`, `git credential`, or `ssh -T git@github.com`","category":"filesystem","line_end":21,"severity":"high","line_start":21},{"id":"filesystem:SKILL.md:21:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"- `cat ~/.netrc`, `git credential`, or `ssh -T git@github.com`","category":"filesystem","line_end":21,"severity":"medium","line_start":21},{"id":"sensitive:SKILL.md:14:netrc-credentials-file","file":"SKILL.md","pattern":"netrc credentials file","snippet":"GitHub tokens, gh CLI auth, SSH keys, .netrc files, environment variables, or","category":"sensitive","line_end":14,"severity":"critical","line_start":14},{"id":"sensitive:SKILL.md:21:netrc-credentials-file","file":"SKILL.md","pattern":"netrc credentials file","snippet":"- `cat ~/.netrc`, `git credential`, or `ssh -T git@github.com`","category":"sensitive","line_end":21,"severity":"critical","line_start":21}],"finding_verdicts":[{"id":"external_commands:SKILL.md:11:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:18:ruby-shell-backtick-execution","reason":"This line explicitly prohibits the displayed command. Markdown backticks identify a forbidden example and do not execute it.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:19:ruby-shell-backtick-execution","reason":"This line explicitly prohibits the displayed command. Markdown backticks identify a forbidden example and do not execute it.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:20:ruby-shell-backtick-execution","reason":"This line explicitly prohibits the displayed command. Markdown backticks identify a forbidden example and do not execute it.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","reason":"This line explicitly prohibits the displayed command. Markdown backticks identify a forbidden example and do not execute it.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:30:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:37:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:38:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:39:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:42:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:49:ruby-shell-backtick-execution","reason":"The skill permits only the fixed, read-only command `git remote get-url origin` to resolve repository identity. No user input is interpolated into a shell command.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:57:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:58:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:59:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:61:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:62:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:63:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:64:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:66:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:67:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:68:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:69:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:85:ruby-shell-backtick-execution","reason":"The skill permits only the fixed, read-only command `git remote get-url origin` to resolve repository identity. No user input is interpolated into a shell command.","verdict":"false_positive","confidence":0.97},{"id":"external_commands:SKILL.md:87:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:88:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:90:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:92:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:95:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:98:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:101:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:112:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:135:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:137:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:147:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:149:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:158:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:167:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:169:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:182:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:185:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:188:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:200:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:205:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:207:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:211:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:212:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:213:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:214:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:215:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:216:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:217:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:218:ruby-shell-backtick-execution","reason":"The detected backticks are Markdown formatting for tool names, parameters, templates, or code fences. They are not Ruby or shell command substitution.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:79:hardcoded-url","reason":"This is an example GitHub pull request URL accepted as user input. It does not instruct an independent network request or send data elsewhere.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:155:hardcoded-url","reason":"The skill embeds an image hosted by app.tryalan.ai in posted GitHub reviews. Rendering the review can cause an external request and disclose request metadata.","verdict":"confirmed","severity":"low","confidence":0.9},{"id":"network:SKILL.md:194:hardcoded-url","reason":"The skill embeds an image hosted by app.tryalan.ai in posted GitHub reviews. Rendering the review can cause an external request and disclose request metadata.","verdict":"confirmed","severity":"low","confidence":0.9},{"id":"network:SKILL.md:207:hardcoded-url","reason":"The skill instructs reviews to link to a fixed external Alan endpoint when no session URL exists. This creates an off-platform navigation and trust boundary.","verdict":"confirmed","severity":"low","confidence":0.9},{"id":"filesystem:SKILL.md:21:hidden-file-in-home-directory","reason":"The home-directory path appears only in an explicit prohibition against reading credentials. The skill does not authorize or perform hidden-file access.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:21:hidden-file-access","reason":"The home-directory path appears only in an explicit prohibition against reading credentials. The skill does not authorize or perform hidden-file access.","verdict":"false_positive","confidence":0.99},{"id":"sensitive:SKILL.md:14:netrc-credentials-file","reason":"The credential file is mentioned only to state that it is unnecessary and must not be accessed. This is protective guidance, not credential collection.","verdict":"false_positive","confidence":0.99},{"id":"sensitive:SKILL.md:21:netrc-credentials-file","reason":"The credential file is mentioned only to state that it is unnecessary and must not be accessed. This is protective guidance, not credential collection.","verdict":"false_positive","confidence":0.99}],"semantic_findings":[{"title":"Session URL Published in GitHub Reviews","severity":"high","locations":[{"file":"SKILL.md","line_end":207,"line_start":202},{"file":"SKILL.md","line_end":224,"line_start":220}],"confidence":0.86,"description":"The skill requires the current Alan session URL in every inline comment and summary. Posting a private or access-bearing URL could disclose session access.","confidence_reasoning":"The publication requirement is explicit, but the source does not establish whether Alan session URLs are public or contain access credentials."},{"title":"Untrusted Pull Request Content Lacks an Instruction Boundary","severity":"high","locations":[{"file":"SKILL.md","line_end":69,"line_start":57},{"file":"SKILL.md","line_end":106,"line_start":87}],"confidence":0.83,"description":"The workflow sends PR descriptions, diffs, reviews, and comments to an agent with write-capable GitHub tools without directing it to ignore embedded instructions.","confidence_reasoning":"The skill explicitly combines untrusted repository content with tools that can comment, merge, close, label, and request reviewers. No prompt-injection boundary is stated."},{"title":"GitHub Review Is Posted Without Confirmation","severity":"medium","locations":[{"file":"SKILL.md","line_end":113,"line_start":112},{"file":"SKILL.md","line_end":225,"line_start":209}],"confidence":0.98,"description":"The workflow always posts inline comments and can request changes based on model findings. It does not require user approval before mutating the pull request.","confidence_reasoning":"The posting requirement and event selection are explicit. The workflow contains no confirmation step before the write operation."}],"subject_marketplace_commit_sha":"bdb71a4bc34515f37772ae85fd5501f9c2ff33b0","subject_content_hash":"ac45c49d550ae5e4afd278bf4b501b4e5a533e2106ccfea0b6507bc32f4dc8e9","subject_tree_hash":"b673148cc56ccbaa146f975335e3c00ab663c7e333de83dd45460a111fb17107","subject_plugin_path":"skills/supatest-ai/alan-review-pr","audit_payload_hash":"b1304f503c1153a6459422b43f339e80","confirmed_risk_level":"high","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"bdb71a4bc34515f37772ae85fd5501f9c2ff33b0","contentHash":"ac45c49d550ae5e4afd278bf4b501b4e5a533e2106ccfea0b6507bc32f4dc8e9","treeHash":"b673148cc56ccbaa146f975335e3c00ab663c7e333de83dd45460a111fb17107","pluginPath":"skills/supatest-ai/alan-review-pr","auditPayloadHash":"b1304f503c1153a6459422b43f339e80"},"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/supatest-ai-alan-review-pr/audits/1/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"high","confirmedFindingCount":3,"capabilityReviewCount":3,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"confirmation_required","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}