Skip to content

Retire the in-repo changelog in favor of PR-sourced release notes - #864

Merged
d-chambers merged 13 commits into
devfrom
no-changelog
Aug 12, 2026
Merged

Retire the in-repo changelog in favor of PR-sourced release notes#864
d-chambers merged 13 commits into
devfrom
no-changelog

Conversation

@d-chambers

@d-chambers d-chambers commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Description

docs/changelog.qmd has grown to 69 unreleased entries, many of them paragraph-length. Every PR edits the same file, so it conflicts constantly — this PR has had to resolve two — and it duplicates the releases page, which the page's own first line already points at.

This retires it. The page becomes a five-line stub pointing at the releases page, kept only so the published changelog.html URL keeps resolving; the sidebar links to GitHub Releases directly. User-facing information moves to the PR that makes the change, via new User-facing changes and Breaking changes sections in the template, and the draft-release skill assembles the release notes from those PRs at tag time.

tests/test_changelog.py enforces this rather than leaving it a convention: the page must exist, link to the releases page, say that each PR describes its own changes, and carry no list items, no sections, and little prose. Each failure message states the policy and points at the PR template.

Review turned up three bugs in the release skill, which this change makes load-bearing:

  • It scoped PRs to origin/master, but work lands on dev and pre-releases are tagged there. 115 of the 128 commits since v0.1.20 are absent from master, so a run today would have produced a nearly empty changelog.
  • It compressed each PR into one entry in one section. Large PRs do not work that way: Spool index backend #751 alone accounts for 16 of the current entries, remove deprecated APIs #644 for 11.
  • Internal-only PRs (CI, typing, refactors) fell through to Bug Fixes and would have shipped as user-facing bug fixes.

It also now handles pre-release tags, and points the drafter at the pre-stub changelog in git history, whose curated text for already-merged work is richer than those PR bodies. The release page carries that recovery step too. Finally, general_guidelines.qmd and agents.md said feature branches merge to master; both now say dev.

Changelog

  • changed: The Changelog entry in the docs sidebar now links to the GitHub releases page instead of a page on the docs site. The old changelog.html URL still resolves, to a stub pointing at the same place.

Checklist

I have:

  • filled in the Changelog section above, writing "none" if nothing user-facing changes, since release notes are assembled from PRs.

I have (if applicable):

  • referenced the GitHub issue this PR closes.
  • documented the new feature with docstrings and/or appropriate doc page.
  • included tests. See testing guidelines.
  • added the "ready_for_review" tag once the PR is ready to be reviewed.

Summary by CodeRabbit

  • Documentation

    • Release notes are now maintained through pull requests and GitHub Releases.
    • The legacy changelog page now directs readers to GitHub Releases.
    • Updated contribution and release guidance reflects the dev integration branch.
    • Pull request templates now request categorized user-facing and breaking-change details.
  • New Features

    • Added automated validation for pull request changelog entries.
    • Improved release-note generation with categorized entries and pre-release handling.
  • Tests

    • Added checks for valid changelog formats and the legacy changelog stub.

The unreleased section of docs/changelog.qmd had grown to 56 entries, many of
them paragraph-length, and every PR had to edit the same file, so it conflicted
constantly and duplicated what the releases page already tracks.

Reduce the page to a stub pointing at the releases page, so the published
changelog.html URL keeps resolving, and point the sidebar entry at GitHub
Releases directly. User-facing information now lives in the pull request that
makes the change: the PR template gains "User-facing changes" and "Breaking
changes" sections, and the draft-release skill assembles the release notes from
them at tag time.

While making the skill load-bearing, fix three things that would have cost the
next release: it scoped PRs to origin/master although work lands on dev, it
compressed each PR to a single entry in a single section, and it let
internal-only PRs fall through to Bug Fixes. It also now points the drafter at
the pre-stub changelog blob, which holds curated text for work already merged.
@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@d-chambers, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 29 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 20ac7f94-4a47-46fc-9676-33e02c116e6c

📥 Commits

Reviewing files that changed from the base of the PR and between 93a83c0 and 4fd8fa5.

📒 Files selected for processing (4)
  • .agents/agents.md
  • .agents/skills/draft-release/SKILL.md
  • .github/pull_request_template.md
  • .github/scripts/check_pr_changelog.py

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: d310f290-399e-4231-bb8b-c686c655eb65

📥 Commits

Reviewing files that changed from the base of the PR and between 01f304f and 93a83c0.

