Skip to content

Add towncrier, update CONTRIBUTING, update workflow and skip CI when not needed - #464

Open
aaronliu0130 wants to merge 5 commits into
cpplint:developfrom
aaronliu0130:crytown
Open

Add towncrier, update CONTRIBUTING, update workflow and skip CI when not needed#464
aaronliu0130 wants to merge 5 commits into
cpplint:developfrom
aaronliu0130:crytown

Conversation

@aaronliu0130

@aaronliu0130 aaronliu0130 commented Aug 11, 2026

Copy link
Copy Markdown
Member

(and fix double backticks while we're at it)

please rebase and merge instead of squashing

Summary by CodeRabbit

  • Chores

    • Improved pull request validation with targeted testing and changelog checks.
    • Added automated enforcement to report validation or changelog failures clearly.
    • Configured standardized changelog fragment categories for features, fixes, breaking changes, and refactoring.
  • Documentation

    • Updated contribution guidance, including pull request summaries, commit titles, TODOs, and refactoring practices.
    • Expanded release instructions covering changelog preparation, testing, and publishing workflows.
    • Corrected historical changelog formatting for improved consistency.

and workflow to make sure each PR affecting *.py has a new changelog
entry
+towncrier
+changes wanted and not
-Google upstream info now that Google's discontinued public version
renames
use double backticks as this is RST
apparently I had been working on something like this in April 2025!
implement skip-changelog label
one job status to check
include summary messages of why failed

As a result of incorporating the changelog check, this should no longer
run on commits to `develop`, which shouldn't be a problem as we don't
directly push there anymore anyways.
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Changes

CI and changelog process

Layer / File(s) Summary
Pull-request validation gating
.github/workflows/ci.yml
The workflow filters changed paths, gates test and changelog jobs, and reports failures through an always-running summary job.
Towncrier changelog process
pyproject.toml, CONTRIBUTING.rst, CHANGELOG.rst
Towncrier settings and contribution and release instructions are added. Historical changelog inline code markup is corrected.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant PullRequest
  participant choose-jobs
  participant build-test
  participant changelog
  participant pass
  PullRequest->>choose-jobs: Classify changed paths and labels
  choose-jobs->>build-test: Provide test gating outputs
  choose-jobs->>changelog: Provide changelog gating outputs
  build-test->>pass: Report test result
  changelog->>pass: Report changelog result
  pass->>PullRequest: Summarize validation status
Loading

Suggested reviewers: cclauss

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main changes: Towncrier integration, contribution guidance, workflow updates, and conditional CI execution.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@cclauss

cclauss commented Aug 11, 2026

Copy link
Copy Markdown
Member

Can we please add zizmor to pre_commit ina separate pull request before we merge this one?

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 10

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/ci.yml:
- Line 62: Update the pull request author condition in the CI workflow to use
github.event.pull_request.user.login and compare it against the exact bot login
pre-commit-ci[bot], preventing changelog checks from running for pre-commit.ci
pull requests.
- Around line 2-4: Update the pull_request activity types in the workflow
trigger to include unlabeled alongside the existing opened, reopened,
synchronize, and labeled events, so removing skip-changelog reruns the exemption
check.
- Around line 1-7: Add a top-level permissions block to the Validation workflow,
granting contents and pull-requests read access for checkout and
dorny/paths-filter. Keep the existing pull_request triggers and concurrency
configuration unchanged.
- Around line 69-80: Update the pass job’s needs list to include choose-jobs,
and add a summary failure check for choose-jobs, build-test, and changelog
results that fails on failure or cancellation but preserves intentional skips.
Ensure the existing success path remains unchanged when all required jobs
complete successfully.
- Around line 75-80: Update the “Fail if changelog ran and failed” and “Fail if
build-test ran and failed” steps to use quoted printf arguments so Markdown
backticks remain literal and newline escapes produce actual line breaks. Change
the changelog CONTRIBUTING link from the crytown branch to develop, while
preserving the existing failure messages and exit behavior.
- Around line 23-30: Update the choose-jobs output gates in the build-test job
and the other affected job condition to explicitly compare their
needs.choose-jobs.outputs values with 'true', rather than relying on string
truthiness; preserve the existing job-selection behavior for true and false
outputs.

In `@CHANGELOG.rst`:
- Line 48: Update the changelog entries so the identifiers readability/braces
and __VA_OPT__(,) are wrapped in double-backtick RST inline-literal markup,
matching the formatting used for other code-like names.

In `@CONTRIBUTING.rst`:
- Around line 53-70: Update the changelog guidance near the “Changes that don't
affect code” and PR description instructions to state that contributors must
request or apply the `skip-changelog` label when omitting an entry, matching the
CI requirement.
- Around line 93-94: Update the tox guidance in the contributor instructions to
use a supported environment such as ``py310`` with double-backtick RST literals,
and state that tox runs pytest, pylint, and mypy but not pre-commit. Add the
requirement that Python changes include a ``changes/*`` fragment unless the pull
request has the ``skip-changelog`` label.

In `@pyproject.toml`:
- Around line 214-216: Add the explicit Towncrier package setting for cpplint
and configure a directory for every custom type in the [tool.towncrier]
configuration, including Breaking, Feature, Bugfix, and Refactor; alternatively,
pin a compatible Towncrier version and explicitly pass the version while
preserving the existing change-fragment directory.
🪄 Autofix

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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 77579cd3-e513-4532-b741-1b1fc78f50df

📥 Commits

Reviewing files that changed from the base of the PR and between 169933e and 91557ed.

📒 Files selected for processing (5)
  • .github/workflows/ci.yml
  • CHANGELOG.rst
  • CONTRIBUTING.rst
  • changes/.gitkeep
  • pyproject.toml

Comment thread .github/workflows/ci.yml
Comment on lines +1 to 7
name: Validation
on:
pull_request:
push:
branches: [master, develop]
workflow_dispatch:
types: [opened, reopened, synchronize, labeled]
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
count=$(rg -c '^permissions:' .github/workflows/ci.yml || true)
test "$count" -eq 1
rg -n -A2 '^permissions:' .github/workflows/ci.yml

Repository: cpplint/cpplint

Length of output: 203


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- workflow ---'
cat -n .github/workflows/ci.yml

printf '%s\n' '--- permissions and action usage ---'
rg -n -C2 'permissions:|dorny/paths-filter|actions/checkout|pull_request_target|pull_request:' .github/workflows .github/actions 2>/dev/null || true

printf '%s\n' '--- repository workflow files ---'
git ls-files '.github/workflows/*' '.github/actions/*'

Repository: cpplint/cpplint

Length of output: 5803


🌐 Web query:

dorny paths-filter v4 pull_request permissions contents read pull-requests read documentation

💡 Result:

When using the dorny/paths-filter action (version 4) in workflows triggered by pull_request or pull_request_target events, the action requires the pull-requests: read permission to use the GitHub REST API for detecting changes against the base branch [1][2][3]. In most common workflow configurations, you should include both pull-requests: read (for the action) and contents: read (typically required by actions/checkout) in your job's permissions block [1][4][5]: permissions: contents: read pull-requests: read If these permissions are not explicitly defined at the job or workflow level, the action may fail with a "Resource not accessible by integration" error because the default token permissions might be insufficient [4][6].

Citations:


Add explicit read-only token permissions.

This workflow runs tox on pull-request code and uses the checkout token. Add:

permissions:
  contents: read
  pull-requests: read

This also prevents dorny/paths-filter from failing when the repository default token permissions are insufficient.

🧰 Tools
🪛 zizmor (1.29.0)

[warning] 1-81: overly broad permissions (excessive-permissions): default permissions used due to no permissions: block

(excessive-permissions)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 1 - 7, Add a top-level permissions
block to the Validation workflow, granting contents and pull-requests read
access for checkout and dorny/paths-filter. Keep the existing pull_request
triggers and concurrency configuration unchanged.

Source: Linters/SAST tools

Comment thread .github/workflows/ci.yml
Comment on lines 2 to +4
on:
pull_request:
push:
branches: [master, develop]
workflow_dispatch:
types: [opened, reopened, synchronize, labeled]

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
rg -n 'types:.*unlabeled' .github/workflows/ci.yml

Repository: cpplint/cpplint

Length of output: 153


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- workflow ---'
cat -n .github/workflows/ci.yml
printf '%s\n' '--- label references ---'
rg -n -C 3 'skip-changelog|unlabeled|labeled|pull_request' .github/workflows README.md .github 2>/dev/null || true

Repository: cpplint/cpplint

Length of output: 7737


🌐 Web query:

GitHub Actions pull_request unlabeled activity type workflow trigger documentation

💡 Result:

To trigger a GitHub Actions workflow when a label is added to or removed from a pull request, you must use the pull_request event with the labeled or unlabeled activity types [1][2]. By default, a pull_request workflow only triggers on the opened, synchronize, and reopened activity types [1][3]. To include labeled or unlabeled activity, you must explicitly define these using the types keyword in your workflow configuration [1][2]. Example configuration: on: pull_request: types: - opened - synchronize - reopened - labeled - unlabeled When you use the types keyword, you must explicitly list all the activity types you want to trigger the workflow, including the default ones if you still want the workflow to run for those events [1][2]. Important Considerations: - If you specify multiple activity types, the workflow will trigger whenever any one of them occurs [4][5]. - You can access information about the event, such as which label was added or removed, using the GitHub Actions context, specifically github.event [6]. - Note that other activity types, such as labeled and unlabeled, do not automatically create workflow runs in an approval-required state (unlike opened, synchronize, and reopened which might trigger security checks if automated) [3][4]. For further details, consult the official GitHub documentation on events that trigger workflows [1][2] and workflow syntax [5].

Citations:


Handle label removal events.

Add unlabeled to the pull_request activity types. Without it, removing skip-changelog does not recompute the exemption, so a previous successful check can remain in effect.

Proposed trigger update
-    types: [opened, reopened, synchronize, labeled]
+    types: [opened, reopened, synchronize, labeled, unlabeled]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
on:
pull_request:
push:
branches: [master, develop]
workflow_dispatch:
types: [opened, reopened, synchronize, labeled]
on:
pull_request:
types: [opened, reopened, synchronize, labeled, unlabeled]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 2 - 4, Update the pull_request
activity types in the workflow trigger to include unlabeled alongside the
existing opened, reopened, synchronize, and labeled events, so removing
skip-changelog reruns the exemption check.

Comment thread .github/workflows/ci.yml
Comment on lines +23 to +30
shouldTest: ${{ steps.filter.outputs.nondoc == 'true' }}
needsLog: ${{ steps.filter.outputs.py == 'true' }}
changelogged: ${{ steps.filter.outputs.hasLog == 'true' }}

build-test:
name: Continuous Integration
needs: choose-jobs
if: needs.choose-jobs.outputs.shouldTest

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
grep -Fq "if: needs.choose-jobs.outputs.shouldTest == 'true'" .github/workflows/ci.yml
grep -Fq "needs.choose-jobs.outputs.needsLog == 'true'" .github/workflows/ci.yml

Repository: cpplint/cpplint

Length of output: 153


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- workflow excerpt ---'
cat -n .github/workflows/ci.yml | sed -n '1,100p'

printf '%s\n' '--- condition references ---'
rg -n -C 3 "shouldTest|needsLog|choose-jobs|build-test|pass:" .github/workflows/ci.yml

Repository: cpplint/cpplint

Length of output: 5737


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
cat -n .github/workflows/ci.yml | sed -n '1,100p'

Repository: cpplint/cpplint

Length of output: 3650


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
import re

text = Path(".github/workflows/ci.yml").read_text()

required = {
    "shouldTest output": r"shouldTest:\s*\$\{\{\s*steps\.filter\.outputs\.nondoc\s*==\s*'true'\s*\}\}",
    "needsLog output": r"needsLog:\s*\$\{\{\s*steps\.filter\.outputs\.py\s*==\s*'true'\s*\}\}",
    "build-test gate": r"if:\s*needs\.choose-jobs\.outputs\.shouldTest\b(?!\s*==)",
    "changelog gate": r"needs\.choose-jobs\.outputs\.needsLog\s*&&",
}

for name, pattern in required.items():
    print(f"{name}: {'present' if re.search(pattern, text) else 'absent'}")

# Job outputs are string-valued at the needs.*.outputs boundary.
for value in ("true", "false"):
    print(f"needs output {value!r}: {'runs' if bool(value) else 'skips'} under non-empty-string truthiness")
PY

Repository: cpplint/cpplint

Length of output: 375


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
import re

text = Path(".github/workflows/ci.yml").read_text()

checks = {
    "shouldTest output": r"shouldTest:\s*\$\{\{\s*steps\.filter\.outputs\.nondoc\s*==\s*'true'\s*\}\}",
    "needsLog output": r"needsLog:\s*\$\{\{\s*steps\.filter\.outputs\.py\s*==\s*'true'\s*\}\}",
    "build-test direct gate": r"if:\s*needs\.choose-jobs\.outputs\.shouldTest\s*$",
    "changelog direct gate": r"needs\.choose-jobs\.outputs\.needsLog\s*&&",
}

for name, pattern in checks.items():
    print(f"{name}: {'present' if re.search(pattern, text, re.MULTILINE) else 'absent'}")

for value in ("true", "false"):
    print(f"{value!r} is non-empty: {bool(value)}")
PY

Repository: cpplint/cpplint

Length of output: 321


Compare both job outputs with 'true'.

Job outputs are strings, so 'false' is truthy in these conditions. Update both gates:

Proposed condition update
-    if: needs.choose-jobs.outputs.shouldTest
+    if: needs.choose-jobs.outputs.shouldTest == 'true'
...
-      needs.choose-jobs.outputs.needsLog &&
+      needs.choose-jobs.outputs.needsLog == 'true' &&
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 23 - 30, Update the choose-jobs output
gates in the build-test job and the other affected job condition to explicitly
compare their needs.choose-jobs.outputs values with 'true', rather than relying
on string truthiness; preserve the existing job-selection behavior for true and
false outputs.

Comment thread .github/workflows/ci.yml
needs.choose-jobs.outputs.needsLog &&
!contains(github.event.pull_request.labels.*.name, 'skip-changelog') &&
!contains(github.event.pull_request.labels.*.name, 'dependencies') &&
github.event.pull_request.user.name != 'pre-commit-ci'

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
! rg -nF 'github.event.pull_request.user.name' .github/workflows/ci.yml
rg -nF 'github.event.pull_request.user.login' .github/workflows/ci.yml

Repository: cpplint/cpplint

Length of output: 217


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- workflow context ---'
sed -n '45,75p' .github/workflows/ci.yml

printf '%s\n' '--- pre-commit identity references ---'
rg -n -i 'pre-commit-ci|user\.(name|login)' .github README.md pyproject.toml setup.cfg 2>/dev/null || true

Repository: cpplint/cpplint

Length of output: 1444


🌐 Web query:

GitHub pre-commit.ci pull request author event pull_request user.login exact value

💡 Result:

The exact value for the pull request author (user login) associated with the pre-commit.ci bot is 'pre-commit-ci[bot]' [1][2][3]. When creating automated workflows in GitHub Actions to filter or identify pull requests created by pre-commit.ci, you can use this identifier within your conditional logic [1][2][3]. For example, to check the author of a pull request in a GitHub Actions workflow step, you would use: ${{ github.event.pull_request.user.login == 'pre-commit-ci[bot]' }} [1][2] This identifier is consistent with GitHub's naming convention for official integration bots [4]. Note that pre-commit.ci operates as an app, and its automated pull requests (such as autoupdates) will appear with this username [5][4].

Citations:


Use user.login and compare it with pre-commit-ci[bot].

pre-commit-ci is not the bot's exact login. The current condition can run the changelog check for pre-commit.ci pull requests.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml at line 62, Update the pull request author
condition in the CI workflow to use github.event.pull_request.user.login and
compare it against the exact bot login pre-commit-ci[bot], preventing changelog
checks from running for pre-commit.ci pull requests.

Comment thread .github/workflows/ci.yml
Comment on lines +69 to +80
pass:
name: Summary
needs: [ build-test, changelog ]
if: always()
runs-on: ubuntu-latest
steps:
- name: Fail if changelog ran and failed
if: ${{ needs.changelog.result == 'failure' }}
run: echo "Please follow instructions under https://github.com/cpplint/cpplint/blob/crytown/CONTRIBUTING.rst#pull-requests to add a changelog entry\nor request the `skip-changelog` label if you believe the changes should not be in the changelog." >> $GITHUB_STEP_SUMMARY; exit 1
- name: Fail if build-test ran and failed
if: ${{ needs.build-test.result == 'failure' }}
run: echo "Failed required test(s).\nSee https://github.com/cpplint/cpplint/blob/develop/CONTRIBUTING.rst#testing for help on testing." >> $GITHUB_STEP_SUMMARY; exit 1

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
grep -Fq 'needs: [ choose-jobs, build-test, changelog ]' .github/workflows/ci.yml
grep -Fq 'needs.choose-jobs.result' .github/workflows/ci.yml

Repository: cpplint/cpplint

Length of output: 153


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- workflow structure ---'
nl -ba .github/workflows/ci.yml | sed -n '1,120p'

printf '%s\n' '--- job identifiers and dependencies ---'
rg -n '^[[:space:]]{2}[A-Za-z0-9_-]+:|^[[:space:]]{4}(needs|if|runs-on):|needs\.[A-Za-z0-9_-]+\.result' .github/workflows/ci.yml

Repository: cpplint/cpplint

Length of output: 220


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
import re

text = Path(".github/workflows/ci.yml").read_text()
jobs = re.search(r"(?ms)^jobs:\n(.*?)(?=^ [A-Za-z]|\Z)", text)
print("jobs section found:", bool(jobs))
for name in ("choose-jobs", "build-test", "changelog", "pass"):
    m = re.search(rf"(?ms)^  {re.escape(name)}:\n(.*?)(?=^  [A-Za-z0-9_-]+:|\Z)", text)
    print(f"\n[{name}]")
    print(m.group(0) if m else "missing")
PY

Repository: cpplint/cpplint

Length of output: 2948


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
import re

text = Path(".github/workflows/ci.yml").read_text()
for name in ("choose-jobs", "build-test", "changelog", "pass"):
    start = re.search(rf"(?m)^  {re.escape(name)}:", text)
    if not start:
        print(f"{name}: missing")
        continue
    end = re.search(r"(?m)^  [A-Za-z0-9_-]+:", text[start.end():])
    block = text[start.start(): start.end() + (end.start() if end else len(text))]
    print(f"\n--- {name} ---")
    print(block)
PY

Repository: cpplint/cpplint

Length of output: 2947


Make the summary fail when job selection fails.

pass does not depend directly on choose-jobs. If choose-jobs fails, its dependent jobs can be skipped, while always() still runs pass. The current failure checks do not detect this state. Add choose-jobs to needs and fail when its result is not success. Also fail for cancelled required jobs while preserving intentional skips.

🧰 Tools
🪛 zizmor (1.29.0)

[warning] 69-81: overly broad permissions (excessive-permissions): default permissions used due to no permissions: block

(excessive-permissions)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 69 - 80, Update the pass job’s needs
list to include choose-jobs, and add a summary failure check for choose-jobs,
build-test, and changelog results that fails on failure or cancellation but
preserves intentional skips. Ensure the existing success path remains unchanged
when all required jobs complete successfully.

Comment thread .github/workflows/ci.yml
Comment on lines +75 to +80
- name: Fail if changelog ran and failed
if: ${{ needs.changelog.result == 'failure' }}
run: echo "Please follow instructions under https://github.com/cpplint/cpplint/blob/crytown/CONTRIBUTING.rst#pull-requests to add a changelog entry\nor request the `skip-changelog` label if you believe the changes should not be in the changelog." >> $GITHUB_STEP_SUMMARY; exit 1
- name: Fail if build-test ran and failed
if: ${{ needs.build-test.result == 'failure' }}
run: echo "Failed required test(s).\nSee https://github.com/cpplint/cpplint/blob/develop/CONTRIBUTING.rst#testing for help on testing." >> $GITHUB_STEP_SUMMARY; exit 1

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
if rg -n 'echo .*`skip-changelog`' .github/workflows/ci.yml; then
  exit 1
fi
rg -n 'printf|GITHUB_STEP_SUMMARY' .github/workflows/ci.yml

Repository: cpplint/cpplint

Length of output: 443


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf '%s\n' '--- workflow context ---'
cat -n .github/workflows/ci.yml | sed -n '68,83p'

printf '%s\n' '--- documentation references ---'
rg -n 'CONTRIBUTING\.rst#(pull-requests|testing)|crytown|develop' .github README.md CONTRIBUTING.rst 2>/dev/null || true

printf '%s\n' '--- isolated Bash behavior ---'
tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT
bash -c 'echo "Please follow instructions\nor request the `skip-changelog` label." >> "$1"' bash "$tmp" 2>"$tmp.stderr" || true
printf '%s\n' 'output bytes:'
od -An -t x1c "$tmp"
printf '%s\n' 'stderr:'
cat "$tmp.stderr"
printf '%s\n' 'printf output bytes:'
bash -c 'printf "%s\n" "Please follow instructions" "Or request the \`skip-changelog\` label."' bash | od -An -t x1c

Repository: cpplint/cpplint

Length of output: 2071


🏁 Script executed:

#!/usr/bin/env bash
set -u

out="$(mktemp)"
err="$(mktemp)"
trap 'rm -f "$out" "$err"' EXIT

bash -c 'echo "Please follow instructions\nor request the `skip-changelog` label."' bash \
  >"$out" 2>"$err" || printf 'shell status: %s\n' "$?"

python3 - "$out" "$err" <<'PY'
import pathlib
import sys

for label, path in (("stdout", sys.argv[1]), ("stderr", sys.argv[2])):
    data = pathlib.Path(path).read_bytes()
    print(f"{label} bytes: {data!r}")
PY

printf '%s\n' '--- URL status ---'
for url in \
  'https://github.com/cpplint/cpplint/blob/crytown/CONTRIBUTING.rst#pull-requests' \
  'https://github.com/cpplint/cpplint/blob/develop/CONTRIBUTING.rst#pull-requests' \
  'https://github.com/cpplint/cpplint/blob/develop/CONTRIBUTING.rst#testing'
do
  curl -L -sS -o /dev/null -w '%{http_code} %{url_effective}\n' "$url" || true
done

Repository: cpplint/cpplint

Length of output: 553


Write literal Markdown with printf.

The backticks execute skip-changelog, which produces a command-not-found error and removes the label text. The \n sequence does not produce a newline. Replace echo with quoted printf arguments and use the develop link; the crytown link returns 404.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 75 - 80, Update the “Fail if changelog
ran and failed” and “Fail if build-test ran and failed” steps to use quoted
printf arguments so Markdown backticks remain literal and newline escapes
produce actual line breaks. Change the changelog CONTRIBUTING link from the
crytown branch to develop, while preserving the existing failure messages and
exit behavior.

Comment thread CHANGELOG.rst
* The check for C-style casts now looks for the standard fixed-width integer typenames instead of non-standard ones (e.g. int32_t instead of int32) thanks to @nate-thirdwave (https://github.com/cpplint/cpplint/pull/282)
* `[[(un)likely]]` no longer clouds readability/braces's super spy−scanning of braces, courtesy of @aaronliu0130 (https://github.com/cpplint/cpplint/pull/265)
* `readability/braces` will realize that C++20 concepts require a semicolon, courtesy of @armandas (https://github.com/cpplint/cpplint/pull/288)
* ``[[(un)likely]]`` no longer clouds readability/braces's super spy−scanning of braces, courtesy of @aaronliu0130 (https://github.com/cpplint/cpplint/pull/265)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Finish the RST inline-literal conversion.

Line 48 leaves readability/braces as plain text, and Line 60 leaves __VA_OPT__(,) as plain text. Wrap both identifiers in double backticks to follow the formatting rule documented in CONTRIBUTING.rst, Line 68.

Proposed markup update
-* ``[[(un)likely]]`` no longer clouds readability/braces's super spy−scanning of braces, courtesy of `@aaronliu0130` (https://github.com/cpplint/cpplint/pull/265)
+* ``[[(un)likely]]`` no longer clouds ``readability/braces``'s super spy−scanning of braces, courtesy of `@aaronliu0130` (https://github.com/cpplint/cpplint/pull/265)
...
-* The new __VA_OPT__(,) will now be recognized by the Whitespace linter as a function thanks to `@elrinor` (https://github.com/cpplint/cpplint/pull/237)
+* The new ``__VA_OPT__(,)`` will now be recognized by the Whitespace linter as a function thanks to `@elrinor` (https://github.com/cpplint/cpplint/pull/237)

Also applies to: 60-60

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@CHANGELOG.rst` at line 48, Update the changelog entries so the identifiers
readability/braces and __VA_OPT__(,) are wrapped in double-backtick RST
inline-literal markup, matching the formatting used for other code-like names.

Comment thread CONTRIBUTING.rst
Comment on lines +53 to +70
* add a summary of what your changes do under changes/; see below
* specify the problem solved in the pull request
* make sure that your code passes the tests and lints
* don't force-push to the branch just to squash everything into a single commit. These make the commit history messy, and we'll squash it when merging anyways.
* name the pull request as a `Conventional Commit <https://www.conventionalcommits.org>`_

To avoid conflicts, changelog entries should be added as new files under changes/, which we'll use towncrier to concatenate when releasing.
Each file should be named in the format of "{issue number}.{change type}", (e.g. where {change type} is one of the following:

* ``breaking``, for breaking changes, such as removal of
* ``feature``, for changes that add a feature, such as support for new syntax or new checks
* ``bugfix``, for changes that correct wrong behavior, such as false positives on specific syntax
* ``refactor``, for significant code changes, such as great performance optimizations (probably not just extracting code into functions)
* Changes that don't affect code do not need a changelog entry.

Every entry should be one line like the entries in CHANGELOG.rst. Note that the changelog is `reStructuredText <https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`_, meaning, among other things, that inline code needs two backticks instead of one.

If you believe a change is not significant enough for a changelog entry, please mention this in the PR description.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Document the required changelog exemption label.

The guide says that changes without user-visible code impact do not need a changelog entry, but .github/workflows/ci.yml skips that requirement only when the skip-changelog label is present. A contributor following this instruction can still receive a failing required check. State that contributors must request or apply the skip-changelog label.

Proposed documentation update
-* Changes that don't affect code do not need a changelog entry.
+* Changes that don't affect code do not need a changelog entry. Request the
+  ``skip-changelog`` label in the pull request so CI skips the requirement.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
* add a summary of what your changes do under changes/; see below
* specify the problem solved in the pull request
* make sure that your code passes the tests and lints
* don't force-push to the branch just to squash everything into a single commit. These make the commit history messy, and we'll squash it when merging anyways.
* name the pull request as a `Conventional Commit <https://www.conventionalcommits.org>`_
To avoid conflicts, changelog entries should be added as new files under changes/, which we'll use towncrier to concatenate when releasing.
Each file should be named in the format of "{issue number}.{change type}", (e.g. where {change type} is one of the following:
* ``breaking``, for breaking changes, such as removal of
* ``feature``, for changes that add a feature, such as support for new syntax or new checks
* ``bugfix``, for changes that correct wrong behavior, such as false positives on specific syntax
* ``refactor``, for significant code changes, such as great performance optimizations (probably not just extracting code into functions)
* Changes that don't affect code do not need a changelog entry.
Every entry should be one line like the entries in CHANGELOG.rst. Note that the changelog is `reStructuredText <https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`_, meaning, among other things, that inline code needs two backticks instead of one.
If you believe a change is not significant enough for a changelog entry, please mention this in the PR description.
* add a summary of what your changes do under changes/; see below
* specify the problem solved in the pull request
* make sure that your code passes the tests and lints
* don't force-push to the branch just to squash everything into a single commit. These make the commit history messy, and we'll squash it when merging anyways.
* name the pull request as a `Conventional Commit <https://www.conventionalcommits.org>`_
To avoid conflicts, changelog entries should be added as new files under changes/, which we'll use towncrier to concatenate when releasing.
Each file should be named in the format of "{issue number}.{change type}", (e.g. where {change type} is one of the following:
* ``breaking``, for breaking changes, such as removal of
* ``feature``, for changes that add a feature, such as support for new syntax or new checks
* ``bugfix``, for changes that correct wrong behavior, such as false positives on specific syntax
* ``refactor``, for significant code changes, such as great performance optimizations (probably not just extracting code into functions)
* Changes that don't affect code do not need a changelog entry. Request the
``skip-changelog`` label in the pull request so CI skips the requirement.
Every entry should be one line like the entries in CHANGELOG.rst. Note that the changelog is `reStructuredText <https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`_, meaning, among other things, that inline code needs two backticks instead of one.
If you believe a change is not significant enough for a changelog entry, please mention this in the PR description.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@CONTRIBUTING.rst` around lines 53 - 70, Update the changelog guidance near
the “Changes that don't affect code” and PR description instructions to state
that contributors must request or apply the `skip-changelog` label when omitting
an entry, matching the CI requirement.

Comment thread CONTRIBUTING.rst
Comment on lines +93 to 94
Alternatively, you can run ``tox`` to automatically run all tests and lints. Use ``-e `` followed by the python runner and version (which you must have installed) to automatically generate the testing environment and run the above tests and lints in it. For example, `tox -e py39` does the steps in Python 3.9, `tox -e py313` does the steps in Python 3.13, and `tox -e pypy3` does the steps using the latest version of the pypy interpreter.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- CONTRIBUTING.rst ---'
sed -n '45,105p' CONTRIBUTING.rst

printf '%s\n' '--- pyproject.toml ---'
sed -n '1,45p' pyproject.toml

printf '%s\n' '--- tox.ini ---'
cat -n tox.ini

printf '%s\n' '--- relevant references ---'
rg -n -C 3 'pre-commit|tox -e|py39|py310|py313|pypy3|towncrier|changelog|no changelog|no[- ]?news' CONTRIBUTING.rst pyproject.toml tox.ini .github 2>/dev/null || true

Repository: cpplint/cpplint

Length of output: 13234


🏁 Script executed:

#!/bin/bash
set -eu

printf '%s\n' '--- CI workflow ---'
cat -n .github/workflows/ci.yml | sed -n '1,85p'

printf '%s\n' '--- changelog-related repository configuration ---'
rg -n -C 5 'skip-changelog|changes/|hasLog|nondoc|paths-filter|changelog' .github CONTRIBUTING.rst pyproject.toml

printf '%s\n' '--- deterministic configuration check ---'
python3 - <<'PY'
from pathlib import Path
import re

project = Path("pyproject.toml").read_text()
tox = Path("tox.ini").read_text()
contributing = Path("CONTRIBUTING.rst").read_text()

requires = re.search(r'requires-python\s*=\s*"([^"]+)"', project)
envlist = re.search(r'^envlist\s*=\s*(.+)$', tox, re.MULTILINE)
commands = tox.split("[testenv]", 1)[1].split("commands =", 1)[1].strip().splitlines()
examples = re.findall(r'`tox -e ([^`]+)`', contributing)

print("requires-python:", requires.group(1) if requires else None)
print("tox envlist:", envlist.group(1).strip() if envlist else None)
print("tox commands:", [line.strip() for line in commands if line.strip()])
print("documented tox examples:", examples)
print("py39 below minimum:", "py39" in examples and ">=3.10" in project)
print("pre-commit in tox commands:", any("pre-commit" in line for line in commands))
PY

Repository: cpplint/cpplint

Length of output: 11519


Align the contributor instructions with tox and CI.

  • Replace py39 with a supported environment such as py310 and use double-backtick RST literals.
  • State that tox runs pytest, pylint, and mypy. It does not run pre-commit.
  • Document that Python changes require a changes/* fragment unless the pull request uses the skip-changelog label.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@CONTRIBUTING.rst` around lines 93 - 94, Update the tox guidance in the
contributor instructions to use a supported environment such as ``py310`` with
double-backtick RST literals, and state that tox runs pytest, pylint, and mypy
but not pre-commit. Add the requirement that Python changes include a
``changes/*`` fragment unless the pull request has the ``skip-changelog`` label.

Comment thread pyproject.toml
Comment on lines +214 to +216
[tool.towncrier]
directory = "changes"
type = [ { name = "Breaking" }, { name = "Feature" }, { name = "Bugfix" }, { name = "Refactor" } ]

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
rg -nF 'package = "cpplint"' pyproject.toml
for kind in breaking feature bugfix refactor; do
  rg -nF "directory = \"$kind\"" pyproject.toml
done

Repository: cpplint/cpplint

Length of output: 153


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
printf '%s\n' '--- pyproject.toml Towncrier and dependencies ---'
rg -n -C 8 'towncrier|\[tool\.towncrier\]|\[project\]|\[build-system\]|dependencies|cpplint' pyproject.toml
printf '%s\n' '--- release instructions ---'
rg -n -C 12 'towncrier|__VERSION__|release|changelog' CONTRIBUTING.rst README.rst README.md 2>/dev/null || true
printf '%s\n' '--- version declarations ---'
rg -n -C 3 '__VERSION__|version\s*=' --glob '*.py' --glob 'pyproject.toml' --glob 'setup.cfg' --glob 'setup.py'
printf '%s\n' '--- repository Towncrier fragments ---'
git ls-files 'changes/**' | head -80

Repository: cpplint/cpplint

Length of output: 9596


🌐 Web query:

Towncrier 24.7.0 configuration directory type package default documentation

💡 Result:

In Towncrier 24.7.0, the configuration is managed within either a pyproject.toml or towncrier.toml file under the [tool.towncrier] namespace [1][2]. If both files exist, towncrier.toml takes precedence [3]. Regarding the directory where news fragments are stored: 1. Default Behavior for Python Projects: If you specify the package key in your configuration, Towncrier defaults to looking for a directory named newsfragments located within that package [1]. 2. Default Behavior for Non-Python Projects (or if package is not set): The default is a newsfragments directory relative to either the directory specified by the --dir command-line option or, by default, the directory containing the configuration file [1][3]. 3. Explicit Configuration: You can explicitly set the directory key under [tool.towncrier] to override these defaults [1]. For custom fragment types, you can define them using an array of tables in your configuration file under [[tool.towncrier.type]] [1]. Each type requires a directory key, which specifies the sub-directory name for that fragment type (e.g., "feature", "bugfix") [1][4]. When the top-level directory is set, these section paths are appended to it; otherwise, "newsfragments" is typically added to the end of each path [1].

Citations:


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail
python3 - <<'PY'
from urllib.request import urlopen
from html import unescape
import re

url = "https://towncrier.readthedocs.io/en/24.7.0/configuration.html"
html = urlopen(url, timeout=10).read().decode()
text = unescape(re.sub(r"<[^>]+>", " ", html))
text = re.sub(r"\s+", " ", text)
for term in ("package", "directory", "type"):
    print(f"--- {term} ---")
    for match in re.finditer(term, text, re.IGNORECASE):
        print(text[max(0, match.start()-220):match.start()+500])
PY

Repository: cpplint/cpplint

Length of output: 2439


🌐 Web query:

Towncrier configuration package omitted version discovery pyproject.toml package key

💡 Result:

In Towncrier, the package key in your pyproject.toml (under the [tool.towncrier] section) is used to specify the Python package name, which enables Towncrier to automatically discover your project's version and name [1][2]. When you provide the package key, Towncrier attempts to determine the version using the following mechanisms in order of precedence: 1. Manual Override: Explicitly passing the --version argument via the command line takes highest precedence [2][3]. 2. Configuration File: Setting the version key directly within the [tool.towncrier] section of your pyproject.toml file takes next precedence [2][3]. 3. Automatic Discovery: If no version is explicitly provided via the above methods, Towncrier will attempt to resolve the version using the package specified in the package key [1][2]. It looks for: * Metadata: The installed package's metadata (if the package is installed) [2][3]. * Source Code: A version variable defined in the top-level package, which can be a string literal, a tuple, or an Incremental version object [2][3]. If the package key is omitted or Towncrier is unable to automatically determine the version through these methods, you must provide the version explicitly using the command line flag --version during the build process [1][4]. Note that while recent developments have allowed for more flexible configuration, if you encounter issues with version discovery, ensuring your package is installed in your environment or that a version string is correctly defined in your top-level package will typically resolve the issue [2][3].

Citations:


🌐 Web query:

site:towncrier.readthedocs.io/en/stable/configuration.html "directory" "name.lower" Towncrier type

💡 Result:

In Towncrier, when configuring custom fragment types using the [[tool.towncrier.type]] array in your configuration file, the directory key specifies the subdirectory within the news fragments directory where these fragments are stored [1]. If you do not explicitly provide a value for the name key, the default value used for the fragment type name is the directory name converted to lowercase, which is expressed as name.lower [1]. For example, if you define a fragment type with directory = "Chore", the corresponding category name will default to "chore" unless otherwise specified [1].

Citations:


🌐 Web query:

Towncrier omitted type directory defaults to name.lower release notes

💡 Result:

In recent versions of Towncrier (specifically introduced in the 25.x release series), when defining custom fragment types within the [[tool.towncrier.type]] configuration, the directory key for a custom type now defaults to name.lower() if it is omitted [1][2][3]. This change allows users to define custom fragment types more concisely in their pyproject.toml file by omitting the directory key when they want the directory name to match the lowercase version of the fragment's name [1][4]. For example, if you define a custom type as follows: [[tool.towncrier.type]] name = "Features" Towncrier will treat the directory for these fragments as "features" by default [1][2]. This behavior differs from older versions of Towncrier, where the directory needed to be explicitly specified for custom types [5][6]. The change has been noted as a potential cause for directory location shifts in some projects upgrading to version 25, as the tool's handling of default paths and configuration options evolved [4].

Citations:


Make the Towncrier package and type directories explicit.

towncrier build needs package = "cpplint" to discover cpplint.__VERSION__. Towncrier versions before 25.x also require directory for each custom type. Add these settings or pin Towncrier to a compatible version and pass the version explicitly.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pyproject.toml` around lines 214 - 216, Add the explicit Towncrier package
setting for cpplint and configure a directory for every custom type in the
[tool.towncrier] configuration, including Breaking, Feature, Bugfix, and
Refactor; alternatively, pin a compatible Towncrier version and explicitly pass
the version while preserving the existing change-fragment directory.

@cclauss

cclauss commented Aug 11, 2026

Copy link
Copy Markdown
Member

@CodeRabbit if you make Required GitHub Action jobs optional then they may never be run so your pull request may never be reviewed and merged.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

@cclauss You are correct. A required GitHub Actions job must always run.

A conditional required job can remain pending when its condition is false. That state blocks review and merge.

The workflow should keep one required, always-running status job. It must report success when skipped validation is intentional. It must report failure when selected validation fails.


✏️ Learnings added
Learnt from: cclauss
URL: https://github.com/cpplint/cpplint/pull/464

Timestamp: 2026-08-11T18:02:35.277Z
Learning: For this repository’s GitHub Actions workflows, required status jobs must always run. Do not make a required job conditional, because GitHub can leave its required check pending when its condition evaluates to false. Use an always-running aggregator job to report success for intentional skips and failure for selected validation failures.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

You are interacting with an AI system.

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

ast-grep outline .github/workflows/ci.yml --items all || true
printf '\n--- Workflow job conditions and status checks ---\n'
rg -n -C 5 '(^name:|^on:|^\s{2}[A-Za-z0-9_-]+:|^\s*if:|needs:|always\(\)|success\(\)|failure\(\)|cancelled\(\)|job\.status)' .github/workflows/ci.yml

Length of output: 2961


@cclauss You are correct. A required status check must always run.

I verified .github/workflows/ci.yml. The Continuous Integration and Changelog requirement jobs can be skipped. The Summary job uses if: always() and fails when either job fails.

Branch protection must require Summary, not Continuous Integration or Changelog requirement. This keeps the required check available for every pull request while allowing irrelevant work to be skipped.

🐇🔎


✏️ Learnings added
Learnt from: cclauss
URL: https://github.com/cpplint/cpplint/pull/464

Timestamp: 2026-08-11T18:03:18.621Z
Learning: For the GitHub Actions workflow in `.github/workflows/ci.yml`, conditionally skipped jobs must not be required status checks. The always-running aggregate job, currently named `Summary`, must be the required status check and must propagate failures from conditional jobs.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

You are interacting with an AI system.

@cclauss cclauss left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Can we please add zizmor to pre_commit ina separate pull request before we merge this one?

@yangfan-yf-yf yangfan-yf-yf left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

The trigger change removes both push validation for master/develop and manual workflow_dispatch. As a result, direct branch updates and merge commits are no longer checked by this configuration; only pull-request heads are. That is broader than skipping selected jobs for documentation-only pull requests and drops the post-merge validation present in the current file.

Could you retain the existing push branches and manual dispatch, while applying the pull-request path and changelog gates only where pull-request event data is available? The branch also now needs the #465 rebase already requested by the maintainer; I will re-review the resulting head.

@cclauss

cclauss commented Aug 13, 2026

Copy link
Copy Markdown
Member

Below: This branch has conflicts that must be resolved

@cclauss

cclauss commented Aug 13, 2026

Copy link
Copy Markdown
Member

Too many unrelated things in a single PR… If the tests took a lot of time or resources then I would be supportive of reducing the testing but 2 and a half minutes seems a reasonable test time that does not removing of required tests.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants