feat: nextsteps-specific PR review skill (NES-1498)#8936
Conversation
…NES-1498) Add review-pr skill (.claude/commands/ and .cursor/skills/) with dynamic convention loading — Step 1.6 loads matching rules and AGENTS.md files based on changed file paths, making reviews aware of project conventions. Add AGENTS.md convention guides for: - apps/journeys/ (component patterns, providers, i18n, block model) - apps/journeys-admin/ (editor architecture, 60+ hooks, test patterns) - apis/ (api-journeys, api-journeys-modern, api-gateway — Prisma, Pothos, customizable blocks sync guardrail, ACL parity rule) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughAdds a documented PR review command/skill (parameterized pr/mode/auto) with thread deduplication, PR scoping, rule/AGENTS.md-based conventions loading, triage and confirmation flows, remote/local posting modes; and three new AGENTS convention guides for APIs, journeys-admin, and journeys apps. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
participant CLI as CLI / Operator
participant Skill as Review Skill
participant Repo as Repo (rules & AGENTS.md)
participant GH as GitHub API
participant Operator as Operator
CLI->>Skill: invoke review-pr(pr?, mode, auto)
Skill->>Repo: load changed files, matching rules & AGENTS.md
Skill->>GH: fetch PR diff & metadata
Skill->>GH: query existing review threads (paginated GraphQL)
Skill->>Skill: scope review (Deep / Scan / Skim) and apply conventions
Skill->>Skill: triage findings (Critical / Concern / Nit / Skip)
alt auto = false
Skill->>Operator: present "PR Review Triage" for confirmation
Operator-->>Skill: confirm / modify
end
alt mode = remote
Skill->>GH: submit single inline-comment review (event based on triage & draft status)
else mode = local
Skill-->>CLI: render findings locally (option: "post it" to remote later)
end
Estimated code review effort🎯 1 (Trivial) | ⏱️ ~2 minutes 🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
View your CI Pipeline Execution ↗ for commit 2547b45
☁️ Nx Cloud last updated this comment at |
There was a problem hiding this comment.
Actionable comments posted: 6
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.claude/commands/review-pr.md:
- Around line 134-154: Add a language hint to the fenced triage example block
that begins with "## PR Review Triage — PR `#123`: <title>" by changing the
opening ``` to a language-specific fence such as ```markdown (or ```text) so
markdownlint passes; keep the closing ``` unchanged and apply the same change in
the suggested doc fix snippet.
- Around line 36-66: The GraphQL query for reviewThreads only fetches the first
page and can miss older threads; update the logic around the query (the GraphQL
call that asks for repository.pullRequest.reviewThreads and reads
pageInfo.hasNextPage/endCursor) to iterate pages: when pageInfo.hasNextPage is
true, re-run the query with an after:$cursor variable using endCursor, append
nodes to a cumulative reviewThreads list, and only run the existing
deduplication/posting logic after all pages are fetched so duplicates are
avoided.
In @.cursor/skills/review-pr/SKILL.md:
- Around line 141-159: The fenced code block containing the PR triage example is
unlabeled and triggers MD040; fix it by adding a language tag (e.g., change the
leading ``` to ```markdown or ```text) for the fence that surrounds the "## PR
Review Triage — PR `#123`: <title>" example so the block is properly recognized;
update the same fence in the suggested doc fix snippet (replace ``` with
```markdown) to keep both examples consistent.
- Around line 42-73: The current GraphQL fetch only reads the first 100
reviewThreads and must be converted to cursor-based pagination: change the query
to accept a $cursor (nullable) and pass it as after: $cursor into reviewThreads,
then loop while pageInfo.hasNextPage is true by re-running the query with
$cursor set to pageInfo.endCursor, accumulating reviewThreads.nodes across
iterations; after collecting all nodes run the existing deduplication logic.
Ensure you update the query variables and the caller loop that invokes
reviewThreads to use $cursor, and reference the pageInfo.hasNextPage and
pageInfo.endCursor fields to drive the loop.
In `@apis/AGENTS.md`:
- Around line 181-183: The doc's "Editable text fields" guardrail is
incorrect—update the APIS.md wording to match the implementation used in
journeyCustomizable.service.ts and recalculateJourneyCustomizable.ts: state that
editable text is determined by journeyCustomizationDescription != null
(non-empty/non-null) rather than requiring journeyCustomizationFields count > 0,
and remove or clarify the requirement about journeyCustomizationFields to avoid
false-positive critical reviews.
In `@apps/journeys-admin/AGENTS.md`:
- Around line 23-32: The fenced code blocks showing directory examples (e.g.,
the blocks containing "ComponentName/", "Editor/", and "src/libs/") are
unlabeled and trigger MD040; update each triple-backtick fence to include a
language identifier (use text for plain listings or bash if showing commands) so
the blocks become ```text or ```bash accordingly, ensuring all occurrences
(including the other examples noted around the Editor/ and src/libs/ listings)
are consistently labeled.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 1baaa53f-15cb-4f98-a366-bcdae7458dff
📒 Files selected for processing (5)
.claude/commands/review-pr.md.cursor/skills/review-pr/SKILL.mdapis/AGENTS.mdapps/journeys-admin/AGENTS.mdapps/journeys/AGENTS.md
|
The latest updates on your projects.
|
There was a problem hiding this comment.
🧹 Nitpick comments (2)
apis/AGENTS.md (1)
18-18: Consider softening the soft-delete filtering requirement.The guidance says "Always filter
where: { deletedAt: null }" but some legitimate queries need to access soft-deleted records (admin views, audit logs, restore operations). Consider rephrasing to "Filterwhere: { deletedAt: null }in user-facing queries" or "Typically filter...".📝 Suggested rewording
-- Soft deletes via `deletedAt` field on blocks, journeys, and other entities. Always filter `where: { deletedAt: null }` in queries. +- Soft deletes via `deletedAt` field on blocks, journeys, and other entities. Filter `where: { deletedAt: null }` in user-facing queries (admin/audit queries may need to access soft-deleted records).🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apis/AGENTS.md` at line 18, Update the guidance sentence "Soft deletes via `deletedAt` field on blocks, journeys, and other entities. Always filter `where: { deletedAt: null }` in queries." to soften the mandate—e.g., reword to "Typically filter `where: { deletedAt: null }` in user-facing queries; allow explicit access to soft-deleted records for admin views, audit logs, and restore operations." Ensure the new phrasing replaces the original sentence in AGENTS.md and preserves the mention of the `deletedAt` field and example use-cases (admin/audit/restore)..claude/commands/review-pr.md (1)
211-211: Clarify placeholder substitution in the API call.The command uses literal
OWNER,REPO, andNUMBERplaceholders, but the substitution from the values resolved in lines 168-169 isn't explicitly shown. Consider adding a note that these placeholders should be replaced with the actual values from the earliergh repo viewand PR number, or show the command with variable interpolation (e.g.,repos/$OWNER/$REPO/pulls/$NUMBER/reviews).📝 Suggested clarification
-| gh api repos/OWNER/REPO/pulls/NUMBER/reviews --method POST --input - +| gh api repos/$OWNER/$REPO/pulls/$NUMBER/reviews --method POST --input -Or add a preceding comment:
# Substitute OWNER, REPO from line 168 and NUMBER from the PR parameter gh api repos/$OWNER/$REPO/pulls/$NUMBER/reviews --method POST --input -🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.claude/commands/review-pr.md at line 211, Update the gh API invocation to clarify that OWNER, REPO and NUMBER are placeholders by either replacing the literal placeholders with variable interpolation (e.g., repos/$OWNER/$REPO/pulls/$NUMBER/reviews) or adding a preceding comment that instructs the user to substitute OWNER and REPO from the earlier gh repo view output and NUMBER from the PR parameter; reference the command shown as "gh api repos/OWNER/REPO/pulls/NUMBER/reviews --method POST --input -" so reviewers can locate and update that exact line.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In @.claude/commands/review-pr.md:
- Line 211: Update the gh API invocation to clarify that OWNER, REPO and NUMBER
are placeholders by either replacing the literal placeholders with variable
interpolation (e.g., repos/$OWNER/$REPO/pulls/$NUMBER/reviews) or adding a
preceding comment that instructs the user to substitute OWNER and REPO from the
earlier gh repo view output and NUMBER from the PR parameter; reference the
command shown as "gh api repos/OWNER/REPO/pulls/NUMBER/reviews --method POST
--input -" so reviewers can locate and update that exact line.
In `@apis/AGENTS.md`:
- Line 18: Update the guidance sentence "Soft deletes via `deletedAt` field on
blocks, journeys, and other entities. Always filter `where: { deletedAt: null }`
in queries." to soften the mandate—e.g., reword to "Typically filter `where: {
deletedAt: null }` in user-facing queries; allow explicit access to soft-deleted
records for admin views, audit logs, and restore operations." Ensure the new
phrasing replaces the original sentence in AGENTS.md and preserves the mention
of the `deletedAt` field and example use-cases (admin/audit/restore).
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 6cd9e3be-0e78-4766-90f2-af018b48fae4
📒 Files selected for processing (2)
.claude/commands/review-pr.mdapis/AGENTS.md
|
The latest updates on your projects.
|
jaco-brink
left a comment
There was a problem hiding this comment.
Review summary
Concerns: 2 items (see inline)
Nit: 1 item (see inline)
Overall: Good work — comprehensive convention guides and a well-evaluated skill. A couple of maintenance and accuracy items to consider before merge.
- Add cross-reference sync comments between review-pr command and skill - Add pagination guidance for GraphQL reviewThreads queries - Add language identifiers to unlabeled fenced code blocks (MD040) - Remove hardcoded block type counts from apis/AGENTS.md to avoid drift Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
♻️ Duplicate comments (1)
.cursor/skills/review-pr/SKILL.md (1)
145-163:⚠️ Potential issue | 🟡 MinorAdd language identifier to the triage example fence.
The code fence starting at line 145 lacks a language identifier, which triggers markdownlint MD040. Adding
markdownortextwill fix this.🔧 Suggested fix
-``` +```markdown ## PR Review Triage — PR `#123`: <title>🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.cursor/skills/review-pr/SKILL.md around lines 145 - 163, The markdown code fence in the SKILL.md triage example is missing a language identifier (triggering markdownlint MD040); update the opening triple-backtick that precedes the "## PR Review Triage — PR `#123`: <title>" block to include a language (e.g., change ``` to ```markdown or ```text) so the fenced block is explicitly typed and the linter warning is resolved.
🧹 Nitpick comments (1)
apis/AGENTS.md (1)
15-15: Minor clarification: "no raw SQL" exception could be more precise.The phrase "no raw SQL (except
prisma.$queryRawwhen necessary)" might confuse readers sinceprisma.$queryRawis raw SQL. Consider rephrasing to make the guideline clearer.📝 Suggested rewording
-- ORM for all database access — **no raw SQL** (except `prisma.$queryRaw` when necessary). +- ORM for all database access via Prisma methods — use `prisma.$queryRaw` only when Prisma's query builder is insufficient.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@apis/AGENTS.md` at line 15, The guideline currently says "no raw SQL (except `prisma.$queryRaw` when necessary)" which is misleading because `prisma.$queryRaw` is raw SQL; update the sentence to clearly state that raw SQL should be avoided and only used in exceptional cases via `prisma.$queryRaw` for queries that cannot be expressed with the ORM, e.g., "Use the ORM for all database access; avoid raw SQL except in exceptional cases where you must use prisma.$queryRaw." and ensure the text references `prisma.$queryRaw` as the explicit escape hatch.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Duplicate comments:
In @.cursor/skills/review-pr/SKILL.md:
- Around line 145-163: The markdown code fence in the SKILL.md triage example is
missing a language identifier (triggering markdownlint MD040); update the
opening triple-backtick that precedes the "## PR Review Triage — PR `#123`:
<title>" block to include a language (e.g., change ``` to ```markdown or
```text) so the fenced block is explicitly typed and the linter warning is
resolved.
---
Nitpick comments:
In `@apis/AGENTS.md`:
- Line 15: The guideline currently says "no raw SQL (except `prisma.$queryRaw`
when necessary)" which is misleading because `prisma.$queryRaw` is raw SQL;
update the sentence to clearly state that raw SQL should be avoided and only
used in exceptional cases via `prisma.$queryRaw` for queries that cannot be
expressed with the ORM, e.g., "Use the ORM for all database access; avoid raw
SQL except in exceptional cases where you must use prisma.$queryRaw." and ensure
the text references `prisma.$queryRaw` as the explicit escape hatch.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: a537ed5c-443e-4522-8c8c-6bec0b59794f
📒 Files selected for processing (4)
.claude/commands/review-pr.md.cursor/skills/review-pr/SKILL.mdapis/AGENTS.mdapps/journeys-admin/AGENTS.md
✅ Files skipped from review due to trivial changes (1)
- apps/journeys-admin/AGENTS.md
Review feedback addressed ('"$COMMIT_SHA"')Fixed:
Challenged:
|
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
.claude/commands/review-pr.md (1)
51-52: Add pagination support or document the comment limit in the nested query.The nested
comments(first:30)query on line 51 lacks pagination fields (pageInfo,endCursor,after), while the parentreviewThreadsquery includes full pagination support (lines 42-43). If a review thread has more than 30 comments, the deduplication logic (line 70) may not account for older comments beyond the first 30. Either extend the nested query with pagination fields to match the parent, or add a comment explaining why the 30-comment limit is intentional and whether it poses a risk for deduplication.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.claude/commands/review-pr.md around lines 51 - 52, The nested GraphQL field comments(first:30) lacks pagination and can miss older comments used by your deduplication logic; either extend that nested selection to include pageInfo (endCursor, hasNextPage) and accept an after variable (e.g., comments(first:30, after:$commentsAfter)) so callers can page through comments to match the parent reviewThreads pagination, or add an explicit inline comment next to comments(first:30) documenting that the 30-comment cap is intentional and describing the deduplication risk; update any calling code that relies on the comments selection (the deduplication logic referenced in the review) to use the paginated cursors if you choose the pagination route.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.claude/commands/review-pr.md:
- Around line 38-43: The GraphQL sample used by the gh api graphql command is
missing the cursor variable and the after argument for pagination; update the
query to declare a $cursor variable (e.g., $cursor:String) in the query
variables list and pass it into the reviewThreads field as after: $cursor so
reviewThreads(page...) becomes reviewThreads(first:100, after: $cursor),
ensuring the pagination guidance that references after: $cursor will work when
invoking gh api graphql with a cursor value.
---
Nitpick comments:
In @.claude/commands/review-pr.md:
- Around line 51-52: The nested GraphQL field comments(first:30) lacks
pagination and can miss older comments used by your deduplication logic; either
extend that nested selection to include pageInfo (endCursor, hasNextPage) and
accept an after variable (e.g., comments(first:30, after:$commentsAfter)) so
callers can page through comments to match the parent reviewThreads pagination,
or add an explicit inline comment next to comments(first:30) documenting that
the 30-comment cap is intentional and describing the deduplication risk; update
any calling code that relies on the comments selection (the deduplication logic
referenced in the review) to use the paginated cursors if you choose the
pagination route.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: aca6d7ef-8f69-458b-8aa6-c47893856021
📒 Files selected for processing (1)
.claude/commands/review-pr.md
The reviewThreads query now declares $cursor:String and passes after:$cursor so the pagination guidance actually works when copied. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Review feedback addressed — round 2 (f712c64)Fixed:
Already handled (round 1):
|
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (2)
.cursor/skills/review-pr/SKILL.md (1)
67-67: Clarify the initial GraphQL invocation without a cursor parameter.The query now declares
$cursor:String(nullable), but the example command on line 67 doesn't show how to invoke it initially. While the nullable parameter allows omitting-f cursor=...on the first call, implementers may be uncertain.Suggested clarification
- }' -f owner=OWNER -f repo=REPO -F pr=NUMBER + }' -f owner=OWNER -f repo=REPO -F pr=NUMBER -f cursor=nullOr add a note after line 67:
(Omit `-f cursor=...` on the first call; `$cursor` defaults to `null`.)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.cursor/skills/review-pr/SKILL.md at line 67, Add a short clarifying note explaining how to invoke the GraphQL query when $cursor is omitted: state that the query declares $cursor:String (nullable) so on the initial call you should omit the -f cursor=... argument and the parameter will default to null; update the documentation near the query example (referencing the $cursor variable and the query declaration) with a one-line note like "(Omit -f cursor=... on the first call; $cursor defaults to null.)" so implementers know the initial invocation behavior..claude/commands/review-pr.md (1)
67-67: Clarify the initial GraphQL invocation without a cursor parameter.The query declares
$cursor:String(nullable), but the example command doesn't show the initial invocation syntax. While omitting the cursor parameter works for the first call, adding guidance prevents ambiguity.Suggested clarification
- }' -f owner=OWNER -f repo=REPO -F pr=NUMBER + }' -f owner=OWNER -f repo=REPO -F pr=NUMBER -f cursor=nullOr add a note:
(On the first call, omit `-f cursor=...` or pass `-f cursor=null`.)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.claude/commands/review-pr.md at line 67, The example command for invoking the GraphQL query is ambiguous about the nullable $cursor:String parameter; update the documentation around the example (the curl/graphql invocation shown ending with }' -f owner=OWNER -f repo=REPO -F pr=NUMBER) to explicitly state how to call the first request: either omit -f cursor=... entirely or pass -f cursor=null, or show an explicit initial example without the cursor parameter, and add the suggested parenthetical note "(On the first call, omit `-f cursor=...` or pass `-f cursor=null`)."
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.cursor/skills/review-pr/SKILL.md:
- Line 191: Update the "If `auto=true`: Always use `COMMENT` regardless of
findings." explanation to mirror the behavior described in the other doc by
appending the operator-review context (e.g., "The operator reviews the PR after
the autonomous cycle completes — they decide whether to request changes or
approve.") so it clearly explains why `COMMENT` is always used; locate the text
by searching for the literal "If `auto=true`" and the `COMMENT` keyword and
replace or extend that sentence to include the operator review sentence
verbatim.
- Line 16: Update the `auto` parameter description so it matches the one in the
other doc: keep "`auto` — `true` or `false` (default `false`). When `true`, skip
the operator confirmation gate (Step 4) and proceed directly to
posting/displaying. Use `COMMENT` as the review event (never `REQUEST_CHANGES`
or `APPROVE` without a human)." and append the phrase "Intended for build-loop
autonomous invocation." to the end of that sentence; locate the `auto` parameter
description in SKILL.md and replace the existing sentence with this synced
version.
---
Nitpick comments:
In @.claude/commands/review-pr.md:
- Line 67: The example command for invoking the GraphQL query is ambiguous about
the nullable $cursor:String parameter; update the documentation around the
example (the curl/graphql invocation shown ending with }' -f owner=OWNER -f
repo=REPO -F pr=NUMBER) to explicitly state how to call the first request:
either omit -f cursor=... entirely or pass -f cursor=null, or show an explicit
initial example without the cursor parameter, and add the suggested
parenthetical note "(On the first call, omit `-f cursor=...` or pass `-f
cursor=null`)."
In @.cursor/skills/review-pr/SKILL.md:
- Line 67: Add a short clarifying note explaining how to invoke the GraphQL
query when $cursor is omitted: state that the query declares $cursor:String
(nullable) so on the initial call you should omit the -f cursor=... argument and
the parameter will default to null; update the documentation near the query
example (referencing the $cursor variable and the query declaration) with a
one-line note like "(Omit -f cursor=... on the first call; $cursor defaults to
null.)" so implementers know the initial invocation behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: CHILL
Plan: Pro
Run ID: 5296e3b1-8605-484f-a908-980a3a33163a
📒 Files selected for processing (2)
.claude/commands/review-pr.md.cursor/skills/review-pr/SKILL.md
- Sync auto=true explanation in SKILL.md with commands/review-pr.md - Remove "Intended for build-loop autonomous invocation" — core repo is not aware of the build-loop; auto=true is a generic concept. Addresses CodeRabbit review feedback on PR #8936.
Review feedback addressed (6b65f51)Fixed:
Skipped (already resolved by author):
|
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Overview
Adds a
review-prskill (both Claude Code and Cursor) that auto-loads project conventions when reviewing PRs. When a PR touches files inapps/journeys-admin/, the skill loadsapps/journeys-admin/AGENTS.mdand the matching.claude/rules/— making it aware of MUI-only, i18n, provider stack, and testing conventions. Same for APIs (Prisma patterns, Pothos conventions, the customizable blocks sync guardrail, ACL parity rule).What's added:
.claude/commands/review-pr.md— Claude Code command.cursor/skills/review-pr/SKILL.md— Cursor skillapps/journeys/AGENTS.md— Convention guide (component patterns, providers, i18n, block model)apps/journeys-admin/AGENTS.md— Convention guide (editor architecture, hooks, test patterns)apis/AGENTS.md— Convention guide covering api-journeys, api-journeys-modern, api-gatewayKey mechanism — Step 1.6 (convention loading):
.claude/rules/and.cursor/rules/path patternsAGENTS.mdfilesFalls back to generic review when no conventions match.
Evaluation
We evaluated the skill against 3 recently merged PRs with real human review feedback:
Strongest result — PR #8896: The
apis/AGENTS.mdACL parity section caused the skill to cross-check the legacy API when the modern API's ACL was changed. No human reviewer or bot did this. It also identified thatread()andjourneyReadAccessWhere()have no shared role constant — the same class of drift that caused the original bug.Weakest result — PR #8883: Most findings were "correct analysis, wrong context" — flagging established patterns on a routine migration PR.
Overall: 38% of new findings were genuinely valuable, 31% were noise (nit-level). The valuable findings were things humans missed. Noise is filterable via the skill's triage confirmation step.
Full evaluation with per-finding triage: NES-1498 comment
Test plan
/review-pr mode=localon a current open PR to validate convention loading🤖 Generated with Claude Code
Summary by CodeRabbit