📒 Files selected for processing (6)
  • .agents/agents.md
  • .agents/skills/draft-release/SKILL.md
  • .github/pull_request_template.md
  • .github/scripts/check_pr_changelog.py
  • docs/contributing/general_guidelines.qmd
  • docs/contributing/publish_a_new_release.qmd
🚧 Files skipped from review as they are similar to previous changes (3)
  • docs/contributing/publish_a_new_release.qmd
  • .github/scripts/check_pr_changelog.py
  • .agents/skills/draft-release/SKILL.md

📝 Walkthrough

Walkthrough

The release workflow now targets dev, uses categorized pull request descriptions for release notes, and directs changelog links to GitHub releases. CI validates the required Changelog section, while tests enforce the retained changelog stub.

Changes

Release workflow transition

Layer / File(s) Summary
Branching conventions
.agents/agents.md, docs/contributing/general_guidelines.qmd
Pull requests target dev. Releases merge dev into master.
Pull request release-note contract
.github/pull_request_template.md, .agents/agents.md, .github/scripts/check_pr_changelog.py, .github/workflows/check_pr_changelog.yml, docs/contributing/general_guidelines.qmd, tests/test_changelog.py
Pull requests require categorized changelog entries, breaking markers, or none. The validator and workflow check the section. Tests cover accepted and rejected formats.
Release drafting and publishing
.agents/skills/draft-release/SKILL.md, docs/contributing/publish_a_new_release.qmd, docs/changelog.qmd, scripts/_templates/_quarto.yml
Release drafting uses the selected branch, handles pre-release series, classifies PR sections, and directs changelog links to GitHub releases.
Changelog stub validation
docs/changelog.qmd, tests/test_changelog.py
The local changelog page remains a fixed releases-page stub. Tests require its exact contents.

Possibly related PRs

  • DASDAE/dascore#613: Both changes update .agents/agents.md and .agents/skills/draft-release/SKILL.md.
  • DASDAE/dascore#688: Both changes revise release guidance in docs/contributing/publish_a_new_release.qmd.
  • DASDAE/dascore#745: Both changes modify release-note generation in SKILL.md.

Suggested labels: documentation, CI

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the primary change: replacing the in-repository changelog with pull-request-sourced release notes.
Description check ✅ Passed The description explains the problem, solution, implementation details, testing, changelog entry, and checklist status.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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 docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch no-changelog

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.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6414d0b7b6

ℹ️ 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".

