Skip to content

ci(mergify): require the Python 3.13 and 3.14 checks - #311

Merged
mergify[bot] merged 2 commits into
mainfrom
devs/sileht/py313-py314-matrix/require-python-3-13-3-14-checks--7054c8de
Sep 3, 2026
Merged

ci(mergify): require the Python 3.13 and 3.14 checks#311
mergify[bot] merged 2 commits into
mainfrom
devs/sileht/py313-py314-matrix/require-python-3-13-3-14-checks--7054c8de

Conversation

@sileht

@sileht sileht commented Sep 1, 2026

Copy link
Copy Markdown
Member

The two matrix legs added in the previous commit are advisory on their
own. .mergify.yml's &CheckRuns anchor is this repository's only merge
gate: branches/main/protection returns no required_status_checks, and
none of the eleven active rulesets carries one. So a red 3.13 or 3.14 leg
would land silently.

The ordering mirrors #299 -> #300 but not the reasoning, which is worth
stating rather than assuming symmetric. Removing a check needed its own
pull request first because Mergify reads its configuration from the
default branch: a pull request deleting the job would still have been
gated on a check that no longer reported, and could never merge. Adding
one has no such deadlock. Both pull requests here are evaluated against
main's configuration, which does not name the new checks, so a single
atomic commit would have merged just as well.

What the split actually buys is revertability. If a new leg turns out to
be red on main, reverting this commit alone unblocks the repository while
keeping the coverage the previous commit added; an atomic change would
have to give up both.

Two consequences worth knowing, neither of which ordering can avoid.

Because main's configuration does not require the new checks until this
lands, nothing forces either pull request of this stack to be green on
3.13 or 3.14. Both run the full five-leg matrix on their own head, so the
legs are observable, but they have to be looked at before this one is
merged rather than assumed.

Every pull request already open when this lands keeps the check-run set
from its last CI run, and no pull_request event fires when the base
moves. check-success=Test with Python 3.13 can therefore never go true
on it, and auto_merge_conditions: true folds the success conditions
into the queue conditions, so it cannot enter the queue to be rebased out
either. Each one needs a push, a rebase or a close/reopen to pick up the
new legs.

Longer term, this list is a hand-maintained mirror of the job names and
will want the same ceremony at 3.15. The monorepo and mergify-cli both
replaced it with one aggregate job (all-greens / ci-gate) behind a
single check-success, which is worth adopting here on its own. Note
that check-success~=^Test with Python is not a shortcut for it:
check-success is a list attribute and ~= matches any element, so one
green leg would satisfy it while another fails.

Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01MKmEnjRuAM4NcTYxRXG3BA

Depends-On: #310

sileht and others added 2 commits September 1, 2026 14:19
The classifiers stopped at 3.12 and so did the matrix, while both
internal consumers are already past it: the monorepo `engine` and
`shadow-office` each declare `requires-python = "~=3.14.0"` and pin
`sql-compare==0.2.0`. The library is consumed on 3.14 and tested on
neither 3.13 nor 3.14.

`requires-python = ">=3.10"` is an installability floor, not a support
claim, and it stays unbounded on purpose: a ceiling there breaks `pip
install` on every Python released after it. The classifiers are the
support claim, so they are what this corrects. They only reach users on
the next release; PyPI's current 0.2.0 still advertises `>=3.9` and
stops at 3.12.

Nothing else has to move. `python = "^3.10"` already spans both, so
`poetry.lock`'s `python-versions` and `content-hash` are unchanged
(`poetry check --lock` exits 0; classifiers are not hashed), and every
locked dependency ships cp313 and cp314 wheels, so no leg builds from
source.

Free-threaded 3.14t is left out because nothing here exercises it, not
because it would need different artifacts: `sql_compare` is one
pure-Python module, so `poetry build` emits a single `py3-none-any`
wheel that 3.14t installs unchanged. Adding that leg is its own
decision.

Verified on 3.13.10 and 3.14.6 in clean environments built from
`poetry.lock`: ruff, ruff format, deptry and mypy --strict clean, 64
tests passing on both. The 3.14 leg prints two `SyntaxWarning: 'return'
in a 'finally' block` from pluggy 1.5.0 whenever the bytecode cache is
cold, which on CI is always. They are emitted while pluggy itself is
compiled, before pytest installs `filterwarnings = ["error"]`, so they
are noise on an exit-0 run. Bumping pluggy to 1.6.0 would silence them
and belongs in its own change against the lock.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MKmEnjRuAM4NcTYxRXG3BA
Change-Id: I08ce7a6db8d33895e7135f648c2afa9723ed0852
The two matrix legs added in the previous commit are advisory on their
own. `.mergify.yml`'s `&CheckRuns` anchor is this repository's only merge
gate: `branches/main/protection` returns no `required_status_checks`, and
none of the eleven active rulesets carries one. So a red 3.13 or 3.14 leg
would land silently.

