Skip to content

fix(workflow): insert ### Changed in Keep-a-Changelog order on auto-CHANGELOG (#26)#41

Merged
cmeans-claude-dev[bot] merged 2 commits into
mainfrom
fix/changelog-kac-ordering-cascade
Apr 28, 2026
Merged

fix(workflow): insert ### Changed in Keep-a-Changelog order on auto-CHANGELOG (#26)#41
cmeans-claude-dev[bot] merged 2 commits into
mainfrom
fix/changelog-kac-ordering-cascade

Conversation

@cmeans-claude-dev

@cmeans-claude-dev cmeans-claude-dev Bot commented Apr 27, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes #26. Cascades the validated cmeans/mcp-synology PR #63 fix (squash 8a4df0d, merged 2026-04-26 23:24Z) for the auto-CHANGELOG workflow's subsection-ordering bug. The else-branch in _check_staleness's peer subsection-insertion logic was inserting a new ### Changed block above existing ### Added (or any other subsection that sorts after Changed per Keep-a-Changelog v1.1.0), violating the mandated Added → Changed → Deprecated → Removed → Fixed → Security order.

The bug, when it manifests

Pre-existing layout in ## [Unreleased] Old workflow output KaC v1.1.0 says
Empty Changed
Added only Changed → Added Added → Changed
Added + Fixed (would have been wrong) Added → Changed → Fixed
Fixed only (would have been wrong) Changed → Fixed

Dormant on this repo until v0.1.1 ship: post-PR #25 cascade, the workflow ran on PRs #23 and #24 with both ### Added and ### Changed already populated in ## [Unreleased], so the if-branch (insert under existing ### Changed) fired both times. The next time the buggy else-branch WOULD fire is post-v0.1.1: fresh empty Unreleased, a feature PR adds ### Added, the next weekly Dependabot Monday bump fires the workflow's else-branch.

The fix

Walk forward from ## Unreleased to find either (a) the first subsection that sorts AFTER ### Changed per KaC ordering (### Deprecated, ### Removed, ### Fixed, ### Security), or (b) the next ## release heading. Insert the new ### Changed block immediately before whichever comes first.

Adaptation preserved from our heading-tolerant variant: matcher accepts both ## Unreleased (mcp-synology's form) and ## [Unreleased] (this repo's KaC-bracketed form). Only the else-branch changes (~13 lines); the if-branch, loop guard, idempotency guard, App-token mint, and dependabot[bot] filter are byte-for-byte unchanged.

Verification

Reproduced upstream QA's algorithm-extraction smoke test against six KaC layouts on the cascaded fix locally:

```
A. Empty Unreleased → Changed ✓
B. Added only (the bug case) → Added → Changed ✓
C. Changed already exists → Added → Changed ✓
D. Added + Fixed → Added → Changed → Fixed ✓
E. Fixed only → Changed → Fixed ✓
F. Bracketless heading (## Unreleased) → Added → Changed ✓
ALL PASS
```

All six layouts produce correctly-ordered subsections. Workflow YAML parses via yaml.safe_load.

