Skip to content

Sync the release preflight from django-marina - #896

Merged
dyve merged 2 commits into
mainfrom
sync-release-preflight
Oct 11, 2026
Merged

dyve merged 2 commits into
mainfrom
sync-release-preflight

Conversation

@dyve

@dyve dyve commented Oct 11, 2026

Copy link
Copy Markdown
Member

Propagation of zostera/django-marina#694, where the reasoning lives.

just release-check hid most of the commits. It listed only commits touching src/, then closed with "Every commit above must be covered by an entry". That reads as a complete list and is not one, so anything tooling-only was invisible. It now prints a second group for commits touching nothing in src/, under a heading that says to read them rather than a rule, because no rule fits that group: a Dependabot bump of a dev dependency is genuinely nothing to a user, while a lint rule, a CI gate or a contributor policy belongs in the notes under tooling. Across marina, bootstrap4 and bootstrap5, roughly eighteen changes had gone unrecorded this way.

just build passed with a stale lockfile. uv sync --frozen does not check the project's own package version, so a bump could ship with the old version still in uv.lock while twine, check-manifest, pyroma and both smoke tests all reported green. Verified directly in marina: uv sync --frozen installed 26.9 against a lock naming 26.3 and exited 0. build now depends on a check comparing the two, which puts it in front of release-tag as well, and just relock regenerates the lock without upgrading anything (just upgrade bumps every dependency and has no business in a release commit).

MAINTAINING.md release steps 1 and 2 are updated to match. The justfile is byte-identical to django-marina again.

Verified with just lint, just build and just test-cov at 100%. just relock was a no-op here, so this repository's lock was already consistent.

Sequencing with #895

#895, the 26.4 release, is open. PACKAGING.md now says not to branch a propagation off a release branch, which is what produced the phantom 26.4 here in the first place, so this is branched off main instead and carries no release commit.

That leaves the merge order to settle, and either way works as long as it is deliberate:

  • release: 26.4 #895 first. Then this needs a rebase, because ## Unreleased will have become ## 26.4 (date). I will add a fresh ## Unreleased for these two entries rather than let git file them under the released heading, which it would do silently since the two sides touch different lines.
  • This first. Then release: 26.4 #895 should pull these two entries into its 26.4 section before it is cut, otherwise the release ships them unrecorded, which is the exact failure the first half of this change is about.

The entries are appended at the end of Unreleased rather than the top, so they do not collide with anything #895 prepends.

Credit where it is due: the lockfile half of this exists because the django-bootstrap5 session tested my claim that just build would catch a stale lock, instead of believing it. It does not, and did not.

dyve and others added 2 commits October 11, 2026 10:38
Propagation of zostera/django-marina#694, where the reasoning lives.

just release-check listed only commits touching src/, then closed with "Every
commit above must be covered by an entry", which reads as a complete list and
is not one. Anything tooling-only was invisible to it. It now prints a second
group for commits touching nothing in src/, under a heading that says to read
them rather than a rule, because no rule fits: a Dependabot bump of a dev
dependency is nothing to a user, while a lint rule or a contributor policy
belongs in the notes.

just build now fails when uv.lock does not name the version in pyproject.toml,
and just relock regenerates the lock without upgrading anything. uv sync
--frozen does not check the project's own version, so a stale lock previously
passed twine, check-manifest, pyroma and both smoke tests unnoticed. That is
not theoretical: it is how a version bump shipped here with the previous
version still in the lock.

MAINTAINING.md release steps 1 and 2 updated to match. The justfile is
byte-identical to django-marina again.

Verified: just lint, just build and just test-cov at 100%. just relock was a
no-op, so this lock was already current.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Propagation of zostera/django-marina#696.

In the window between merging the release PR and pushing the tag, just
release-check prints "(none)" for the Unreleased entries next to every commit
since the previous tag. Stamping the section removes the heading the recipe
looks for, and the tag it compares against is still the old one. Correct, and
it reads as if the changelog has been lost.

Raised by the django-bootstrap4 session, which hit it while cutting 26.3. It
does not show up in django-marina, where the tag sits on HEAD so both lists
come back empty and the pair looks consistent.

Documentation only.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@dyve
dyve merged commit 209aeb2 into main Oct 11, 2026
21 checks passed
@dyve
dyve deleted the sync-release-preflight branch October 11, 2026 09:42
dyve added a commit that referenced this pull request Oct 11, 2026
Adds three changelog entries that nothing flagged, because until #896 landed
`just release-check` listed only commits touching `src/` and none of these do:
the workflow hardening (#887), the invisible-character lint (#875) and the AI
assistance policy (#874). The coverage entry is amended to mention the CI step
from #888, without which `fail_under = 100` was set but never run. Confirmed
afterwards against the new second group in `just release-check`, which lists
the same commits.

Drops "(release candidate)" from the Python 3.15 entry. 3.15.0 shipped on
2026-10-09. What keeps it out of the classifiers is Django: 6.1.2, 6.0.9 and
5.2.18 all stop at 3.14.

Folds in the three entries #896 appended to `Unreleased`. #896 is in main and
therefore in the tree this tag will point at, so its entries belong in the 26.4
section rather than waiting for 26.5.

The section is ordered by the categories MAINTAINING.md lists, which the
`Unreleased` section was not: dropped cycles, bug fixes with the breaking ones
first, features, tooling, documentation. Flat list, as in 26.3 and earlier.

`uv.lock` names 26.4. The `_lockfile-matches-version` gate that #896 brought in
caught the stale lock on the first `just build`, which is the first time that
check has earned its keep here.

Verified with `just lint`, `just test-cov` at 100% and `just build`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@dyve dyve mentioned this pull request Oct 11, 2026
dyve added a commit that referenced this pull request Oct 11, 2026
Adds three changelog entries that nothing flagged, because until #896 landed
`just release-check` listed only commits touching `src/` and none of these do:
the workflow hardening (#887), the invisible-character lint (#875) and the AI
assistance policy (#874). The coverage entry is amended to mention the CI step
from #888, without which `fail_under = 100` was set but never run. Confirmed
afterwards against the new second group in `just release-check`, which lists
the same commits.

Drops "(release candidate)" from the Python 3.15 entry. 3.15.0 shipped on
2026-10-09. What keeps it out of the classifiers is Django: 6.1.2, 6.0.9 and
5.2.18 all stop at 3.14.

Folds in the three entries #896 appended to `Unreleased`. #896 is in main and
therefore in the tree this tag will point at, so its entries belong in the 26.4
section rather than waiting for 26.5.

The section is ordered by the categories MAINTAINING.md lists, which the
`Unreleased` section was not: dropped cycles, bug fixes with the breaking ones
first, features, tooling, documentation. Flat list, as in 26.3 and earlier.

`uv.lock` names 26.4. The `_lockfile-matches-version` gate that #896 brought in
caught the stale lock on the first `just build`, which is the first time that
check has earned its keep here.

Verified with `just lint`, `just test-cov` at 100% and `just build`.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant