Give each product a changelog, drafted from its merged pull requests #116

Merged
cruelacid merged 1 commit from worktree-changelog into main 2026-09-23 16:57:00 +01:00
Owner

Closes #82. Part of #77.

  • docs/changelog-plugin.md, the published ledger. It is backfilled with one entry for 0.1.0–0.1.5 (all shipped on 18 September, per the mirror's tag dates), using the prose from the site's hand-written changelog (#114), which #85 turns into a renderer of this file.
  • docs/changelog-server.md, which says plainly that it is retrospective. It is kept separate because the mirror refuses any file that names the server.
  • scripts/changelog.mjs draft / cut:
    • It reads merged PRs over REST and gates on merge_commit_sha being in since..HEAD, never by date. #78 proved Forgejo records merge_commit_sha and merge_base under fast-forward-only.
    • It routes by area:* and takes the text from release-notes/<PR>.md, else the ## Changelog block, else the title (flagged). NONE is skipped.
    • It reports unlabelled PRs and orphan commits.
    • It appends without removing reviewer edits.
    • cut drops the PR numbers and runs the mirror's public-text scan.
  • scripts/lib/public-scan.mjs, lifted out of build-mirror.mjs. Behaviour is unchanged: --check passes, and planted plan-phase / private-doc strings are still caught.
  • scripts/lib/ledger.mjs, the only code that understands the format.
  • docs/releasing.md: the false "changelog line" claim is replaced with the real steps.
  • Namespaced anchor tags are already pushed: plugin-v0.1.0…plugin-v0.1.5 sit on the source shas each mirror tag records (0.1.4 → 4eeff48, not the Release commit).

Tests are in scripts/changelog.test.mjs, against a real fixture repo. Six rules were mutation-checked (range gate, orphans, unrouted, PR-number drop, idempotence, title fallback), and each fails the suite when broken. A real draft against live Forgejo ran end to end.

To follow in this PR: WORKFLOW_EPOCH gets set to main's sha at the moment protection is enabled (#79). --assist (LLM-suggested prose) is deferred.

Changelog

NONE

🤖 Generated with Claude Code

https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt

Closes #82. Part of #77. - **`docs/changelog-plugin.md`**, the published ledger. It is backfilled with one entry for 0.1.0–0.1.5 (all shipped on 18 September, per the mirror's tag dates), using the prose from the site's hand-written changelog (#114), which #85 turns into a renderer of this file. - **`docs/changelog-server.md`**, which says plainly that it is retrospective. It is kept separate because the mirror refuses any file that names the server. - **`scripts/changelog.mjs`** `draft` / `cut`: - It reads merged PRs over REST and gates on `merge_commit_sha` being in `since..HEAD`, **never by date**. #78 proved Forgejo records `merge_commit_sha` and `merge_base` under fast-forward-only. - It routes by `area:*` and takes the text from `release-notes/<PR>.md`, else the `## Changelog` block, else the title (flagged). `NONE` is skipped. - It reports unlabelled PRs and orphan commits. - It appends without removing reviewer edits. - `cut` drops the PR numbers and runs the mirror's public-text scan. - **`scripts/lib/public-scan.mjs`**, lifted out of `build-mirror.mjs`. Behaviour is unchanged: `--check` passes, and planted `plan-phase` / private-doc strings are still caught. - **`scripts/lib/ledger.mjs`**, the only code that understands the format. - **`docs/releasing.md`**: the false "changelog line" claim is replaced with the real steps. - **Namespaced anchor tags are already pushed**: `plugin-v0.1.0`…`plugin-v0.1.5` sit on the source shas each mirror tag records (0.1.4 → `4eeff48`, not the Release commit). Tests are in `scripts/changelog.test.mjs`, against a real fixture repo. Six rules were mutation-checked (range gate, orphans, unrouted, PR-number drop, idempotence, title fallback), and each fails the suite when broken. A real `draft` against live Forgejo ran end to end. **To follow in this PR:** `WORKFLOW_EPOCH` gets set to `main`'s sha at the moment protection is enabled (#79). `--assist` (LLM-suggested prose) is deferred. ## Changelog NONE 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
Give each product a changelog, drafted from its merged pull requests
Some checks failed
Release note / release-note (pull_request) Successful in 11s
CI / build (pull_request) Successful in 4m36s
CI / e2e (pull_request) Failing after 3m43s
CI / promote (pull_request) Has been skipped
5111b0e6b2
docs/releasing.md said every plugin release "bumps manifest.json with a
changelog line", and nothing ever did: six versions shipped with no record
of what changed in any of them. That claim is replaced with the release
steps that now exist.

Two ledgers, because one could not be published: the mirror refuses any
file that names the server. docs/changelog-plugin.md is backfilled with one
entry for 0.1.0 to 0.1.5, which all shipped on 18 September, carrying the
prose from the site's hand-written changelog so that page can render this
file instead. docs/changelog-server.md says plainly that it is
retrospective: the service deploys continuously, so its Unreleased means
live but unnamed.

scripts/changelog.mjs draft reads merged pull requests over REST, keeps
those whose merge commit is in since..HEAD — by the commit graph, never by
date — routes them by area:* label, and appends their release notes to
Unreleased without touching what a reviewer already rewrote. It reports
pull requests with no note or no area, and commits no pull request brought.
cut stamps a version, drops the private PR numbers, and refuses text the
mirror would refuse, using the scan lifted out of build-mirror.mjs into
scripts/lib/public-scan.mjs (behaviour unchanged: --check passes, and
planted strings are still caught).

Tested against a real fixture repository; six rules mutation-checked, each
failing the suite when inverted.

Part of #77. Closes #82.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
cruelacid force-pushed worktree-changelog from 5111b0e6b2
Some checks failed
Release note / release-note (pull_request) Successful in 11s
CI / build (pull_request) Successful in 4m36s
CI / e2e (pull_request) Failing after 3m43s
CI / promote (pull_request) Has been skipped
to 77a50790f4
Some checks failed
e2e / multi (push) Failing after 55s
CI / e2e (pull_request) Has been cancelled
CI / promote (pull_request) Has been cancelled
Release note / release-note (pull_request) Has been cancelled
CI / build (pull_request) Has been cancelled
2026-09-23 16:03:26 +01:00
Compare
cruelacid force-pushed worktree-changelog from 77a50790f4
Some checks failed
e2e / multi (push) Failing after 55s
CI / e2e (pull_request) Has been cancelled
CI / promote (pull_request) Has been cancelled
Release note / release-note (pull_request) Has been cancelled
CI / build (pull_request) Has been cancelled
to 7619839fbe
All checks were successful
e2e / multi (push) Successful in 3m59s
Release note / release-note (pull_request) Successful in 12s
CI / build (pull_request) Successful in 4m28s
CI / e2e (pull_request) Successful in 4m41s
CI / promote (pull_request) Has been skipped
2026-09-23 16:05:28 +01:00
Compare
cruelacid force-pushed worktree-changelog from 7619839fbe
All checks were successful
e2e / multi (push) Successful in 3m59s
Release note / release-note (pull_request) Successful in 12s
CI / build (pull_request) Successful in 4m28s
CI / e2e (pull_request) Successful in 4m41s
CI / promote (pull_request) Has been skipped
to 959eabb7ee
Some checks failed
CI / build (pull_request) Has been cancelled
CI / e2e (pull_request) Has been cancelled
CI / promote (pull_request) Has been cancelled
Release note / release-note (pull_request) Has been cancelled
2026-09-23 16:36:36 +01:00
Compare
cruelacid force-pushed worktree-changelog from 959eabb7ee
Some checks failed
CI / build (pull_request) Has been cancelled
CI / e2e (pull_request) Has been cancelled
CI / promote (pull_request) Has been cancelled
Release note / release-note (pull_request) Has been cancelled
to 3a3f385c60
Some checks failed
Release note / release-note (pull_request) Successful in 12s
CI / build (pull_request) Successful in 4m39s
CI / e2e (pull_request) Successful in 5m17s
CI / promote (pull_request) Has been skipped
CI / build (push) Successful in 5m13s
CI / promote (push) Has been cancelled
CI / e2e (push) Has been cancelled
2026-09-23 16:37:07 +01:00
Compare
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Nectenda/nectenda!116
No description provided.