Given a GitHub issue, review the issue for security implications. You'll make a determination if the claim in the issue is legitimate and should be addressed or will be a "won't fix." Trigger keywords - security issue, review security ticket, review security issue.
60
70%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Fix and improve this skill with Tessl
tessl review fix ./.agents/skills/review-security-issue/SKILL.mdReview an issue that outlines a security, vulnerability, or privacy concern.
gh CLI must be authenticated (gh auth status)topic:security. In unattended queue mode it must also have agent:plan-requested; for a direct user request, warn if that workflow label is missing and continue without changing it.All comments posted by this skill must begin with the following marker line so that prior reviews can be detected and human comments can be distinguished from agent comments:
> **🔒 security-review-agent**This marker is used in Step 2 to detect prior reviews and in Step 5 to distinguish agent comments from human comments.
The user will provide an issue ID (e.g., #42 or 42). Strip any leading # and fetch the issue contents.
gh issue view <id>To also retrieve the full issue body as JSON (useful for parsing):
gh issue view <id> --json title,body,state,labels,authorFirst, check the issue's labels from the metadata fetched in Step 1.
agent:implementation-requested, the issue has already been reviewed and a human authorized remediation. There is no review to perform. Suggest using fix-security-issue and stop.topic:security is missing, report that this specialized skill only reviews security issues and stop.agent:plan-requested is missing, report that the issue is not ready for unattended pickup and stop.agent:plan-requested is missing, then proceed without it. Never add or offer to add the human-only request label.Next, fetch existing comments on the issue:
gh issue view <id> --json comments --jq '.comments[].body'Search the comments for the agent marker (> **🔒 security-review-agent**).
Pass the issue title, description, and any relevant code references to the principal-engineer-reviewer sub-agent for analysis. Use the Task tool:
Task tool with subagent_type="principal-engineer-reviewer"In the prompt, instruct the reviewer to approach the issue with a security-focused lens, specifically evaluating:
Based on the analysis from Step 3, post a comment on the issue.
Post a comment with a remediation plan:
gh issue comment <id> --body "$(cat <<'EOF'
> **🔒 security-review-agent**
## Security Review
**Determination:** Legitimate concern
### Summary
<1-3 sentences describing the security issue and its impact>
### Severity Assessment
- **Impact:** <high / medium / low>
- **Exploitability:** <description of attack vector and prerequisites>
- **Affected components:** <list of affected code paths or services>
### Attack Scenario
Step-by-step from the attacker's perspective:
1. <attacker's first action — e.g., crafts a malicious payload>
2. <attacker's second action — e.g., sends request to endpoint>
3. <resulting impact — e.g., gains access to sensitive data>
### Remediation Plan
1. <step 1 with file/component references>
2. <step 2>
3. ...
### Additional Notes
<any caveats, trade-offs, or related concerns>
EOF
)"Post a comment with a rationale:
gh issue comment <id> --body "$(cat <<'EOF'
> **🔒 security-review-agent**
## Security Review
**Determination:** Not actionable
### Rationale
<clear explanation of why this is not a security concern, including any mitigating factors already in place>
### References
<links to documentation, code, or standards that support the determination>
EOF
)"After posting a legitimate-concern review with a remediation plan, replace agent:plan-requested with agent:plan-ready only when the request label was present:
gh issue edit <id> --remove-label "agent:plan-requested" --add-label "agent:plan-ready"This signals that an unattended agent produced a remediation plan that awaits human review. For an unlabeled direct invocation, leave the agent:* labels unchanged. A later direct request can authorize remediation without agent:implementation-requested; warn that the expected label is missing and continue, while unattended remediation still requires that label. For a not-actionable determination, remove agent:plan-requested if present, do not add another agent:* label, and report that a human should close the issue or record the risk decision.
After posting (or if a prior review exists with new human comments), review all comments that do not contain the > **🔒 security-review-agent** marker. These are human comments.
For each unanswered human comment:
Important: The authenticated user posting these comments may be a real person's account. Humans may reply to your comments directly. Always use the agent marker to distinguish your comments from theirs.
| Command | Description |
|---|---|
gh issue view <id> | View issue details |
gh issue view <id> --json title,body,state,labels,author | Fetch full issue metadata as JSON |
gh issue view <id> --json comments --jq '.comments[].body' | Fetch all comments on an issue |
gh issue comment <id> --body "..." | Post a comment on an issue |
gh issue edit <id> --remove-label "agent:plan-requested" --add-label "agent:plan-ready" | Mark a remediation plan ready for human review |
User says: "Review security issue #42"
gh issue view 42security-review-agent markerprincipal-engineer-reviewer with security lensagent:plan-requested was present, replace it with agent:plan-ready; otherwise leave the direct invocation unlabeledUser says: "Check on security issue #42 again"
security-review-agent review from a prior run69a05eb
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.