Skip to content

Port improved address-review command from react_on_rails#970

Merged
justin808 merged 1 commit intomainfrom
jg/port-address-review-cmd
Mar 10, 2026
Merged

Port improved address-review command from react_on_rails#970
justin808 merged 1 commit intomainfrom
jg/port-address-review-cmd

Conversation

@justin808
Copy link
Copy Markdown
Member

@justin808 justin808 commented Mar 10, 2026

Summary

Upgraded the address-review custom command with a more sophisticated workflow from react_on_rails. Instead of creating todos for all comments, the command now triages review comments as MUST-FIX (correctness issues), DISCUSS (scope-expanding suggestions), or SKIPPED (style nits and non-actionable feedback), then creates todos only for must-fix items.

Additional improvements: bot comment handling, local factual verification, thread resolution via GraphQL, and category-based user presentation.

Pull Request checklist

- [ ] Add/update test to cover these changes
- [ ] Update documentation
- [ ] Update CHANGELOG file

Other Information

This is an internal tooling improvement with no impact on the published gem.


Note

Low Risk
Documentation/workflow-only change to an internal Claude command; main risk is behavioral mismatch with expectations (e.g., skipping non-must-fix items or resolving threads) rather than production impact.

Overview
Updates the .claude /address-review command to triage review comments into MUST-FIX, DISCUSS, and SKIPPED, and to create todos only for must-fix items (with deduping and guidance to locally verify claims before escalating).

Adjusts bot-handling to keep actionable bot feedback while filtering duplicates/status posts, updates the user-facing output to show the triage breakdown, and adds instructions to reply to addressed comments and resolve review threads via GraphQL when appropriate.

Written by Cursor Bugbot for commit a41e8ff. Configure here.

Summary by CodeRabbit

  • Documentation
    • Updated PR review addressing workflow with new triage system categorizing review comments (MUST-FIX, DISCUSS, SKIPPED)
    • Enhanced process for addressing items, replying to comments, and resolving review threads
    • Improved comment filtering and deduplication logic

Upgrade from basic comment-to-todos workflow to a sophisticated triage system:
- Classify comments as MUST-FIX, DISCUSS, or SKIPPED before creating todos
- Only create todos for MUST-FIX items (correctness bugs, regressions, security)
- Resolve review threads via GitHub GraphQL after addressing comments
- Better bot comment handling: don't skip by default, deduplicate and filter
- Verify factual claims locally before classifying as MUST-FIX
- Present triage summary to user (by category and count)

Co-Authored-By: Claude Haiku 4.5 <[email protected]>
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 10, 2026

Walkthrough

This PR expands the address-review command documentation, introducing a three-category triage system (MUST-FIX, DISCUSS, SKIPPED) for PR review comments, reworking comment filtering logic, restructuring workflow steps into a two-phase flow, and adding GitHub GraphQL-based thread resolution capabilities.

Changes

Cohort / File(s) Summary
AI Review Command Documentation
.claude/commands/address-review.md
Expanded workflow documentation with new triage categorization system for classifying review comments; reworked comment filtering and deduplication logic; restructured steps into two-phase flow (triage + action); added GitHub GraphQL mutations for thread resolution; updated examples and usage patterns reflecting triage-rich output format.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~5 minutes

Possibly related PRs

  • Add address-review command #959: Original PR that introduced the address-review workflow, now being significantly expanded with triage categories and thread resolution capabilities.

Poem

🐰 A hopping tale of reviews so fine,
With triage rules and threads to align,
MUST-FIX and DISCUSS, a sorting delight,
GraphQL mutations to set things right!
The address-review command takes flight! ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: porting an improved command from another repository, which is exactly what the changeset does.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch jg/port-address-review-cmd

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@justin808 justin808 merged commit 122b4ba into main Mar 10, 2026
3 of 4 checks passed
@justin808 justin808 deleted the jg/port-address-review-cmd branch March 10, 2026 02:47
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a41e8ff016

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