Test plan

  • Algorithm-extraction smoke test on six KaC arrangements — all pass
  • Workflow YAML parses cleanly
  • Diff scope: .github/workflows/dependabot-changelog.yml (+13/-3) and CHANGELOG.md (+4) only — matches PR claim
  • Heading-tolerance adaptation preserved (case F passes with bracketless ## Unreleased)
  • Only the else-branch changes — the if-branch (insert under existing ### Changed) is byte-for-byte unchanged from main, verified by inspecting the diff
  • CI green on all jobs (lint, typecheck, test 3.11/3.12/3.13, deploy-smoke, codecov)
  • Live verification (post-merge, optional): the v1.1 cycle's first feature PR will add ### Added to a fresh ## [Unreleased]; the next Dependabot bump after that triggers the buggy else-branch on the OLD workflow but the fixed path on the new one. If you want belt-and-suspenders, the existing two open Dependabot PRs (none currently — Dependabot is on weekly Monday cycle) could be @dependabot recreate-ed to re-exercise the workflow.

Source

  • Upstream fix: cmeans/mcp-synology PR chore(deps): refresh uv.lock transitive pins (2026-05-07) #63 squash 8a4df0d, merged 2026-04-26 23:24Z, validated by upstream QA via the same six-layout smoke test.
  • Awareness handoff: add_context id dd3123d2 (the cross-repo finding I posted yesterday for upstream Dev to pick up) — informational entry, the upstream Dev acted on it and shipped the fix in PR chore(deps): refresh uv.lock transitive pins (2026-05-07) #63.
  • Verification gate: per the dependabot-pr-hygiene-playbook, fix lands in one repo first + algorithm-extraction smoke test by upstream QA + reproduced locally → cascade approved.

Closes #26

@cmeans-claude-dev cmeans-claude-dev Bot added the Ready for QA Dev work complete — QA can begin review label Apr 27, 2026
@github-actions github-actions Bot added Awaiting CI Dev complete, waiting for CI/Codecov to pass before QA and removed Awaiting CI Dev complete, waiting for CI/Codecov to pass before QA labels Apr 27, 2026
@codecov-commenter

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

…HANGELOG (closes #26)

Cascades the validated cmeans/mcp-synology PR #63 fix (squash
8a4df0d, merged 2026-04-26 23:24Z) to this repo's
.github/workflows/dependabot-changelog.yml.

The bug:

When `## [Unreleased]` already contained a subsection (e.g.,
`### Added`) but no `### Changed` block, the auto-CHANGELOG
workflow's else-branch inserted the new `### Changed` block at
`unreleased_idx + 1` regardless of what subsections already
existed. With `### Added` at unreleased_idx + 2, the new
`### Changed` landed ABOVE the existing `### Added`, violating
Keep-a-Changelog v1.1.0's mandated order:

  Added → Changed → Deprecated → Removed → Fixed → Security

Dormant on this repo until #36 release wave: post-PR #25 cascade
the workflow ran on PRs #23 and #24 with both `### Added` and
`### Changed` already populated in `## [Unreleased]`, so the
if-branch (insert under existing `### Changed`) fired both
times — the buggy else-branch never executed. The next time it
WOULD fire is post-v0.1.1 release: fresh empty Unreleased
section, then a feature PR adds `### Added`, then the next
weekly Dependabot Monday bump triggers the workflow's
else-branch and produces an out-of-order CHANGELOG.

The fix:

Walk forward from `## Unreleased` to find either:
  (a) the first subsection that should sort AFTER
      `### Changed` per KaC ordering (i.e., `### Deprecated`,
      `### Removed`, `### Fixed`, `### Security`), or
  (b) the next `## ` release heading.
Insert the new `### Changed` block immediately before
whichever comes first. Default insertion point is the end of
the Unreleased section (just before the next `## ` heading)
when no later-sorting subsections exist.

Adaptation preserved from our heading-tolerant variant: the
matcher accepts both `## Unreleased` (mcp-synology's form) and
`## [Unreleased]` (this repo's Keep-a-Changelog bracketed form).
Only the else-branch changes; the if-branch (insert under
existing `### Changed`) and the loop guard / idempotency
guard / token mint / Dependabot filter are byte-for-byte
unchanged.

Verification:

Reproduced upstream QA's algorithm-extraction smoke test
against six KaC layouts on the cascaded fix:

  A. Empty Unreleased                  → Changed                   ✓
  B. Added only (the bug case)         → Added → Changed           ✓
  C. Changed already exists            → Added → Changed           ✓
  D. Added + Fixed                     → Added → Changed → Fixed   ✓
  E. Fixed only                        → Changed → Fixed           ✓
  F. Bracketless heading (## Unreleased) → Added → Changed         ✓

All six KaC arrangements produce correctly-ordered subsections.
Workflow YAML parses (PyYAML safe_load).

The verification gate from the dependabot-pr-hygiene-playbook
("validate on real data before cascading") was met on
mcp-synology side via the upstream QA smoke test; live
Dependabot validation via @dependabot recreate is belt-and-
suspenders that can be exercised on this repo's next weekly
Dependabot bump.

Per CLAUDE.md: this is a CI/automation fix (not user-visible
library behavior), so no operator-impact framing in the
CHANGELOG bullet — just the categorization-correctness
description.
@cmeans-claude-dev cmeans-claude-dev Bot force-pushed the fix/changelog-kac-ordering-cascade branch from 2975d46 to 9320d16 Compare April 27, 2026 22:30
@github-actions github-actions Bot added Awaiting CI Dev complete, waiting for CI/Codecov to pass before QA Ready for QA Dev work complete — QA can begin review and removed Ready for QA Dev work complete — QA can begin review Awaiting CI Dev complete, waiting for CI/Codecov to pass before QA labels Apr 27, 2026
@cmeans-claude-dev

Copy link
Copy Markdown
Contributor Author

Rebased on main after v0.1.2 (PR #42) merged. Single conflict in CHANGELOG.md resolved as follows:

The conflict. Both branches inserted text after ## [Unreleased]. PR #41 added a ### Fixed subsection with the #26 cascade bullet (still in flight, lives in [Unreleased]). PR #42 inserted a new ## [0.1.2] - 2026-04-27 released-version section right under [Unreleased].

Resolution. Both stay; no content lost. Final order under [Unreleased] is ### Fixed (the #26 cascade bullet, still in flight), then ## [0.1.2] (released), then ## [0.1.1] (released), then ## [0.1.0]. This matches Keep-a-Changelog ordering (in-flight Unreleased on top, released versions below newest-first).

No substantive change to PR scope. The .github/workflows/dependabot-changelog.yml diff is byte-identical to round 1; CHANGELOG.md diff is byte-identical except the ### Fixed block now sits inside [Unreleased] rather than between [Unreleased] and [0.1.1] (this matches the briefing's documented intent — the bullet was always meant to be Unreleased Fixed).

Verification on rebased branch.

  • git diff --stat origin/main...HEAD — same 2 files / +18/-4 as before
  • uv run pytest — 71/71 passed
  • uv run ruff check src/ tests/ — clean
  • uv run ruff format --check src/ tests/ — clean
  • uv run mypy src/pypi_winnow_downloads/ — clean

New head: 9320d16 (was 2975d46). Force-pushed with --force-with-lease. Ready for QA label preserved.

cmeans
cmeans previously approved these changes Apr 28, 2026

@cmeans cmeans left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

LGTM

@cmeans cmeans added the QA Active QA is actively reviewing; Dev should not push changes label Apr 28, 2026
@github-actions github-actions Bot removed the Ready for QA Dev work complete — QA can begin review label Apr 28, 2026

@cmeans cmeans left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

QA round 1 — FAIL (one observation)

Verified the workflow change end-to-end at head 9320d16. Algorithm is correct; one wording observation in the CHANGELOG bullet.

What I verified

  • Diff scope: .github/workflows/dependabot-changelog.yml (+13/-3) and CHANGELOG.md (+4) only — matches PR claim.

  • If-branch unchanged: git diff f7ff312 9320d16 -- .github/workflows/dependabot-changelog.yml shows exactly one hunk, in the else-branch (lines 169–188 region). The if-branch (changed_idx is not None path), the unreleased_idx matcher (accepts both ## Unreleased and ## [Unreleased]), the loop guard, idempotency check, App-token mint, and dependabot[bot] filter are byte-for-byte unchanged from the parent commit.

  • Workflow YAML parses: yaml.safe_load succeeds; jobs: ['changelog'], trigger pull_request_target on [opened, synchronize, reopened].

  • Algorithm-extraction smoke test, six PR-claimed layouts (extracted into a standalone qa_smoke.py mirroring the inline Python verbatim):

    Layout Result Final order
    A. Empty Unreleased PASS ### Changed
    B. Added only (the bug case) PASS ### Added → ### Changed
    C. Changed already exists (if-branch) PASS ### Added → ### Changed
    D. Added + Fixed PASS ### Added → ### Changed → ### Fixed
    E. Fixed only PASS ### Changed → ### Fixed
    F. Bracketless ## Unreleased PASS ### Added → ### Changed
  • Five extra adversarial layouts (not in the PR table — covering the rest of the KaC subsection vocabulary):

    Layout Result Final order
    G. Added + Removed PASS ### Added → ### Changed → ### Removed
    H. Added + Deprecated PASS ### Added → ### Changed → ### Deprecated
    I. Security only PASS ### Changed → ### Security
    J. Already-have-Changed + Fixed (if-branch path) PASS ### Added → ### Changed → ### Fixed
    K. No Unreleased section at all (orthogonal code path) PASS fresh ## [Unreleased] with ### Changed

    All four after_changed members (### Deprecated, ### Removed, ### Fixed, ### Security) get walked correctly. Blank-line invariants verified for B/D/E (the new ### Changed heading has a blank line before AND after).

  • Repo's own pytest suite at PR head: uv run pytest --cov → 71/71 passed, 100.00% coverage, gate satisfied. ruff check / ruff format --check / mypy clean.

  • CI all green at 9320d16: lint, typecheck, test 3.11 / 3.12 / 3.13, deploy-smoke. (Test-plan CI checkbox in the PR body is now ticked.)

  • Issue #26 scope: the issue's suggested algorithm — "search forward from unreleased_idx + 1 until either (a) a subsection that should sort after ### Changed per KaC, or (b) the next ## heading" — matches the implementation line-for-line. No scope drift.

Findings

  1. (observation, CHANGELOG wording) The new ## [Unreleased] ### Fixed bullet says "Dormant on this repo until #36 release". PR #36 is the stale_threshold_days warning fix that landed during v0.1.1's pre-release cycle, not a release in itself — and PR #38 was actually the last feature-class merge before the v0.1.1 release PR #39. The PR body's narrative gets this right ("Dormant on this repo until v0.1.1 ship"), but the CHANGELOG bullet conflates a PR number with a release version. Future readers of the CHANGELOG will not be able to map #36 release to a release tag without spelunking. Suggest replacing #36 release with v0.1.1 release (or the v0.1.1 release tag) so the dormancy timeline reads cleanly against the project's release history.

Recommendation

Edit the CHANGELOG bullet only — one phrase. Re-apply Ready for QA; I'll re-verify in round 2 (CHANGELOG-only diff, fast turnaround).

Switching label: QA ActiveQA Failed.

@cmeans

cmeans commented Apr 28, 2026

Copy link
Copy Markdown
Owner

Switching label: QA ActiveQA Failed. Round 1 — fix is algorithmically correct (11/11 layouts pass, including 5 beyond the PR's six), but one CHANGELOG-wording observation: the bullet says "Dormant on this repo until #36 release"#36 is a PR number, not a release version. Suggest v0.1.1 release to match the PR body's own narrative.

@cmeans cmeans added QA Failed QA found issues — needs dev attention and removed QA Active QA is actively reviewing; Dev should not push changes labels Apr 28, 2026
…release"

QA round 1 finding: the CHANGELOG bullet conflated PR #36 (the
stale_threshold_days warning fix that landed during the v0.1.1
pre-release cycle) with a release version. PR #36 is not a release —
v0.1.1 is. Future readers couldn't map "#36 release" to a release tag
without spelunking. PR body's narrative already says "v0.1.1 ship"
correctly; only the CHANGELOG bullet was off.

CHANGELOG-only edit. No workflow change, no test change. Verified at
HEAD: pytest 71/71, ruff clean, mypy clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added Awaiting CI Dev complete, waiting for CI/Codecov to pass before QA and removed QA Failed QA found issues — needs dev attention labels Apr 28, 2026
@cmeans-claude-dev cmeans-claude-dev Bot added the Ready for QA Dev work complete — QA can begin review label Apr 28, 2026
@cmeans-claude-dev

Copy link
Copy Markdown
Contributor Author

QA round 2 — single CHANGELOG wording fix

Addressed the round-1 finding. Replaced #36 release with the v0.1.1 release in the ## [Unreleased] ### Fixed bullet so the dormancy timeline maps cleanly to a release tag instead of a PR number.

Diff:

- Dormant on this repo until #36 release, would have manifested ...
+ Dormant on this repo until the v0.1.1 release, would have manifested ...

Scope: CHANGELOG-only, single phrase, one line changed (+1/-1). No workflow change, no test change. Workflow algorithm at head 837f575 is byte-identical to round-1 head 9320d16git diff 9320d16 837f575 -- .github/workflows/dependabot-changelog.yml empty.

Verification:

  • uv run pytest — 71/71 passed
  • uv run ruff check src/ tests/ — clean
  • uv run ruff format --check src/ tests/ — clean
  • uv run mypy src/pypi_winnow_downloads/ — clean
  • git diff 9320d16 837f575 — single-line CHANGELOG hunk, no other files touched

New head: 837f575 (was 9320d16). Standard additional commit on the branch — no force-push, no rebase. Re-applied Ready for QA.

@github-actions github-actions Bot removed the Awaiting CI Dev complete, waiting for CI/Codecov to pass before QA label Apr 28, 2026

@cmeans cmeans left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

LGTM

@cmeans cmeans added QA Active QA is actively reviewing; Dev should not push changes and removed Ready for QA Dev work complete — QA can begin review labels Apr 28, 2026

@cmeans cmeans left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

QA round 2 — PASS

Round-1 observation resolved in commit 837f575 (CHANGELOG-only diff):

  • "Dormant on this repo until #36 release""Dormant on this repo until the v0.1.1 release" — exactly the suggested phrasing, dormancy timeline now reads cleanly against the project's release history.

Re-verification

  • Workflow YAML byte-identical to round-1 head: diff <(git show 9320d16:.github/workflows/dependabot-changelog.yml) <(git show 837f575:.github/workflows/dependabot-changelog.yml) is empty. Round 1's algorithm verification (11/11 layouts: A–F from the PR table + G/H/I/J/K adversarial extras) carries forward unchanged.
  • Diff scope round 1 → round 2: CHANGELOG.md (+1/-1) only — single line edit, no other surface touched.
  • CI all green at 837f575: lint, typecheck, test 3.11 / 3.12 / 3.13, deploy-smoke.

Verdict

Zero findings. Awaiting maintainer QA Approved.

@cmeans

cmeans commented Apr 28, 2026

Copy link
Copy Markdown
Owner

Switching label: QA ActiveReady for QA Signoff. Round 2 PASS — CHANGELOG wording resolved (one-line edit), workflow YAML byte-identical to round 1, CI fully green at 837f575. Awaiting maintainer QA Approved.

@cmeans cmeans added Ready for QA Signoff QA passed — ready for maintainer final review and merge QA Approved Manual QA testing completed and passed and removed QA Active QA is actively reviewing; Dev should not push changes Ready for QA Signoff QA passed — ready for maintainer final review and merge labels Apr 28, 2026
@cmeans-claude-dev cmeans-claude-dev Bot merged commit 4bb8584 into main Apr 28, 2026
40 checks passed
@cmeans-claude-dev cmeans-claude-dev Bot deleted the fix/changelog-kac-ordering-cascade branch April 28, 2026 13:53
cmeans-claude-dev Bot added a commit that referenced this pull request Apr 29, 2026
… hygiene (#48)

Bumps version 0.1.2 → 0.1.3 and promotes the [Unreleased] section to
[0.1.3] - 2026-04-28. Five PRs land in this release; full bullets in
CHANGELOG.md.

### Added
- ci(publish): auto-create GitHub release page on v* tag from CHANGELOG
  (#47, eae5e80) — first release that exercises this end-to-end.

### Fixed
- chore(docker): bump uv pin from `==0.4.*` to `>=0.5,<1` (#44, 2679f07,
  closes #34)
- docs(issue-template): refactor bug_report version placeholder to
  durable form (#45, 75a6384, closes #40)
- docs(readme): refresh dogfood blockquote — count > 0, drop M3
  reference (#46, eacbf60, closes #43)
- fix(workflow): insert ### Changed in Keep-a-Changelog order on
  auto-CHANGELOG (#41, 4bb8584, closes #26)

uv.lock refreshed to pick up the version bump (single source of truth
in pyproject.toml; uv lock writes 0.1.3 into uv.lock automatically).

Co-authored-by: cmeans-claude-dev[bot] <272174644+cmeans-claude-dev[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
cmeans-claude-dev Bot added a commit that referenced this pull request Apr 29, 2026
…le block each

Round 1 QA flagged that the v0.2.0 section had `### Changed` (Alpha→Beta) →
`### Added` (PR #49) → `### Changed` (PR #50) — both wrong order (KaC v1.1.0
specifies Added → Changed → Deprecated → Removed → Fixed → Security) and
duplicate `### Changed` blocks (standard KaC has one block per category per
release). PR #41 specifically enforces this ordering on auto-CHANGELOG runs;
hand-authored release commit shouldn't regress it.

Reorders the v0.2.0 section so `### Added` comes first, then a single
`### Changed` block containing both the README modernization bullet
(PR #50) and the Alpha → Beta promotion bullet, in that order. The
auto-release-page workflow added in PR #47 will now render the v0.2.0
GitHub Release page with the standard KaC shape.

No content change — just structural fix. Same words, regrouped.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
cmeans-claude-dev Bot added a commit that referenced this pull request Apr 29, 2026
…51)

* release: v0.2.0 — installer-mix v2 + uv-first README modernization

Bumps version 0.1.3 → 0.2.0 and promotes the [Unreleased] section to
[0.2.0] - 2026-04-29. Two PRs land in this release; full bullets in
CHANGELOG.md.

Minor bump (rather than patch) is justified because run_pypinfo's
return type changed from `int` to `dict[str, int]` in PR #49 — not a
public API but a public-ish internal contract that tests and future
callers depend on. The feature surface is also new (7 new badge files
per package per window), making 0.2.0 the right semantic line.

### Added
- feat(collector): add per-installer badge files (installer-mix v2)
  (#49, 2898ee9). Six individual installer badges + pip-family aggregate
  per package; v1 hero unchanged. Already verified end-to-end on the
  live CT 112 deploy.

### Changed
- docs: uv-first install everywhere + by-installer dogfood layout +
  breakdown narrative (#50, 830c051). Hero in top metadata row;
  by-installer breakdown below blockquote; uv tool install leads in
  README and deploy/README.md; SECURITY.md mentions both uv and pip.

uv.lock refreshed to pick up the version bump (single source of truth
in pyproject.toml; uv lock writes 0.2.0 into uv.lock automatically).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* release: promote Alpha → Beta on v0.2.0

Trigger: four v0.1.x releases shipped, real production deploy running
since 2026-04-25 producing daily badges for four packages, 100% test
coverage on src/, additive-only schema evolution (v2 added new badge
files alongside the unchanged v1 hero rather than mutating anything).
Folding into the v0.2.0 release PR so the bump lands with the minor
version cut.

- pyproject.toml: `Development Status :: 3 - Alpha` →
  `Development Status :: 4 - Beta`. PyPI's classifier display picks
  this up on next ship.
- README.md ## Status section rewritten: leads with "Beta as of
  v0.2.0", names the live-since date, mentions the 100% coverage,
  and adds the explicit guarantee that the v1 hero badge JSON shape
  and filename are stable through 1.0 (so README readers and
  downstream maintainers know what's frozen).
- CHANGELOG.md gets a new ### Changed bullet under [0.2.0] with the
  rationale + scope.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(changelog): fix v0.2.0 KaC ordering — Added before Changed, single block each

Round 1 QA flagged that the v0.2.0 section had `### Changed` (Alpha→Beta) →
`### Added` (PR #49) → `### Changed` (PR #50) — both wrong order (KaC v1.1.0
specifies Added → Changed → Deprecated → Removed → Fixed → Security) and
duplicate `### Changed` blocks (standard KaC has one block per category per
release). PR #41 specifically enforces this ordering on auto-CHANGELOG runs;
hand-authored release commit shouldn't regress it.

Reorders the v0.2.0 section so `### Added` comes first, then a single
`### Changed` block containing both the README modernization bullet
(PR #50) and the Alpha → Beta promotion bullet, in that order. The
auto-release-page workflow added in PR #47 will now render the v0.2.0
GitHub Release page with the standard KaC shape.

No content change — just structural fix. Same words, regrouped.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: cmeans-claude-dev[bot] <272174644+cmeans-claude-dev[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

QA Approved Manual QA testing completed and passed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dependabot-changelog workflow: '### Changed' insertion can land before '### Added' when the latter is the only existing subsection

2 participants