From 3e7a75be07f7876071a9d7f96d69e9b8c7f37de0 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Tue, 15 Sep 2026 19:44:46 -0400 Subject: [PATCH 1/4] chore(ci): stop dropping maintenance work from the release notes Declaring `changelog-sections` replaces the defaults, so only `feat`, `fix` and `chore` were recognised, and `chore` was hidden on top of that. A release could therefore drop the Elixir support floor and bump a transitive dependency while its notes said nothing at all. Signed-off-by: Yordis Prieto --- .github/release-please-config.json | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/.github/release-please-config.json b/.github/release-please-config.json index bc147d94..69f9c192 100644 --- a/.github/release-please-config.json +++ b/.github/release-please-config.json @@ -12,10 +12,30 @@ "section": "Bug Fixes", "hidden": false }, + { + "type": "perf", + "section": "Performance", + "hidden": false + }, + { + "type": "refactor", + "section": "Refactors", + "hidden": false + }, + { + "type": "test", + "section": "Tests", + "hidden": false + }, + { + "type": "docs", + "section": "Documentation", + "hidden": false + }, { "type": "chore", "section": "Miscellaneous", - "hidden": true + "hidden": false } ], "plugins": [ From 8aa8f09c414b85d7fc6b6e63a2534e4c51ceb851 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Tue, 15 Sep 2026 19:52:13 -0400 Subject: [PATCH 2/4] chore(ci): restrict commit types to chore, feat and fix Every other type silently vanished from the release notes, because declaring `changelog-sections` replaces release-please's defaults. Rather than keep adding sections for types nobody agreed to, only three are allowed, and the gate sits on the pull request title since that is what squash merging turns into the commit subject. Signed-off-by: Yordis Prieto --- .github/release-please-config.json | 20 -------------------- .github/workflows/pr-title.yml | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/pr-title.yml diff --git a/.github/release-please-config.json b/.github/release-please-config.json index 69f9c192..1a4699bc 100644 --- a/.github/release-please-config.json +++ b/.github/release-please-config.json @@ -12,26 +12,6 @@ "section": "Bug Fixes", "hidden": false }, - { - "type": "perf", - "section": "Performance", - "hidden": false - }, - { - "type": "refactor", - "section": "Refactors", - "hidden": false - }, - { - "type": "test", - "section": "Tests", - "hidden": false - }, - { - "type": "docs", - "section": "Documentation", - "hidden": false - }, { "type": "chore", "section": "Miscellaneous", diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml new file mode 100644 index 00000000..628bd01e --- /dev/null +++ b/.github/workflows/pr-title.yml @@ -0,0 +1,25 @@ +name: PR title + +on: + pull_request: + types: + - opened + - edited + - reopened + +permissions: + contents: read + +jobs: + conventional: + name: Conventional commit type + runs-on: ubuntu-latest + steps: + - name: Check the title + env: + TITLE: ${{ github.event.pull_request.title }} + run: | + if ! printf '%s' "$TITLE" | grep -qE '^(chore|feat|fix)(\([a-z0-9._-]+\))?!?: .+'; then + echo "::error::\"$TITLE\" must start with chore:, feat: or fix:, optionally scoped. Squash merging takes the pull request title as the commit subject, and release-please only recognises those three types." + exit 1 + fi From bd5c9db72e27f6e64fac035eb676bb5888c84415 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Tue, 15 Sep 2026 21:14:41 -0400 Subject: [PATCH 3/4] chore(ci): keep the title gate present on every commit Required checks are evaluated against the head commit, so without `synchronize` a push leaves the job absent from that commit and the gate waits forever on a title nobody needs to edit. Signed-off-by: Yordis Prieto --- .github/workflows/pr-title.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 628bd01e..6b017b97 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -6,6 +6,7 @@ on: - opened - edited - reopened + - synchronize permissions: contents: read From 22ad10e597976cc7d04bc8d29fa752f8ef165f32 Mon Sep 17 00:00:00 2001 From: Yordis Prieto Date: Tue, 15 Sep 2026 21:22:42 -0400 Subject: [PATCH 4/4] chore(ci): catch off-type subjects that land on main The pull request title is only the prefill for a squash subject, so the merger can still edit it after the title check has passed. Signed-off-by: Yordis Prieto --- .github/conventional-subject.sh | 15 ++++++++++++++ .github/workflows/main-subjects.yml | 31 +++++++++++++++++++++++++++++ .github/workflows/pr-title.yml | 8 +++----- 3 files changed, 49 insertions(+), 5 deletions(-) create mode 100755 .github/conventional-subject.sh create mode 100644 .github/workflows/main-subjects.yml diff --git a/.github/conventional-subject.sh b/.github/conventional-subject.sh new file mode 100755 index 00000000..4474538f --- /dev/null +++ b/.github/conventional-subject.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +set -euo pipefail + +status=0 + +while IFS= read -r subject; do + [ -n "$subject" ] || continue + + if ! printf '%s' "$subject" | grep -qE '^(chore|feat|fix)(\([a-z0-9._-]+\))?!?: .+'; then + echo "::error::\"$subject\" must start with chore:, feat: or fix:, optionally scoped. Squash merging takes the pull request title as the commit subject, and release-please only recognises those three types." + status=1 + fi +done + +exit $status diff --git a/.github/workflows/main-subjects.yml b/.github/workflows/main-subjects.yml new file mode 100644 index 00000000..6fa50870 --- /dev/null +++ b/.github/workflows/main-subjects.yml @@ -0,0 +1,31 @@ +name: Main subjects + +on: + push: + branches: + - main + +permissions: + contents: read + +jobs: + conventional: + name: Landed commit types + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@a37ce9120846195fa4ece8f58b268e6043cb2f26 # v3.7.0 + with: + fetch-depth: 0 + + - name: Check the landed subjects + env: + BEFORE: ${{ github.event.before }} + AFTER: ${{ github.sha }} + run: | + if git cat-file -e "$BEFORE^{commit}" 2>/dev/null; then + revisions=("$BEFORE..$AFTER") + else + revisions=(--max-count=1 "$AFTER") + fi + + git log --no-merges --format=%s "${revisions[@]}" | .github/conventional-subject.sh diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml index 6b017b97..5f4434f5 100644 --- a/.github/workflows/pr-title.yml +++ b/.github/workflows/pr-title.yml @@ -16,11 +16,9 @@ jobs: name: Conventional commit type runs-on: ubuntu-latest steps: + - uses: actions/checkout@a37ce9120846195fa4ece8f58b268e6043cb2f26 # v3.7.0 + - name: Check the title env: TITLE: ${{ github.event.pull_request.title }} - run: | - if ! printf '%s' "$TITLE" | grep -qE '^(chore|feat|fix)(\([a-z0-9._-]+\))?!?: .+'; then - echo "::error::\"$TITLE\" must start with chore:, feat: or fix:, optionally scoped. Squash merging takes the pull request title as the commit subject, and release-please only recognises those three types." - exit 1 - fi + run: printf '%s\n' "$TITLE" | .github/conventional-subject.sh