Comment thread .agents/skills/draft-release/SKILL.md Outdated
entries under the sections they belong to rather than compressing the PR into
a single line. The `User-facing changes` and `Breaking changes` headings of
the PR body are usually already itemized this way.
- Omit PRs with no user-facing effect (the author wrote "None", or the diff shows

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Only omit PRs when every release-note section is None

When a normal non-breaking feature follows the new template, it provides a substantive User-facing changes section and writes None under Breaking changes. This unconditional “the author wrote None” rule can therefore discard the whole PR as internal, systematically removing non-breaking features and fixes from the PR-sourced release notes. Treat None as applying only to its individual heading and omit the PR only when all relevant sections indicate no user-facing effect. .agents/agents.mdL105-L107

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in e2c2f4c. You are right that the rule as written would have discarded every ordinary feature PR, since those write a real user-facing section and "None" under breaking changes. A "None" is now explicitly scoped to the heading it sits under, and a PR is omitted only when every heading says None or the diff shows the change is purely internal.

Comment thread .agents/skills/draft-release/SKILL.md Outdated
Comment on lines +45 to +46
given. It is **not** always `master`: feature work lands on `dev` and
pre-releases are tagged there (see the release docs), so scoping to `master`

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Handle pre-release versions before drafting from dev

When dev is selected for a pre-release as now recommended, step 2 still ignores every aN, bN, and rcN tag and can emit only a final vX.Y.Z tag. For example, after v0.2.0b1 it still uses the last stable tag as its lower bound and proposes v0.2.0 rather than v0.2.0b2, both repeating already-published pre-release notes and risking a stable tag from unreleased dev code. The skill needs pre-release version/series handling before this path is advertised.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in e2c2f4c. Step 2 now checks the target branch for a pre-release tag newer than the latest stable one before computing anything: if there is one it becomes the lower bound for step 3, so already-published pre-release notes are not repeated, and the next tag continues that series rather than jumping to the stable version. Agreed this only became reachable because step 3 now recommends drafting from dev.

Comment thread .agents/agents.md Outdated
2. Create task worktrees under the repository root at `worktrees/{slug}`. Do not create task worktrees under `.agents/worktrees`, even if the current shell starts there.
3. Keep commits focused (one logical change per commit where possible).
4. Use pull requests to merge to `master`.
4. Open pull requests against `dev`, the integration branch, not `master`. `dev` is merged to `master` at release time. Basing a PR on `master` also serves the older pull request template, which lacks the release-note sections.

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 Update the public branching guidance to target dev

The new canonical workflow sends PRs to dev, but the published docs/contributing/general_guidelines.qmd lines 8–9 still tell contributors to merge feature branches directly into master. Human contributors following that page will continue choosing the base branch that this line says serves the old template, defeating the release-note capture this change depends on; update the contributor documentation in the same change. .agents/agents.mdL89-L89

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in e2c2f4c. docs/contributing/general_guidelines.qmd now says feature branches merge into dev, with dev merged to master at release time, matching the agent guide.

Comment thread .agents/agents.md Outdated
2. Create task worktrees under the repository root at `worktrees/{slug}`. Do not create task worktrees under `.agents/worktrees`, even if the current shell starts there.
3. Keep commits focused (one logical change per commit where possible).
4. Use pull requests to merge to `master`.
4. Open pull requests against `dev`, the integration branch, not `master`. `dev` is merged to `master` at release time. Basing a PR on `master` also serves the older pull request template, which lacks the release-note sections.

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 Put the PR template on the default branch

GitHub loads a repository's automatic pull-request template from its default branch, not from the PR's selected base branch. Since this repository's default remains master, merging this change only into dev means PRs opened against dev will still receive master's old template until the next dev-to-master merge, so the PRs needed for the first release after retiring the changelog will lack the new release-note sections. Land the template on the default branch or change the repository default before relying on it. .agents/agents.mdL105-L107

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Partly taken, with a caveat worth recording. The claim in agents.md that basing a PR on master serves the older template is removed in e2c2f4c, because I could not establish it: this review says GitHub loads the template from the default branch, an independent review of the same change said it loads from the base branch, and the two templates are byte-identical on master and dev right now, so nothing in the repo settles it. Rather than assert either, agents.md now just directs PRs at dev without the rationale. The operational point stands regardless: whichever branch serves it, the new sections are fully in effect once dev merges to master.

## Draft the release notes

Compare the merged changes since the previous release and group user-facing changes into a short changelog. The changelog should usually include these sections:
DASCore keeps no changelog in the repository; the release notes *are* the changelog, and they are written from the pull requests merged since the previous tag. Scope them to the branch the release is cut from, which is `dev` for a pre-release and for any work not yet merged down to `master`. Each PR carries its own summary under the `User-facing changes` and `Breaking changes` headings of the [pull request template](https://github.com/DASDAE/dascore/blob/dev/.github/pull_request_template.md), so drafting the notes mostly means collecting and grouping those. The release notes should usually include these sections:

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Document the one-time recovery before deleting curated notes

For the first release after this change, the dozens of deleted unreleased entries describe PRs that were merged before the new body headings existed. This public workflow now claims each PR carries its own summary and presents the agent skill as optional, but it never gives a human maintainer the skill's git show recovery command; following this page or GitHub's generated notes therefore omits the richer curated record from that release. Add the one-time recovery step here or retain the entries until they have been published. .agents/agents.mdL105-L107

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Fixed in 4ac3246. The release page now carries the recovery step itself rather than leaving it only in the skill. It is also no longer the one-liner using git log -1, which breaks across a merge commit: the page now says to find the commit that reduced the changelog to a stub and read the revision before it.

@codecov

codecov Bot commented Aug 11, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (32dd999) to head (4fd8fa5).
⚠️ Report is 3 commits behind head on dev.

Additional details and impacted files
@@            Coverage Diff            @@
##               dev      #864   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files          177       177           
  Lines        20153     20153           
=========================================
  Hits         20153     20153           
Flag Coverage Δ
network 46.74% <ø> (ø)
unittests 100.00% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

- Treat a None as scoped to its own heading; a non-breaking feature writes a
  real user-facing section and None under breaking changes, and must still
  reach the notes.
- Handle pre-release tags in the version step, which drafting from dev makes
  reachable: use the pre-release as the lower bound and continue its series.
- Point the public branching guidance at dev, matching the agent guide.
- Give the release doc the same one-time changelog recovery command the skill has.
- Drop the claim about which branch serves the PR template; reviewers disagreed
  and the repo holds no evidence either way.
@d-chambers

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

The policy was only a convention in agents.md and the PR template, which is
exactly the kind of rule that decays. tests/test_changelog.py holds the page to
a stub: it must exist (the URL is published), link to the releases page, say
that each pull request describes its own changes, and carry no list items, no
sections, and little prose. Each failure message states the policy and points at
the PR template, so whoever trips it learns where the text belongs.
@coderabbitai coderabbitai Bot added the documentation Improvements or additions to documentation label Aug 12, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🤖 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 @.agents/agents.md:
- Line 19: Update the setup flow’s branch-fetching and base-branch commands to
use origin/dev instead of master, while preserving the existing worktree setup
behavior.

In @.agents/skills/draft-release/SKILL.md:
- Around line 40-57: Reorder the release workflow so `<target>` is requested or
resolved before step 2’s pre-release detection. In the pre-release logic,
consider only tags reachable from `origin/<target>` when selecting the newer
series and lower bound; keep step 3’s PR scope based on that same target branch.

In `@tests/test_changelog.py`:
- Around line 71-76: Update test_explains_where_changes_are_described to assert
the changelog’s release-note policy linking each pull request to its own
described changes, rather than only checking for the unrelated substring “pull
request.” Preserve the existing changelog_text fixture and policy failure
context while validating the required relationship between pull requests and
release notes.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: f15986b6-bf62-4e1e-b1ff-383119fa500c

📥 Commits

Reviewing files that changed from the base of the PR and between 32dd999 and 94ed83b.

📒 Files selected for processing (8)
  • .agents/agents.md
  • .agents/skills/draft-release/SKILL.md
  • .github/pull_request_template.md
  • docs/changelog.qmd
  • docs/contributing/general_guidelines.qmd
  • docs/contributing/publish_a_new_release.qmd
  • scripts/_templates/_quarto.yml
  • tests/test_changelog.py

Comment thread .agents/agents.md Outdated
2. Create task worktrees under the repository root at `worktrees/{slug}`. Do not create task worktrees under `.agents/worktrees`, even if the current shell starts there.
3. Keep commits focused (one logical change per commit where possible).
4. Use pull requests to merge to `master`.
4. Open pull requests against `dev`, the integration branch, not `master`. `dev` is merged to `master` at release time.

Copy link
Copy Markdown
Contributor

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

Update the setup command to use dev.

Line 19 makes dev the integration branch. Line 28 still pulls master. New worktrees can therefore start without changes already merged into dev.

Update the setup flow to fetch and base work on origin/dev.

🤖 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 @.agents/agents.md at line 19, Update the setup flow’s branch-fetching and
base-branch commands to use origin/dev instead of master, while preserving the
existing worktree setup behavior.

Comment thread .agents/skills/draft-release/SKILL.md Outdated
Comment on lines +40 to +57
- Pre-releases break both of these rules, and drafting from `dev` (step 3) is
exactly when they occur. Before computing anything, check whether the target
branch carries a pre-release tag (`aN`, `bN`, `rcN`) newer than the latest
stable one. If it does: the lower bound for step 3 is that pre-release tag, not
the last stable release, or the notes will repeat what the pre-release already
published; and the next tag continues the same series (`v0.2.0b1` →
`v0.2.0b2`), or finalizes it to `vX.Y.Z` only when the caller says the series
is ending. Ask which is intended rather than assuming the stable tag.

3. Collect merged PRs since the last release:
- Use the previous release tag identified in step 2 as the lower bound.
- Define PR scope as changes reachable in `last_release_tag..origin/master`
(or `..origin/<default_branch>` if default branch is not `master`).
- Define PR scope as changes reachable in `last_release_tag..origin/<target>`,
where `<target>` is the branch the release will be cut from. Ask if it was not
given. It is **not** always `master`: feature work lands on `dev` and
pre-releases are tagged there (see the release docs), so scoping to `master`
silently omits everything not yet merged down. Sanity-check the choice before
drafting — if `git rev-list --count last_release_tag..origin/<target>` is far
larger than the count against `origin/master`, `dev` is the branch you want.

Copy link
Copy Markdown
Contributor

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

Resolve <target> before selecting a pre-release tag.

Step 2 needs the target branch, but step 3 asks for it later. Ask for <target> before step 2. Then consider only pre-release tags reachable from origin/<target>.

Without this order, a tag from another branch can set the version and lower bound. The drafted notes can then omit or repeat changes.

🧰 Tools
🪛 LanguageTool

[style] ~41-~41: Consider an alternative for the overused word “exactly”.
Context: ..., and drafting from dev (step 3) is exactly when they occur. Before computing anyth...

(EXACTLY_PRECISELY)

🪛 SkillSpector (2.5.1)

[info] 110: [EA3] Scope Creep: Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.

Remediation: Limit the skill's scope to its documented purpose. Remove instructions that enable the agent to perform actions outside its stated functionality.

(Excessive Agency (EA3))

🤖 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 @.agents/skills/draft-release/SKILL.md around lines 40 - 57, Reorder the
release workflow so `<target>` is requested or resolved before step 2’s
pre-release detection. In the pre-release logic, consider only tags reachable
from `origin/<target>` when selecting the newer series and lower bound; keep
step 3’s PR scope based on that same target branch.

Comment thread tests/test_changelog.py Outdated
Replace the six invariant checks with one comparison against the expected text.
Pinning the contents outright is both simpler and stricter: it fails on any
edit, not only on the shapes a rule anticipated.
The sdist grafts tests but ships only docs/LICENSE, so the directory exists
there while the page does not: keying the skip on the directory made the test
fail in an sdist rather than skip. Key it on docs/index.qmd, which is present
only with the real docs tree. Not keyed on changelog.qmd itself, since deleting
the page must fail rather than silently skip.
One required section instead of two, named for what it becomes. Each bullet
carries a Keep-a-Changelog category (added, changed, deprecated, removed, fixed,
security) and is marked **breaking** only when it can break code written against
the last released version -- breakage confined to unreleased dev work is invisible
to users and marking it would train people to ignore the marker.

CheckPRChangelog enforces the section rather than leaving it a convention; the
parser is a script so it can be tested, and the body reaches it through the
environment rather than shell interpolation. The draft-release skill now reads
these categories instead of re-deriving them, and emits Breaking Changes first
followed by the six category sections.
@github-actions

github-actions Bot commented Aug 12, 2026

Copy link
Copy Markdown

✅ Documentation built:
👉 Download
Note: You must be logged in to github and a DASDAE member to access the link.

'- changed: **breaking** x.' parsed as an ordinary changed entry whose text
happened to start with bold words, so an author who put the marker one position
off got a green check and their breaking change would have reached the release
notes unmarked -- the exact failure the marker exists to prevent. It is now
rejected with a message saying where the marker belongs.

Categories are matched case-insensitively in the same pass: a capitalized
'Added:' is a harmless slip and failing CI over it teaches nothing.
@coderabbitai coderabbitai Bot removed the documentation Improvements or additions to documentation label Aug 12, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 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/scripts/check_pr_changelog.py:
- Around line 76-96: Update the Changelog validation flow around the
section-processing logic to validate every non-empty, uncommented line against
ENTRY rather than filtering through _ANY_BULLET; preserve the special case where
the entire section is “none” and keep malformed-entry and stray-marker reporting
intact. Add regression cases in tests/test_changelog.py covering prose before
and after a valid categorized entry.

In `@tests/test_changelog.py`:
- Around line 55-59: Update test_contents_are_unchanged to compare the raw
contents read from _CHANGELOG_PATH directly with _EXPECTED, removing strip()
from both sides so leading and trailing whitespace changes are detected.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 9f52a33d-72fc-405d-9700-1273cab8deff

📥 Commits

Reviewing files that changed from the base of the PR and between 94ed83b and 01f304f.

📒 Files selected for processing (7)
  • .agents/agents.md
  • .agents/skills/draft-release/SKILL.md
  • .github/pull_request_template.md
  • .github/scripts/check_pr_changelog.py
  • .github/workflows/check_pr_changelog.yml
  • docs/contributing/publish_a_new_release.qmd
  • tests/test_changelog.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/contributing/publish_a_new_release.qmd

Comment on lines +76 to +96
bullets = [x for x in section.splitlines() if _ANY_BULLET.match(x.strip())]
if not bullets:
return ["The Changelog section has no entries.", _HELP]
problems = [x.strip() for x in bullets if not ENTRY.match(x.strip())]
if problems:
listed = "\n".join(f" {x}" for x in problems)
return [f"These Changelog entries are malformed:\n{listed}", _HELP]
misplaced = [
x.strip()
for x in bullets
if _STRAY_MARKER.search(ENTRY.match(x.strip()).group("text"))
]
if misplaced:
listed = "\n".join(f" {x}" for x in misplaced)
return [
"These entries carry '**breaking**' in their text, where it is read "
f"as prose rather than as the marker:\n{listed}\n"
"Put it directly after the category, before the colon, e.g. "
"'- changed **breaking**: ...'.",
]
return []

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

Reject non-entry text in the Changelog section.

The validator filters to bullet lines before it validates ENTRY. A section with a valid categorized entry and arbitrary prose passes CI. Require every non-empty, uncommented line to match ENTRY, unless the whole section is none.

  • .github/scripts/check_pr_changelog.py#L76-L96: validate all non-empty section lines instead of filtering to _ANY_BULLET.
  • tests/test_changelog.py#L103-L128: add regression cases with prose before or after a valid categorized entry.
📍 Affects 2 files
  • .github/scripts/check_pr_changelog.py#L76-L96 (this comment)
  • tests/test_changelog.py#L103-L128
🤖 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/scripts/check_pr_changelog.py around lines 76 - 96, Update the
Changelog validation flow around the section-processing logic to validate every
non-empty, uncommented line against ENTRY rather than filtering through
_ANY_BULLET; preserve the special case where the entire section is “none” and
keep malformed-entry and stray-marker reporting intact. Add regression cases in
tests/test_changelog.py covering prose before and after a valid categorized
entry.

Comment thread tests/test_changelog.py
Comment on lines +55 to +59
def test_contents_are_unchanged(self):
"""The page must match the expected stub exactly."""
assert _CHANGELOG_PATH.exists(), f"{_CHANGELOG_PATH} is missing. {_POLICY}"
contents = _CHANGELOG_PATH.read_text(encoding="utf-8")
assert contents.strip() == _EXPECTED.strip(), _POLICY

Copy link
Copy Markdown
Contributor

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

Compare the stub without trimming.

strip() accepts added leading or trailing whitespace. This conflicts with the exact-content requirement. Compare the raw file contents with _EXPECTED.

Proposed fix
-        assert contents.strip() == _EXPECTED.strip(), _POLICY
+        assert contents == _EXPECTED, _POLICY
📝 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
def test_contents_are_unchanged(self):
"""The page must match the expected stub exactly."""
assert _CHANGELOG_PATH.exists(), f"{_CHANGELOG_PATH} is missing. {_POLICY}"
contents = _CHANGELOG_PATH.read_text(encoding="utf-8")
assert contents.strip() == _EXPECTED.strip(), _POLICY
def test_contents_are_unchanged(self):
"""The page must match the expected stub exactly."""
assert _CHANGELOG_PATH.exists(), f"{_CHANGELOG_PATH} is missing. {_POLICY}"
contents = _CHANGELOG_PATH.read_text(encoding="utf-8")
assert contents == _EXPECTED, _POLICY
🤖 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 `@tests/test_changelog.py` around lines 55 - 59, Update
test_contents_are_unchanged to compare the raw contents read from
_CHANGELOG_PATH directly with _EXPECTED, removing strip() from both sides so
leading and trailing whitespace changes are detected.

The same rules were spelled out in five places: the PR template, agents.md, the
release doc, the skill, and the checker's help text. Contributing guidelines now
hold the one definition, under 'Changelog entries', and everything else points
at it. The release doc keeps only the section order, which is its own concern.

Prose added by this branch drops from 168 lines to 82.
@coderabbitai coderabbitai Bot added CI continuous integration documentation Improvements or additions to documentation labels Aug 12, 2026
The dascore.org link only resolves once a release rebuilds the stable docs, so
until then a contributor on dev following it lands on a page without the
section. Name the file path first and keep the URL beside it.
It loads every session, so its size is a recurring token cost. Same rules,
stated as a checklist rather than prose, with rationale dropped: 534 words to
324. No rule removed.
Same procedure, fewer words: merge the numbered steps' restated context, drop
the per-command prose, and fold the Notes back into the output example.
@d-chambers
d-chambers merged commit 9e1f0b3 into dev Aug 12, 2026
29 checks passed
@d-chambers
d-chambers deleted the no-changelog branch August 12, 2026 09:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CI continuous integration documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant