.cursor/skills/address-pr-review/SKILL.md
Implement review feedback on the active PR only when it holds up under scrutiny. Do not treat comments as a todo list — evaluate each one against the PR's actual requirements, intended behavior, and codebase reality before changing anything.
Do not reply or resolve threads for fixes you land. Reply on GitHub only when you decide not to implement something (or need clarification).
Review comments are suggestions, not orders. Before touching code, answer:
When in doubt, do not implement — reply asking for clarification or declining with a short rationale. Blindly applying every CodeRabbit/Bugbot comment is a failure mode.
Progress:
- [ ] 1. Resolve active PR
- [ ] 2. Fetch unresolved review threads only
- [ ] 3. Triage each comment
- [ ] 4. Implement valid fixes (minimal diff)
- [ ] 5. Reply only for declined items
- [ ] 6. Validate, commit, push
- [ ] 7. Summarize for the user
gh pr view --json number,url,headRefName,baseRefName
If ambiguous, use the branch the user is on.
Use GraphQL. Read only thread metadata and the first comment body per thread — not full JSON dumps.
gh api graphql -f query='
query($owner: String!, $name: String!, $number: Int!) {
repository(owner: $owner, name: $name) {
pullRequest(number: $number) {
reviewThreads(first: 50) {
nodes {
id
isResolved
comments(first: 1) {
nodes {
databaseId
author { login }
path
line
body
}
}
}
}
}
}
}' -f owner=ORG -f name=REPO -F number=PR_NUMBER \
--jq '.data.repository.pullRequest.reviewThreads.nodes[]
| select(.isResolved == false)
| {threadId: .id, commentId: .comments.nodes[0].databaseId,
author: .comments.nodes[0].author.login,
path: .comments.nodes[0].path, line: .comments.nodes[0].line,
body: .comments.nodes[0].body}'
Skip resolved threads. For each unresolved thread, read the minimum file context needed to act.
Establish PR context before triaging individual threads: skim the PR description, ticket acceptance criteria, and files changed so you know what "correct" looks like.
For every unresolved thread, decide:
| Verdict | Action on GitHub | Action in code |
|---|---|---|
| Valid — fix | Nothing (no reply, do not resolve) | Implement minimal fix |
| Invalid / out of scope / already fixed / not worth it | Reply with brief reason | No change |
| Unclear | Reply asking one focused question | No change until clarified |
Fix only when all of these are true:
Decline (with reply) when:
Validate before acting:
Do not post "fixed in …" replies or resolve threads for implemented fixes.
Use the REST API to reply in thread only when not implementing:
gh api repos/OWNER/REPO/pulls/PR_NUMBER/comments -X POST \
-f body="Not implementing: <concise reason>." \
-F in_reply_to=COMMENT_DATABASE_ID
Reply tone: factual, one or two sentences, no debate.
Do not call resolveReviewThread unless the user explicitly asks to resolve threads.
Example decline replies:
Not implementing: @novu/thalamus is an internal package; maintainer confirmed the bump is intentional.Not implementing: this path is already covered by <other validation>; no behavior change needed.Not implementing: out of scope for this PR — tracked separately in NV-XXXX.Report:
Include counts when useful (e.g. "3 fixed, 7 declined, 2 stale") so it is obvious you triaged critically rather than rubber-stamping.
novu-prepare-pr — full PR prep workflow including review feedback and CI.babysit — merge-ready loop (CI, conflicts, comments at a high level).get-pr-comments — read-only summary of feedback when not implementing yet.