skills/peer-review/SKILL.md
Generate evidence-backed draft peer review answers for annual performance reviews. Sources from GitHub PRs/issues, Confluence, Jira, Notion, and Slack over the last year, plus user-pasted DM snippets from any messaging platform. Uses exhaustive two-phase subagent architecture to discover all artifacts, read them in full, then synthesize into human-sounding answers mapped 1:1 to the review form questions. Use when the user says "/peer-review", "write a peer review", "help me with performance review feedback", "peer feedback for [name]", or asks to write review answers for a colleague.
npx skillsauth add kyzooghost/audit-code-health-skill peer-reviewInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Generate evidence-backed draft answers for peer performance review forms using exhaustive multi-source research.
/peer-review - prompts for all paramsAsk in one prompt:
Probe the environment for each source type:
| Source | Detection method |
|--------|-----------------|
| GitHub | Run gh api /user --jq '.login'. If succeeds, GitHub is available and your username is captured. |
| Atlassian (Confluence + Jira) | Check if mcp__atlassian__search tool exists. |
| Notion | Check if any mcp__notion__* tools exist. |
| Slack | Check if any mcp__slack__* tools exist. |
If Atlassian source is available, resolve the person's Atlassian account ID from their name using mcp__atlassian__lookupJiraAccountId. Store for use in CQL/JQL queries.
Calculate: start_date = today minus 365 days (YYYY-MM-DD), end_date = today (YYYY-MM-DD).
For each org, run:
gh search prs --author={their_username} --owner={org} --merged=>{start_date} --limit 100 --json repository
Paginate until no more results. Deduplicate repo names across all orgs.
Log: "Discovered {N} repos with activity across {M} orgs"
Spawn one subagent per source. Each subagent's sole job: paginate until results are exhausted and return a complete artifact manifest. No content reading in this phase.
Each subagent prompt MUST include verbatim:
"IMPORTANT: You must paginate until no more results are returned. Do not stop at the first page. Continue requesting the next page/cursor/offset until the API returns zero results."
Find all merged PRs and issues by the target user:
gh search prs --author={their_username} --owner={org} --merged={start_date}..{end_date} --limit 100 --json number,title,url,repository,mergedAt
Paginate with --page until empty. Repeat per org. Then find issues:
gh search issues --author={their_username} --owner={org} --created={start_date}..{end_date} --limit 100 --json number,title,url,repository,createdAt,state
Also find interaction PRs - PRs where you commented on theirs:
gh search prs --author={their_username} --owner={org} --commenter={your_username} --merged={start_date}..{end_date} --limit 100 --json number,title,url,repository,mergedAt
And PRs where they commented on yours:
gh search prs --author={your_username} --owner={org} --commenter={their_username} --merged={start_date}..{end_date} --limit 100 --json number,title,url,repository,mergedAt
Return manifest: {number, title, url, repo, date, type: "pr"|"issue", interaction: bool} for every result.
Use mcp__atlassian__searchConfluenceUsingCql with:
CQL: contributor = "{their_account_id}" AND lastmodified >= "{start_date}" AND type = page
Paginate with cursor until no more results.
Also search for shared pages (both of you contributed):
CQL: contributor = currentUser() AND contributor = "{their_account_id}" AND lastmodified >= "{start_date}" AND type = page
Return manifest: {pageId, title, url, date, spaceKey, shared: bool} for every page.
Use mcp__atlassian__searchJiraIssuesUsingJql with:
JQL: (assignee = "{their_account_id}" OR reporter = "{their_account_id}") AND updated >= "{start_date}"
Paginate with startAt until no more results (increment by maxResults each call).
Return manifest: {issueKey, summary, url, status, type, updated} for every ticket.
Use Notion search/query tools to find all pages authored/edited by the target user in the date range. Paginate until exhausted.
Return manifest: {pageId, title, url, date} for every page.
Use Slack search tools to find messages from the target user in the date range. Paginate until exhausted. Collect unique thread root IDs.
Return manifest: {threadId, channel, date, preview_text} for every thread.
Merge all manifests. Log total counts:
"Found: {N} PRs, {M} issues, {P} Confluence pages, {Q} Notion pages, {R} Slack threads, {S} Jira tickets"
Take the full manifest from Phase 1. Spawn parallel subagents, each receiving a batch of ~10-15 artifacts to read in full.
Each subagent prompt MUST include verbatim:
"IMPORTANT: Read the FULL body/content of every artifact assigned to you. Do not summarize from titles or metadata alone. Read the actual content."
| Type | What to read |
|------|-------------|
| PR | Body/description, review comments, file change summary (additions/deletions, key files) |
| Issue | Body, all comments |
| Confluence page | Full page body via mcp__atlassian__getConfluencePage with contentFormat: "markdown", plus footer/inline comments |
| Notion page | Full page body content |
| Slack thread | All messages in the thread (use thread reply APIs, not just root message) |
| Jira ticket | Description, all comments, linked issues/PRs |
For each artifact, the deep-read subagent returns:
### {artifact_url}
- **Type:** PR / issue / page / thread / ticket
- **What they did:** 1-3 sentences of actual contribution
- **Impact signals:** why it mattered, who benefited
- **Complexity signals:** technical difficulty, ambiguity, cross-system, novel problem
- **Decision signals:** choices made, alternatives rejected, direction set
- **Interaction flag:** did the reviewer (your username) appear? How?
- You reviewed their PR / commented
- They reviewed your PR / commented
- You both commented on same Confluence page
- You both edited same Confluence page
- Direct exchange in thread
- **Interaction detail:** if flagged, what was the nature of the interaction? (review feedback, design discussion, decision-making, knowledge sharing)
If DM snippets were provided, parse as a virtual source alongside MCP data. Extract:
~10-15 artifacts per subagent. For 150 artifacts total, spawn ~10-15 parallel subagents. For 50 artifacts, spawn ~4-5.
For each pasted review form question, cluster relevant artifacts into themes. A single question might draw from multiple artifact types.
Example mapping:
For each question, select 2-4 strongest examples:
From evidence patterns (NOT PR mechanics - do not evaluate PR size, code style, commit frequency, or similar AI-assisted artifacts), propose 1-3 candidate growth areas. Focus on:
Before asking questions, check for prior feedback the user has written for the same person (e.g., *-2025-feedback.md, prior peer review files in the same directory). If found, read it to:
Single round, ~15 questions max. Split roughly 1/3 scope, 2/3 feedback.
These questions must be evidence-guided prompts, not open-ended asks. The user may not have ready answers to broad questions like "Where have they grown?" - but they DO have latent observations that the right prompt can surface. Use the discovered evidence to jog their memory and help them articulate what they already feel.
Pattern: Present evidence, ask if it resonates, invite elaboration.
Examples of good evidence-guided questions:
Anti-pattern: Do NOT ask these kinds of broad questions:
Rules:
After the user answers gap-filling questions, present a brief per-question outline before writing full prose. This catches attribution errors, wrong emphasis, and question-routing mistakes before they require revision.
Format:
Here's my planned structure before I write:
**Q1 (strengths):** Lead with [example A], then [example B]. Attribute [X] to them.
**Q2 (growth enabled):** Frame as [their specific contribution], not [ownership of the whole initiative].
**Q3 (better support):** [Theme]. Route [other theme] to Q4 instead since it's about their habits, not your growth.
**Q4 (other feedback):** [Theme A], [Theme B].
Anything to swap, reframe, or move between questions?
Rules:
Output one answer per review form question.
1-2 paragraphs per question:
After all answers, include a separate section:
## Evidence Appendix
### [Question 1 text]
- [artifact title](url) - brief note on relevance
- [artifact title](url) - brief note on relevance
### [Question 2 text]
- ...
Write the full review to peer-review-{name}-YYYY-MM.md in the current working directory.
Include in this order:
# Peer Review - {Name} - {Month} {Year}Target reader: the person being reviewed and their manager.
development
Sync a skill from this repo into the local machine's skill directories. Use when the user asks to make a repo skill available locally, sync a local skill for Claude, Agents, or Codex, update local skill symlinks, or follow the .claude/skills source link pattern with .agents/skills and .codex/skills symlinks.
development
Sync a command from this repo into local agent surfaces. Use when the user asks to make a repo command available locally, sync a local command for Claude, Agents, or Codex, update command symlinks, or expose a command to Codex as a skill.
testing
Use when the user asks to grill, interrogate, pressure-test, or relentlessly interview them about a plan until requirements, tradeoffs, dependencies, and implementation decisions are clear.
tools
Use when the user asks to create, update, draft, or generate a GitHub pull request, including /create-pr behavior or equivalent workflow.