- Deduplicate overlapping comments before classifying them. Keep one representative item for the underlying issue.
- Verify factual claims locally before classifying a comment as `MUST-FIX`.
- If a claim appears wrong, classify it as `SKIPPED` and note briefly why.
- Preserve the original review comment ID and thread ID when available so the command can reply to the correct place and resolve the correct thread later.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Fetch review thread IDs before requiring thread resolution

This workflow now depends on resolving review threads, but the fetched comment payloads in Step 3 only keep fields like id, path, body, and line, so there is no guaranteed threadId available to satisfy this new requirement. In the common /pulls/{PR_NUMBER}/comments path, the later GraphQL resolveReviewThread call cannot be formed from the retained data, which means addressed comments will often remain unresolved even when the user expects automatic resolution.

Useful? React with 👍 / 👎.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Mar 10, 2026

Greptile Summary

This PR ports an improved address-review Claude command from react_on_rails into shakapacker, upgrading a simple "fetch-and-todo" workflow into a structured triage pipeline. The command now classifies every review comment as MUST-FIX, DISCUSS, or SKIPPED before creating todos, includes bot comments by default, and adds GraphQL-based review-thread resolution after a comment is addressed.

Key changes:

  • Triage step (Step 4) added between fetching and todo creation; only MUST-FIX items become todos, reducing noise
  • Bot comment policy reversed: bots are no longer skipped by default, since tools like Greptile leave actionable comments
  • Thread resolution via resolveReviewThread GraphQL mutation added after replies are posted (requires thread node IDs, see issues below)
  • Richer user presentation in Step 6: three labelled sections with counts and short reasons for each decision

Issues to address:

  1. Thread ID data gap (line 51): Step 4 instructs the model to preserve "thread IDs," and Step 7 supplies a resolveReviewThread mutation, but the REST API jq queries do not extract usable thread node IDs. The thread-resolution feature will fail or be silently skipped without a supplementary GraphQL fetch or code change.

  2. Pagination limitation silently removed (line 196): The Known Limitations section was edited to remove mention of pagination constraints, but the gh api calls still do not use --paginate. PRs with more than 30 review comments will be silently truncated, potentially causing users to miss feedback.

Confidence Score: 3/5

  • Safe to merge as an internal tooling improvement, but the thread-resolution feature will not function without fixing the thread node ID data gap, and the pagination limitation should be addressed to prevent silent data loss on large PRs.
  • The triage logic and user-presentation improvements are well-designed and will function correctly. However, two concrete issues prevent full usability: (1) the thread-resolution feature cannot work as written because thread node IDs are not fetched from the API, and (2) the pagination limitation was removed from documentation but still exists in the code, which could lead users to unknowingly work with truncated comment sets on large PRs. Neither issue affects the published gem, but both should be resolved before the command is widely used.
  • .claude/commands/address-review.md — specifically lines 51-52 (thread node ID extraction) and lines 196-200 (pagination limitation documentation/code)

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A(["/address-review PR_URL"]) --> B[Step 1: Detect repo\ngh repo view]
    B --> C[Step 2: Parse input\nPR number / URL / comment ID]
    C --> D{Input type?}
    D -->|issue comment ID| E[Fetch single issue comment\nREST: issues/comments/ID]
    D -->|review ID| F[Fetch review comments\nREST: pulls/PR/reviews/ID/comments]
    D -->|PR number only| G[Fetch all PR review comments\nREST: pulls/PR/comments\n⚠ no --paginate flag]
    E & F & G --> H[Filter: skip replies\ninclude bot comments]
    H --> I[Step 4: Triage comments]
    I --> J{Classify each comment}
    J -->|correctness / security / regression| K["MUST-FIX ✅"]
    J -->|scope-expanding / architectural opinion| L["DISCUSS 💬"]
    J -->|style / nit / duplicate / factually wrong| M["SKIPPED ⏭"]
    K --> N[Step 5: TodoWrite\nMUST-FIX items only]
    N --> O[Step 6: Present triage\nMUST-FIX / DISCUSS / SKIPPED]
    L & M --> O
    O --> P{User selects items}
    P --> Q[Step 7: Address selected items\ncode / docs / tests]
    Q --> R[Reply to original comment\ngh api POST /replies]
    R --> S{Thread ID available?\n⚠ not extracted by REST queries}
    S -->|Yes + concern resolved| T[Resolve thread via GraphQL\nresolveReviewThread mutation]
    S -->|No / pending / leave open| U[Leave thread open]
    T & U --> V([Done])