The ordering mirrors #299 -> #300 but not the reasoning, which is worth
stating rather than assuming symmetric. Removing a check needed its own
pull request first because Mergify reads its configuration from the
default branch: a pull request deleting the job would still have been
gated on a check that no longer reported, and could never merge. Adding
one has no such deadlock. Both pull requests here are evaluated against
main's configuration, which does not name the new checks, so a single
atomic commit would have merged just as well.

What the split actually buys is revertability. If a new leg turns out to
be red on main, reverting this commit alone unblocks the repository while
keeping the coverage the previous commit added; an atomic change would
have to give up both.

Two consequences worth knowing, neither of which ordering can avoid.

Because main's configuration does not require the new checks until this
lands, nothing forces either pull request of this stack to be green on
3.13 or 3.14. Both run the full five-leg matrix on their own head, so the
legs are observable, but they have to be looked at before this one is
merged rather than assumed.

Every pull request already open when this lands keeps the check-run set
from its last CI run, and no `pull_request` event fires when the base
moves. `check-success=Test with Python 3.13` can therefore never go true
on it, and `auto_merge_conditions: true` folds the success conditions
into the queue conditions, so it cannot enter the queue to be rebased out
either. Each one needs a push, a rebase or a close/reopen to pick up the
new legs.

Longer term, this list is a hand-maintained mirror of the job names and
will want the same ceremony at 3.15. The monorepo and mergify-cli both
replaced it with one aggregate job (`all-greens` / `ci-gate`) behind a
single `check-success`, which is worth adopting here on its own. Note
that `check-success~=^Test with Python ` is not a shortcut for it:
check-success is a list attribute and `~=` matches any element, so one
green leg would satisfy it while another fails.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MKmEnjRuAM4NcTYxRXG3BA
Change-Id: I7054c8de8899a66bb549fbd9b29452d406e052ee
@sileht

sileht commented Sep 1, 2026

Copy link
Copy Markdown
Member Author

This pull request is part of a Mergify stack:

# Pull Request Link
1 ci: test against Python 3.13 and 3.14 #310
2 ci(mergify): require the Python 3.13 and 3.14 checks #311 👈

@mergify
mergify Bot deployed to Mergify Merge Protections September 1, 2026 12:20 Active
@mergify

mergify Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Merge Protections

🟢 All 7 merge protections satisfied — ready to merge.

Show 7 satisfied protections

🟢 ⛓️ Depends-On Requirements

Requirement based on the presence of Depends-On in the body of the pull request

🟢 🤖 Continuous Integration

  • all of:
    • check-success=Test with Python 3.10
    • check-success=Test with Python 3.11
    • check-success=Test with Python 3.12
    • check-success=Test with Python 3.13
    • check-success=Test with Python 3.14
    • check-success=semgrep

🟢 👀 Review Requirements

  • any of:
    • #approved-reviews-by>=1
    • author = dependabot[bot]

🟢 Enforce conventional commit

Make sure that we follow https://www.conventionalcommits.org/en/v1.0.0/

  • title ~= ^(fix|feat|internal|docs|style|refactor|perf|test|build|ci|chore|revert|ui)(?:\(.+\))?!?:

🟢 🔎 Reviews

  • #changes-requested-reviews-by = 0
  • #review-requested = 0
  • #review-threads-unresolved = 0

🟢 📕 PR description

  • body ~= (?ms:.{48,})

🟢 🚦 Auto-queue

When all merge protections are satisfied, this pull request will be queued automatically.

@mergify
mergify Bot requested a review from a team September 1, 2026 12:20
@sileht
sileht marked this pull request as ready for review September 2, 2026 07:56
Base automatically changed from devs/sileht/py313-py314-matrix/test-against-python-3-13-3-14--08ce7a6d to main September 3, 2026 07:56
@mergify mergify Bot added the queued label Sep 3, 2026
@mergify

mergify Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

This pull request spent 2 minutes 59 seconds in the queue, including 1 minute 46 seconds running CI.

Required conditions to merge

@mergify mergify Bot mentioned this pull request Sep 3, 2026
44 tasks
@mergify
mergify Bot merged commit c87c1f6 into main Sep 3, 2026
8 checks passed
@mergify
mergify Bot deleted the devs/sileht/py313-py314-matrix/require-python-3-13-3-14-checks--7054c8de branch September 3, 2026 08:01
@mergify mergify Bot removed the queued label Sep 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

2 participants