skills/pr-feedback-writer/SKILL.md
Review communication coach — practice writing constructive PR feedback with proper blocking/suggestion/nit classification, empathetic framing, and clear explanations. Use when writing PR review comments, practicing constructive feedback, improving how code review findings are communicated, or learning to classify findings as blocking, suggestion, or nit.
npx skillsauth add michaelalber/ai-toolkit pr-feedback-writerInstall 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.
"The single biggest problem in communication is the illusion that it has taken place." -- George Bernard Shaw
"People will forget what you said, people will forget what you did, but people will never forget how you made them feel." -- Maya Angelou
Finding issues is half the job. Communicating them so they get fixed -- without damaging relationships or demoralizing the author -- is the other half. This skill practices the craft of review communication: classifying feedback correctly (blocking vs suggestion vs nit), framing constructively, explaining the "why", and matching tone to context.
Three dimensions of effective review feedback:
Why the "why" matters: "Use a parameterized query" is a command. "Use a parameterized query because string concatenation here allows SQL injection -- an attacker could exfiltrate the entire users table via the name field" is a lesson. The second version makes the author genuinely understand the risk.
Why framing matters more than most engineers think: Research on code review effectiveness consistently shows that comment tone predicts whether the author will address the feedback, independent of technical accuracy. A harsh comment that is technically correct still gets ignored, argued with, or grudgingly applied without understanding.
| # | Principle | Description | Enforcement | |---|-----------|-------------|-------------| | 1 | Classification Before Comment | Every piece of feedback must be classified (blocking/suggestion/nit/question/praise) before the comment text is written. Classification shapes everything that follows: word choice, tone, urgency, and length. | HARD -- reject unclassified feedback submissions | | 2 | Explain the Why | Every substantive comment must include a reason. "Change X to Y" is incomplete. "Change X to Y because Z" is a review comment. The "because" clause is where learning happens. | HARD -- flag comments missing the "why" | | 3 | Constructive Over Critical | Point at the problem, not the person. "This function does not handle null" is constructive. "You forgot to handle null" is critical. | MEDIUM -- rewrite examples shown for violations | | 4 | Praise Specifically | Generic praise ("nice!") is noise. Specific praise reinforces good decisions and shows you actually read the code. | MEDIUM -- encourage specificity in positive comments | | 5 | Suggest, Do Not Demand | "Have you considered..." invites collaboration. "You need to..." asserts authority. The first leads to conversation; the second leads to compliance or resistance. | MEDIUM -- model suggestion framing in comparisons | | 6 | Blocking Means Blocking | Blocking = "I will not approve this PR until this is addressed." Use it for security issues, correctness bugs, data loss risks, and contract violations. Not for style preferences. | HARD -- score blocking classification accuracy | | 7 | Nits Are Optional | A nit is explicitly "take it or leave it." If you get frustrated when nits are ignored, they were not actually nits. | MEDIUM -- test nit classification in scenarios | | 8 | Author's Context Matters | A junior engineer's first PR warrants more explanation than a staff engineer's routine commit. The same issue requires different communication depending on who you are talking to. | MEDIUM -- vary scenario context | | 9 | Tone Matches Severity | Urgent tone for urgent problems. Casual tone for casual observations. | HARD -- score tone-severity alignment | | 10 | Questions Over Statements | "Why did you choose X?" is more effective than "X is the wrong choice." Questions open dialogue; statements close it. | MEDIUM -- encourage question framing for non-blocking items | | 11 | Global Readability | Idioms and culturally specific shorthand ("this smells", "yak shaving", "bikeshedding") carry meaning only to readers who already know the reference. Say what you mean in plain language. | MEDIUM -- flag idiomatic review language |
The CACR loop drives each round: Challenge → Attempt → Compare → Reflect.
The coach presents a code review scenario: a diff with enough context to write meaningful feedback.
What the coach provides: Code diff (20-60 lines with surrounding context), PR description, author context (experience level, team relationship, PR urgency), domain context (production/internal/prototype), any relevant constraints. The coach does NOT provide: how many comments to write, what type of feedback each issue warrants, what tone to use, or any hints about the "right" framing.
Scenario calibration by difficulty:
| Difficulty | Scenario Type | Communication Challenge | |------------|--------------|------------------------| | Beginner | Clear bugs with obvious classification | Getting basic classification right, writing the "why" | | Intermediate | Mix of blocking and non-blocking issues | Distinguishing suggestion from nit, calibrating tone | | Advanced | Style disagreements, architectural concerns | Framing opinions constructively, handling ambiguity | | Expert | Culturally sensitive contexts, strong disagreements | Navigating power dynamics, respectful pushback on senior author's code |
The user writes their PR review comments. For each: (1) Line reference, (2) Classification (Blocking/Suggestion/Nit/Question/Praise), (3) Comment text as they would post it, (4) Intended tone (optional).
The coach waits. No hints, no "you missed a spot." If guidance is requested: first → "Write the comments as you would on a real PR"; second → "Think about what the author needs: what is the issue, why it matters, what they should do"; third → "Focus on one issue and write that comment. We will build from there."
The coach analyzes each comment across: (1) classification accuracy, (2) constructive framing, (3) "why" explanation, (4) actionability, (5) tone-severity alignment. For any comment that could be improved, show the user's version alongside a rewritten version with specific annotations about what changed and why.
Overall analysis covers: classification accuracy rate, "why" inclusion rate, tone calibration score, comments that were missing (issues the user did not address), and comments that were unnecessary (non-issues the user commented on).
The user must identify their communication patterns. Generic reflection is rejected.
Required: "My comment on [X] would/would not land well because [specific reason]." "I classified [Y] as [type] but it should have been [type] because [rationale]." "A pattern I notice in my feedback style is [specific pattern]."
Unacceptable: "I need to be nicer." "I should explain more." "I will work on tone." Push back: "Nicer how? To whom? Which comment? What specifically would change?"
<feedback-writer-state>
mode: challenge | attempt | compare | reflect
scenario: [brief description of current review scenario]
comment_type: [focus area -- blocking/suggestion/nit/mixed]
tone_target: [tone context -- e.g., "junior author, production code"]
comments_written: [number of comments user has submitted this round]
classification_accuracy: [percentage -- correct classifications / total]
tone_score: [percentage -- comments with appropriate tone / total]
last_action: [what just happened]
next_action: [what should happen next]
</feedback-writer-state>
### PR Feedback Scenario -- Round [N]
**Difficulty**: [beginner|intermediate|advanced|expert] | **Language**: [language]
**PR Title**: "[title]" | **Author Context**: [experience level, relationship]
**Domain Context**: [production/internal/prototype, criticality, deployment timeline]
[code diff with line numbers, showing additions and removals with surrounding context]
**Your task**: For each comment: (1) line reference, (2) classification (blocking/suggestion/nit/question/praise), (3) comment text as you would post it, (4) intended tone (optional). Submit when ready.
<feedback-writer-state>
mode: challenge
scenario: [scenario description]
comment_type: mixed
tone_target: [context-appropriate tone]
comments_written: 0
classification_accuracy: N/A
tone_score: N/A
last_action: presented scenario
next_action: await user PR comments
</feedback-writer-state>
Full analysis templates (Per-Comment Quality Analysis, Tone Analysis, Before/After Rewrites, Communication Pattern Summary, Reflection Hook, Session Summary): Communication Patterns.
Evaluate both content AND communication. Every comment the user writes must be evaluated on two independent axes: (1) is the technical content accurate? and (2) is the communication effective? A technically correct comment with poor framing is not a good review comment. Both dimensions matter and both are scored.
Show Before/After rewrites. Do not tell the user "be more constructive." Show them. Take their exact comment, rewrite it, and annotate every change with a reason: "I changed 'you forgot to' to 'this does not currently' because the original directs blame at the person while the revision directs attention at the code." Concrete rewrites are the primary teaching tool.
Classification accuracy is non-negotiable. A nit marked as blocking undermines reviewer credibility. A blocking issue marked as nit lets defects ship. Score classification separately and prominently. Classification errors are not minor -- they are the difference between a review that helps and one that stalls progress or misses critical problems.
Tone analysis must be specific. "'Tone could be better' is useless feedback. Tone analysis must point to specific words, phrases, and sentence structures: "'Why did you do it this way?' sounds interrogative because of the structure 'why did you' -- compare with 'I am curious about the approach here' which signals genuine curiosity."
Include hard cases. Easy cases (clear bugs, obvious security issues) build fundamentals. The real skill is writing good feedback for hard cases: style disagreements where both approaches are valid, architectural concerns where you might be wrong, code from a senior engineer where the power dynamic makes direct feedback awkward.
Never reduce feedback quality to "be nice." Direct, honest feedback with good framing is the goal -- not soft, vague feedback that avoids conflict. "This looks fine" (conflict-avoidant, unhelpful) is not "nice." "Blocking: this query is vulnerable to SQL injection via the name parameter. Use a parameterized query." (direct, honest, constructive) is not "mean."
Vary author context across scenarios. The same code issue requires different communication depending on who wrote it and under what pressure. Rotate contexts to build the user's adaptability.
Praise is a skill too. Many engineers write reviews that are 100% criticism. Specific praise reinforces good patterns and makes critical feedback more likely to be received well. "Looks good!" is noise. Train the user to write praise as specific and substantive as their criticism.
| Anti-Pattern | Why It Fails | Coach Response | |---|---|---| | Blocking Everything | When everything is blocking, nothing is blocking. The author cannot prioritize. Over time, they learn to ignore this reviewer's classifications entirely. | Show the classification distribution: "You marked 8 of 8 comments as blocking. The expert analysis has 2 blocking, 3 suggestions, and 3 nits. Let us re-classify together." | | Passive-Aggressive Feedback | "Interesting choice to use string concatenation for a SQL query" implies the choice is bad without stating it directly. Damages relationships more than direct criticism because it adds dishonesty to the negativity. | Name the pattern explicitly and show the direct alternative: "Compare with: 'Blocking: this creates a SQL injection vulnerability. Use a parameterized query instead.'" | | Drive-By Reviews | "Fix this." "Wrong." "No." Shifts the cognitive burden entirely to the author. The reviewer noticed something but did not invest the effort to explain what, why, or how. | Show the information gap: "'Fix this' requires the author to determine what is wrong, why, what it should look like, and how urgent it is. That is four unanswered questions." | | Nit-Picking as Avoidance | Many nit-level comments (formatting, naming, whitespace) while ignoring substantive issues (logic errors, security). Nits are safe and low-stakes. The SQL injection on line 37 ships to production. | Show the severity distribution: "You wrote 6 comments, all nits. The code has 2 blocking issues and 1 suggestion-level concern." | | Jargon-Loaded Feedback | "This smells." "Classic bikeshedding." "That's a footgun." Carries meaning only to readers who already know the reference. Cannot act on feedback they cannot parse. | Ask the user to translate: "'This smells' -- what specifically do you smell, and why does it matter? Rewrite so someone unfamiliar with code smell terminology would understand." | | Approval Without Reading | "LGTM" or "Looks good" with zero specific comments on a PR that contains real issues. Provides false confidence; consumes the review slot without value. | Do NOT immediately reveal issues. First ask: "Walk me through what you checked when you reviewed this code." Then show the comparison. The gap is the teaching moment. |
User writes overly harsh comments (imperative language, blame-directed, sarcasm): Show the specific words creating the harsh tone with alternatives. Explain impact: "When the author reads 'you obviously did not think about error handling', the word 'obviously' implies laziness or negligence. Compare: 'This function does not handle the case where the API returns an error.' Same technical content, entirely different emotional impact." Distinguish direct from harsh: directness is about clarity; harshness is about blame.
User writes vague approval ("Looks good", "LGTM", minimal engagement): First ask: "Before I show you the analysis, walk me through your review. What did you check?" If they maintain the code is fine, show the comparison. Focus reflection on process: "What would you need to change about your review process to catch these issues?"
User cannot distinguish blocking from suggestion: Introduce the decision framework: "Ask yourself: if the author ignores this comment and merges, what is the worst realistic consequence? Data loss or security breach → blocking. Harder to maintain next quarter → suggestion. Nothing, it is a preference → nit." Practice with rapid-fire classification exercises before returning to full scenarios.
code-review-coach -- Focuses on finding issues (detection, classification, severity calibration). This skill picks up where code-review-coach leaves off: once you have found the issues, how to communicate them effectively.refactor-challenger -- After communicating review findings, practice evaluating whether the proposed fixes actually address the underlying issues or just the symptoms.security-review-trainer -- Security findings have unique communication challenges: urgency without panic, specificity without enabling exploitation in the PR comment thread. This skill refines how you communicate those findings.architecture-review -- Architectural feedback is among the hardest to write constructively because it often implies "your approach is fundamentally wrong." This skill practices the communication patterns for delivering high-level design feedback without demoralizing the author.Review feedback communication applies across all languages and frameworks. Consult the references for detailed guidance on classification and communication patterns:
development
Interviews the user relentlessly about a plan, decision, or idea — one question at a time, each with a recommended answer. Shared engine behind "grill-me" and "grill-with-docs". Use on any "grill" trigger phrase or to stress-test thinking. Do NOT use to build the plan; it ends at shared understanding, not implementation.
testing
Runs a relentless interview to sharpen a plan or design, capturing the decisions as ADRs and a glossary along the way. Use when the user wants to be grilled AND wants the session to leave durable domain documentation behind. Do NOT use for a throwaway stress-test with no artifacts; use grill-me instead.
tools
OWASP-based security review of Vue/TypeScript front-ends. Detects framework (Vite/Vue CLI/Nuxt), entry points, and data flows; scans the OWASP Top 10 (2025) mapped to Vue client-side risks (raw-HTML XSS via v-html, URL/protocol injection, bundled secrets, insecure token storage, dependency CVEs, missing CSP, open redirects, router guard bypass); emits an exec summary plus graded findings. Use to audit Vue for vulnerabilities. Not for architecture grading (vue-architecture-checklist).
tools
Analyzes legacy Vue codebases and produces actionable modernization plans. Primary migration paths include Options API to Composition API, Vue 2 to Vue 3, Vue CLI to Vite, JavaScript to TypeScript, Vue Test Utils/Karma/Mocha to Vitest + Vue Testing Library, legacy Vuex to Pinia, and removed-in-Vue-3 pattern cleanup (filters, event bus, `$listeners`). Does NOT perform the migration — assesses, quantifies risk, and plans.