Loading

Comments Outside Diff (2)

  1. .claude/commands/address-review.md, line 51-52 (link)

    Thread ID data gap breaks thread resolution feature

    Step 4 (line 82) instructs the model to "Preserve the original review comment ID and thread ID" for use in Step 7's thread resolution. However, the jq projections in Step 3 only extract id, path, body, line, start_line, user, in_reply_to_id — none of which is the GraphQL thread node ID.

    The GitHub REST API does include a node_id field on comments, but that is the comment's node ID, not the thread's. The resolveReviewThread mutation (line 143) requires a PullRequestReviewThread node ID, which must be fetched separately via GraphQL.

    Without extracting thread node IDs from the API or fetching them supplementally, the thread-resolution feature will fail or be silently skipped. Consider one of these approaches:

    1. Fetch thread IDs separately via GraphQL:
    gh api graphql -f query='
      query($owner:String!,$repo:String!,$pr:Int!) {
        repository(owner:$owner, name:$repo) {
          pullRequest(number:$pr) {
            reviewThreads(first:100) {
              nodes { id isResolved comments(first:10) { nodes { databaseId } } }
            }
          }
        }
      }' -f owner="<OWNER>" -f repo="<REPO>" -F pr=<PR_NUMBER>
    1. Or note in Step 4 that thread resolution requires a manual GraphQL fetch to map comment IDs to thread IDs.
  2. .claude/commands/address-review.md, line 196-200 (link)

    Pagination limitation removed from documentation but not addressed in code

    The Known Limitations section previously documented: "Large PRs: PRs with many comments may require pagination (not currently handled)". This has been removed in this PR, but the gh api calls in Step 3 still do not use --paginate, so the limitation remains unchanged.

    PRs with more than 30 review comments will be silently truncated to the first page. Consider either:

    1. Restoring the limitation note in Known Limitations, or
    2. Adding --paginate to the API calls in Step 3 to fetch all comments:

    The same change should be applied to the other API calls on lines 39 and 45 if they also need complete data for large reviews/comments.

Last reviewed commit: a41e8ff

Copy link
Copy Markdown

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Bugbot Autofix is ON, but it could not run because the branch was deleted or merged before autofix could start.

Use GitHub GraphQL to resolve the thread:

