Make the pull request the unit of change, and refuse one with no release note #113

Merged
cruelacid merged 3 commits from worktree-release-note into main 2026-09-23 15:23:32 +01:00
Owner

Closes #81. Part of #77.

  • CLAUDE.md, "Working a plan": one plan → one worktree → one branch → one PR → fast-forward onto main. It covers what the body carries, the REST calls to open and merge (tea has no fast-forward-only style), and that the PR run and then the main run must both be watched.
  • .forgejo/pull_request_template.md, with an empty ## Changelog block. An untouched template fails the check.
  • scripts/lib/release-note.mjs (the parser) and scripts/release-note-check.mjs (the CLI). The block may be one sentence, bullets, or NONE. release-notes/<PR>.md wins when present.
  • .forgejo/workflows/release-note.yml, a separate workflow on opened, edited, synchronize, reopened, so editing the body re-checks without re-running e2e.
  • Tests run under pnpm lint (node --test 'scripts/*.test.mjs'). They are mutation-checked both ways: accepting an empty block fails 1 test, and refusing NONE fails 2.

The check becomes required in #79, together with build and e2e.

Changelog

NONE

🤖 Generated with Claude Code

https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt

Closes #81. Part of #77. - **CLAUDE.md**, "Working a plan": one plan → one worktree → one branch → one PR → fast-forward onto `main`. It covers what the body carries, the REST calls to open and merge (`tea` has no fast-forward-only style), and that the PR run and then the `main` run must both be watched. - **`.forgejo/pull_request_template.md`**, with an empty `## Changelog` block. An untouched template fails the check. - **`scripts/lib/release-note.mjs`** (the parser) and **`scripts/release-note-check.mjs`** (the CLI). The block may be one sentence, bullets, or `NONE`. `release-notes/<PR>.md` wins when present. - **`.forgejo/workflows/release-note.yml`**, a separate workflow on `opened, edited, synchronize, reopened`, so editing the body re-checks without re-running e2e. - **Tests** run under `pnpm lint` (`node --test 'scripts/*.test.mjs'`). They are mutation-checked both ways: accepting an empty block fails 1 test, and refusing `NONE` fails 2. The check becomes *required* in #79, together with `build` and `e2e`. ## Changelog NONE 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
Make the pull request the unit of change, and refuse one with no release note
Some checks failed
CI / build (push) Has been cancelled
CI / e2e (push) Has been cancelled
CI / promote (push) 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
CI / build (pull_request) Has been cancelled
be7848e8c3
CLAUDE.md's "Working a plan" gains the step it was missing: one plan, one
worktree, one branch, one pull request, fast-forward onto main. It says what
the body must carry, how to open and merge one when tea cannot merge
fast-forward-only, and that the pull request's run is now where the gate is
watched, before the main run that promotes.

The release note is a "## Changelog" block in the body — one user-facing
sentence, or NONE — or release-notes/<PR>.md for several. A separate
workflow checks it on opened, edited, synchronize and reopened, so fixing a
missing note re-runs a node process rather than the whole suite. The
template ships the block empty, and an untouched template fails: a check
that passed on its own template would let the changelog omit a change
silently, which is the one thing it is for.

The parser's tests run under pnpm lint alongside the eslint rule's, since
scripts are not a workspace package and pnpm -r test never reaches them.
Both directions were mutation-checked: accepting an empty block, and
refusing NONE, each fail the suite.

Part of #77. Closes #81.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
End a release note at any heading or rule, so Renovate's body cannot join it
All checks were successful
CI / build (push) Successful in 4m40s
CI / e2e (push) Has been skipped
CI / promote (push) Has been skipped
Release note / release-note (pull_request) Successful in 12s
CI / build (pull_request) Successful in 4m39s
CI / e2e (pull_request) Has been skipped
CI / promote (pull_request) Has been skipped
4994d772b3
Renovate appends its own sections after the notes it is given: a rule, then
"### Release Notes" with the upstream changelog. A block that ran until the
next level-two heading read those as entries, and refused NONE for having
company. Mutation-checked: restoring the old stop rule fails two tests.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
cruelacid force-pushed worktree-release-note from 4994d772b3
All checks were successful
CI / build (push) Successful in 4m40s
CI / e2e (push) Has been skipped
CI / promote (push) Has been skipped
Release note / release-note (pull_request) Successful in 12s
CI / build (pull_request) Successful in 4m39s
CI / e2e (pull_request) Has been skipped
CI / promote (pull_request) Has been skipped
to 925b45afc2
Some checks failed
Release note / release-note (pull_request) Successful in 13s
CI / build (pull_request) Successful in 4m26s
CI / e2e (pull_request) Failing after 8m31s
CI / promote (pull_request) Has been skipped
2026-09-23 14:52:46 +01:00
Compare
Record the e2e hang that failed pull request #113
Some checks failed
Release note / release-note (pull_request) Successful in 11s
CI / build (pull_request) Successful in 4m6s
CI / e2e (pull_request) Successful in 4m37s
CI / promote (pull_request) Has been skipped
CI / build (push) Successful in 4m56s
CI / e2e (push) Failing after 3m29s
CI / promote (push) Has been skipped
31872acf50
repro-runaway.test.ts timed out at 300 s with the session already gone,
the same signature as run 468 in another file, on a pull request that
touched nothing under packages/. Written down, as the README asks, rather
than re-run past.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01StURdiv33xnMfE2XRyg8Lt
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!113
No description provided.