diff --git a/.claude/settings.json b/.claude/settings.json
new file mode 100644
index 0000000000..6ae2762c40
--- /dev/null
+++ b/.claude/settings.json
@@ -0,0 +1,10 @@
+{
+ "permissions": {
+ "allow": [
+ "Bash(gh repo view:*)",
+ "Bash(gh release list:*)",
+ "Bash(gh pr list:*)",
+ "Bash(gh api repos/*/releases/*)"
+ ]
+ }
+}
diff --git a/.claude/skills/release-check/SKILL.md b/.claude/skills/release-check/SKILL.md
new file mode 100644
index 0000000000..06d6282939
--- /dev/null
+++ b/.claude/skills/release-check/SKILL.md
@@ -0,0 +1,94 @@
+---
+name: release-check
+description: Audit PRs since a release tag, verify labels, and recommend a version bump
+---
+
+# Release Check
+
+Audit PRs merged since a given version tag, verify labels, and recommend a version bump.
+
+## Steps
+
+### 1. Determine repo and latest release tag
+
+Detect the repo and latest release tag automatically. If the user provides a specific tag or compare URL, use that instead.
+
+```bash
+# Get repo from git remote (e.g. "ruby/rdoc")
+gh repo view --json nameWithOwner --jq '.nameWithOwner'
+
+# Get latest release tag
+gh release list --limit 1 --json tagName --jq '.[0].tagName'
+
+# Get the release date
+gh api repos/{repo}/releases/tags/{tag} --jq '.published_at'
+```
+
+If the user provides a specific tag or compare URL, use that instead.
+
+### 2. Fetch PRs merged since the tag
+
+```bash
+gh pr list --repo {repo} --state merged --base master \
+ --search "merged:>={release_date}" \
+ --json number,title,body,labels,mergedAt,url --limit 100
+```
+
+Filter out the version-bump commit for the tag itself (e.g., "Bump version to v7.1.0").
+
+### 3. Identify release-relevant labels
+
+Read `.github/release.yml` to find which labels map to changelog categories (currently `bug`, `enhancement`, `documentation`). PRs outside these categories appear under "Other Changes" and do not need labels.
+
+### 4. Report: PRs missing release-relevant labels
+
+List PRs that look like they **should** have a release-relevant label but don't. Use the PR title and description to judge:
+
+- Titles starting with "Fix" or describing a fix → likely needs `bug`
+- Titles describing new features or capabilities → likely needs `enhancement`
+- Titles about docs → likely needs `documentation`
+
+PRs that are clearly CI, dependency bumps, refactors, or test-only changes do **not** need these labels.
+
+**Format each PR as a clickable URL** (not just a number), followed by its title and current labels:
+
+```
+### PRs that may need labels
+
+- https://github.com/ruby/rdoc/pull/1547 — Expand GitHub style references in ChangeLog to URL
+ Suggested: `enhancement`
+
+### PRs without release-relevant labels (OK)
+
+- https://github.com/ruby/rdoc/pull/1577 — Fix a test that uses invalid syntax
+- https://github.com/ruby/rdoc/pull/1586 — Removed truffleruby from CI
+```
+
+### 5. Full PR list grouped by label
+
+Show all PRs grouped by their release-relevant label, with URLs:
+
+```
+### Enhancements
+- https://github.com/ruby/rdoc/pull/1544 — Highlight bash commands
+
+### Bug Fixes
+- https://github.com/ruby/rdoc/pull/1559 — Replace attribute_manager with new parser
+...
+
+### Documentation
+...
+
+### Other Changes
+- (dependency bumps, CI, refactors, test fixes)
+```
+
+### 6. Version bump recommendation
+
+Apply semver reasoning:
+
+- **Major** — breaking changes to public API or behavior users depend on
+- **Minor** — new features, significant internal rewrites that change behavior, enhancements
+- **Patch** — only bug fixes, documentation, and maintenance
+
+Explain the reasoning, highlighting the most impactful changes by URL.
diff --git a/.github/workflows/cloudflare-preview.yml b/.github/workflows/cloudflare-preview.yml
index 3d3ad26d72..a44cf2b3ee 100644
--- a/.github/workflows/cloudflare-preview.yml
+++ b/.github/workflows/cloudflare-preview.yml
@@ -19,7 +19,7 @@ jobs:
ref: ${{ github.event.client_payload.pr_head_sha }}
- name: Setup Ruby
- uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0
+ uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
with:
ruby-version: '3.4'
bundler-cache: true
diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml
index 8c7d4271f7..543334d054 100644
--- a/.github/workflows/gh-pages.yml
+++ b/.github/workflows/gh-pages.yml
@@ -22,7 +22,7 @@ jobs:
- name: Checkout
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Setup Ruby
- uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0
+ uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
with:
ruby-version: '3.2'
bundler-cache: true
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index fc05ba5b9f..eb008f86f5 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -21,7 +21,7 @@ jobs:
- if: ${{ matrix.os == 'ubuntu-latest' }}
run: sudo apt install libyaml-dev
- name: Set up Ruby
- uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0
+ uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
with:
ruby-version: 3.3
bundler-cache: true
diff --git a/.github/workflows/push_gem.yml b/.github/workflows/push_gem.yml
index 6a80256cb0..08c0cb6f36 100644
--- a/.github/workflows/push_gem.yml
+++ b/.github/workflows/push_gem.yml
@@ -23,14 +23,14 @@ jobs:
steps:
- name: Harden Runner
- uses: step-security/harden-runner@e3f713f2d8f53843e71c69a996d56f51aa9adfb9 # v2.14.1
+ uses: step-security/harden-runner@5ef0c079ce82195b2a36a210272d6b661572d83e # v2.14.2
with:
egress-policy: audit
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up Ruby
- uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0
+ uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
with:
bundler-cache: true
ruby-version: ruby
diff --git a/.github/workflows/ruby-core.yml b/.github/workflows/ruby-core.yml
index 6afc27d9b8..7bacb4452c 100644
--- a/.github/workflows/ruby-core.yml
+++ b/.github/workflows/ruby-core.yml
@@ -22,7 +22,7 @@ jobs:
timeout-minutes: 30
steps:
- name: Set up latest ruby head
- uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0
+ uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
with:
ruby-version: head
bundler: none
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 7d3c22c638..347ac54eff 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -43,7 +43,7 @@ jobs:
- if: ${{ matrix.os == 'ubuntu-latest' }}
run: sudo apt install libyaml-dev
- name: Set up Ruby
- uses: ruby/setup-ruby@8d27f39a5e7ad39aebbcbd1324f7af020229645c # v1.287.0
+ uses: ruby/setup-ruby@09a7688d3b55cf0e976497ff046b70949eeaccfd # v1.288.0
with:
ruby-version: ${{ matrix.ruby }}
bundler-cache: true # 'bundle install' and cache
diff --git a/lib/rdoc/generator/template/aliki/class.rhtml b/lib/rdoc/generator/template/aliki/class.rhtml
index 7c571bc88b..39c303279a 100644
--- a/lib/rdoc/generator/template/aliki/class.rhtml
+++ b/lib/rdoc/generator/template/aliki/class.rhtml
@@ -40,10 +40,10 @@
<%- klass.each_section do |section, constants, attributes| %>
-
+
<%- if section.title then %>
@@ -58,7 +58,7 @@
<%- unless constants.empty? then %>
<%- constants.each do |const| %>
@@ -83,7 +83,7 @@
<%- unless attributes.empty? then %>
<%- attributes.each do |attrib| %>
@@ -118,7 +118,7 @@
<%- next if methods.empty? %>
<%- methods.each do |method| %>