```bash
gh api graphql -f query='mutation($threadId:ID!) { resolveReviewThread(input:{threadId:$threadId}) { thread { id isResolved } } }' -f threadId="<THREAD_ID>"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thread resolution lacks instructions to obtain thread ID

Medium Severity

The thread resolution feature in Step 7 uses resolveReviewThread with a <THREAD_ID>, but there's no way to obtain this value. The REST API calls in Step 3 don't extract node_id (the jq filters exclude it), and even if they did, GitHub's REST API returns comment node IDs, not PullRequestReviewThread node IDs — those are only available via GraphQL. Step 4 says to "Preserve the original review comment ID and thread ID when available," but the data was never fetched. The feature is non-functional as described.

Additional Locations (1)

Fix in Cursor Fix in Web

- **ALWAYS reply to comments after addressing them** to close the feedback loop
- Resolve the review thread after replying when the concern is actually addressed and a thread ID is available
- Default to real issues only. Do not spend a review cycle on optional polish unless the user explicitly asks for it
- Triage comments before creating todos. Only `MUST-FIX` items should become todos by default
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pagination limitation removed without adding pagination support

Medium Severity

The "Known Limitations" section previously warned that large PRs may require pagination (not currently handled). This warning was removed, but the API call on line 51 still lacks the --paginate flag, so gh api only returns the first page (30 items by default). For PRs with more than 30 review comments, the command silently drops comments, potentially missing MUST-FIX items.

Fix in Cursor Fix in Web

@claude
Copy link
Copy Markdown
Contributor

claude bot commented Mar 10, 2026


description: Fetch GitHub PR review comments, triage them, create todos for must-fix items, reply to comments, and resolve addressed threads

Fetch review comments from a GitHub PR in this repository, triage them, and create a todo list only for items worth addressing.

Instructions

Step 1: Determine the Repository

REPO=$(gh repo view --json nameWithOwner -q .nameWithOwner)

If this command fails, ensure gh CLI is installed and authenticated (gh auth status).

Step 2: Parse User Input

Extract the PR number and optional review/comment ID from the user's message:

Supported formats:

  • PR number only: 12345
  • PR URL: https://github.com/org/repo/pull/12345
  • Specific PR review: https://github.com/org/repo/pull/12345#pullrequestreview-123456789
  • Specific issue comment: https://github.com/org/repo/pull/12345#issuecomment-123456789

URL parsing:

  • Extract org/repo from URL path: github.com/{org}/{repo}/pull/{PR_NUMBER}
  • Extract fragment ID after # (e.g., pullrequestreview-123456789123456789)
  • If a full GitHub URL is provided, use the org/repo from the URL instead of the current repo

Step 3: Fetch Review Comments

If a specific issue comment ID is provided (#issuecomment-...):

gh api repos/${REPO}/issues/comments/{COMMENT_ID} | jq '{body: .body, user: .user.login, html_url: .html_url}'

If a specific review ID is provided (#pullrequestreview-...):

gh api repos/${REPO}/pulls/{PR_NUMBER}/reviews/{REVIEW_ID}/comments | jq '[.[] | {id: .id, path: .path, body: .body, line: .line, start_line: .start_line, user: .user.login}]'

If only PR number is provided (fetch all PR review comments):

gh api repos/${REPO}/pulls/{PR_NUMBER}/comments | jq '[.[] | {id: .id, path: .path, body: .body, line: .line, start_line: .start_line, user: .user.login, in_reply_to_id: .in_reply_to_id}]'

Filtering comments:

  • Skip comments where in_reply_to_id is set (these are replies, not top-level comments)
  • Do not skip bot-generated comments by default. Many actionable review comments in this repository come from bots.
  • Deduplicate repeated bot comments and skip bot status posts, summaries, and acknowledgments that do not require a code or documentation change
  • Treat as actionable by default only: correctness bugs, regressions, missing tests, and clear inconsistencies with adjacent code
  • Treat as non-actionable by default: style nits, speculative suggestions, changelog wording, duplicate bot comments, and "could consider" feedback unless the user explicitly asks for polish work
  • Focus on actionable feedback, not acknowledgments or thank-you messages

Error handling:

  • If the API returns 404, the PR/comment doesn't exist - inform the user
  • If the API returns 403, check authentication with gh auth status
  • If the response is empty, inform the user no review comments were found

Step 4: Triage Comments

Before creating any todos, classify every review comment into one of three categories:

  • MUST-FIX: correctness bugs, regressions, security issues, missing tests that could hide a real bug, and clear inconsistencies with adjacent code that would likely block merge
  • DISCUSS: reasonable suggestions that expand scope, architectural opinions that are not clearly right or wrong, and comments where the reviewer claim may be correct but needs a user decision
  • SKIPPED: style preferences, documentation nits, comment requests, test-shape preferences, speculative suggestions, changelog wording, duplicate comments, status posts, summaries, and factually incorrect suggestions

Triage rules:

  • Deduplicate overlapping comments before classifying them. Keep one representative item for the underlying issue.
  • Verify factual claims locally before classifying a comment as MUST-FIX.
  • If a claim appears wrong, classify it as SKIPPED and note briefly why.
  • Preserve the original review comment ID and thread ID when available so the command can reply to the correct place and resolve the correct thread later.

Step 5: Create Todo List

Create a todo list with TodoWrite containing only the MUST-FIX items:

  • One todo per must-fix comment or deduplicated issue
  • For file-specific comments: "{file}:{line} - {comment_summary} (@{username})" (content)
  • For general comments: Parse the comment body and extract the must-fix action
  • Format activeForm: "Addressing {brief description}"
  • All todos should start with status: "pending"

Step 6: Present Triage to User

Present the triage to the user - DO NOT automatically start addressing items:

  • MUST-FIX ({count}): list the todos created
  • DISCUSS ({count}): list items needing user choice, with a short reason
  • SKIPPED ({count}): list skipped comments with a short reason, including duplicates and factually incorrect suggestions
  • Wait for the user to tell you which items to address
  • If useful, suggest replying with a brief rationale on declined items, but do not do so unless the user asks

Step 7: Address Items, Reply, and Resolve

When addressing items, after completing each selected todo item, reply to the original review comment explaining how it was addressed.

For issue comments (general PR comments):

gh api repos/${REPO}/issues/{PR_NUMBER}/comments -X POST -f body="<response>"

For PR review comments (file-specific, replying to a thread):

gh api repos/${REPO}/pulls/{PR_NUMBER}/comments/{COMMENT_ID}/replies -X POST -f body="<response>"

For standalone review comments (not in a thread):

gh api repos/${REPO}/pulls/{PR_NUMBER}/comments -X POST -f body="<response>" -f commit_id="<COMMIT_SHA>" -f path="<FILE_PATH>" -f line=<LINE_NUMBER> -f side="RIGHT"

Note: side is required when using line. Use "RIGHT" for the PR commit side (most common) or "LEFT" for the base commit side.

The response should briefly explain:

  • What was changed
  • Which commit(s) contain the fix
  • Any relevant details or decisions made

After posting the reply, resolve the review thread when all of the following are true:

  • The comment belongs to a review thread and you have the thread ID
  • The concern was actually addressed in code, tests, or documentation, or it was explicitly declined with a clear explanation approved by the user
  • The thread is not already resolved

Use GitHub GraphQL to resolve the thread:

gh api graphql -f query='mutation($threadId:ID!) { resolveReviewThread(input:{threadId:$threadId}) { thread { id isResolved } } }' -f threadId="<THREAD_ID>"

Do not resolve a thread if the fix is still pending, if you are unsure whether the reviewer concern is satisfied, or if the user asked to leave the thread open.

If the user explicitly asks to close out a DISCUSS or SKIPPED item, reply with the rationale and resolve the thread only when the conversation is actually complete.

Example Usage

/address-review https://github.com/org/repo/pull/12345#pullrequestreview-123456789
/address-review https://github.com/org/repo/pull/12345#issuecomment-123456789
/address-review 12345
/address-review https://github.com/org/repo/pull/12345

Example Output

After fetching and triaging comments, present them like this:

Found 5 review comments. Triage:

MUST-FIX (1):
1. ⬜ src/helper.rb:45 - Missing nil guard causes a crash on empty input (@reviewer1)

DISCUSS (1):
2. src/config.rb:12 - Extract this to a shared config constant (@reviewer1)
   Reason: reasonable suggestion, but it expands scope

SKIPPED (3):
3. src/helper.rb:50 - "Consider adding a comment" (@claude[bot]) - documentation nit
4. src/helper.rb:45 - Same nil guard issue (@greptile-apps[bot]) - duplicate of #1
5. spec/helper_spec.rb:20 - "Consolidate assertions" (@claude[bot]) - test style preference

Which items would you like me to address? (e.g., "1", "1,2", or "all must-fix")

Important Notes

  • Automatically detect the repository using gh repo view for the current working directory
  • If a GitHub URL is provided, extract the org/repo from the URL
  • Include file path and line number in each todo for easy navigation (when available)
  • Include the reviewer's username in the todo text
  • If a comment doesn't have a specific line number, note it as "general comment"
  • NEVER automatically address all review comments - always wait for user direction
  • When given a specific review URL, no need to ask for more information
  • ALWAYS reply to comments after addressing them to close the feedback loop
  • Resolve the review thread after replying when the concern is actually addressed and a thread ID is available
  • Default to real issues only. Do not spend a review cycle on optional polish unless the user explicitly asks for it
  • Triage comments before creating todos. Only MUST-FIX items should become todos by default
  • For large review comments (like detailed code reviews), parse and extract the actionable items into separate todos

Known Limitations

  • Rate limiting: GitHub API has rate limits; if you hit them, wait a few minutes
  • Private repos: Requires appropriate gh authentication scope

justin808 added a commit that referenced this pull request Mar 17, 2026
### Summary

Adds the v9.7.0 changelog section with release notes for all
user-visible changes since v9.6.1:

- **Added**: rspack v2 support (PR #975)
- **Fixed**: Config exporter path traversal and annotation format
validation (PR #914)
- **Fixed**: `webpack-subresource-integrity` v5 named export handling
(PR #978, fixes #972)

Version diff links at the bottom of the file are updated accordingly.

### Pull Request checklist

- [x] ~Add/update test to cover these changes~
- [x] ~Update documentation~
- [x] Update CHANGELOG file

### Other Information

Non-user-visible PRs (#920, #965, #970, #971, #977, #979, #981, #982)
were intentionally excluded per changelog policy.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Documentation-only change updating `CHANGELOG.md`; no runtime code or
dependency changes are introduced in this PR.
> 
> **Overview**
> Adds a new `v9.7.0` section to `CHANGELOG.md` documenting user-visible
changes (rspack v2 support and two fixes around config export
security/validation and `webpack-subresource-integrity` v5 exports).
> 
> Updates the compare links at the bottom so `[Unreleased]` now compares
from `v9.7.0`, and adds the new `[v9.7.0]` tag link.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
8942a43. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
  * Added rspack v2 support

* **Bug Fixes**
  * Improved security and validation handling

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <[email protected]>
justin808 added a commit that referenced this pull request Mar 18, 2026
### Summary

Adds the v9.7.0 changelog section with release notes for all
user-visible changes since v9.6.1:

- **Added**: rspack v2 support (PR #975)
- **Fixed**: Config exporter path traversal and annotation format
validation (PR #914)
- **Fixed**: `webpack-subresource-integrity` v5 named export handling
(PR #978, fixes #972)

Version diff links at the bottom of the file are updated accordingly.

### Pull Request checklist

- [x] ~Add/update test to cover these changes~
- [x] ~Update documentation~
- [x] Update CHANGELOG file

### Other Information

Non-user-visible PRs (#920, #965, #970, #971, #977, #979, #981, #982)
were intentionally excluded per changelog policy.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Documentation-only change updating `CHANGELOG.md`; no runtime code or
dependency changes are introduced in this PR.
> 
> **Overview**
> Adds a new `v9.7.0` section to `CHANGELOG.md` documenting user-visible
changes (rspack v2 support and two fixes around config export
security/validation and `webpack-subresource-integrity` v5 exports).
> 
> Updates the compare links at the bottom so `[Unreleased]` now compares
from `v9.7.0`, and adds the new `[v9.7.0]` tag link.
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
8942a43. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
  * Added rspack v2 support

* **Bug Fixes**
  * Improved security and validation handling

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Claude Opus 4.6 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant