feat: Python 3.14 and Node 24 and 26, tested and claimed - #92
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Python 3.14 and Node 24 and 26 are now tested in CI and claimed in the metadata. Before the first
release through the pipeline, the declared ranges shut out the current runtimes:
requires-python = ">=3.11,<3.14". On Python 3.14, stable since October 2025,pip installrefuses the package.
engines: {"node": ">=18 <23"}. That excludes Node 24 (the active LTS line) and Node 26, while itincludes 18 and 20, which are past end of life. npm only warns, but an official package should not
warn on the LTS line.
The ceilings stay closed, and deliberately so (
docs/platforms.md). This library's job is abyte-identical canonical encoding, so an untested runtime is an untested encoder. The ceilings move
here because the matrix does, in the same commit, and
test_platforms.pyholds all three documentsto each other.
What changed
Python. The CI matrix is 3.11 to 3.14,
requires-pythonis>=3.11,<3.15, and the classifiersinclude 3.14.
Node. The CI matrix is 18, 20, 22, 24 and 26, and
enginesis>=18 <27, inpackage.jsonandin the lockfile's root. Node 18 and 20 stay. Dropping them would narrow a published claim for no
technical gain, and the Vitest 3.2.7 constraint in
docs/test-toolchain.mdis about keeping Node 18.Required checks.
.github/rulesets/main.jsonrequires the three new contexts:python (3.14),typescript (24)andtypescript (26). That makes fourteen, andcheck_contexts.pyagrees. Thelive ruleset is re-applied from this file after the merge, per
.github/rulesets/README.md, and readback.
Documents. Seven documents give a version range or a check count. Three of them hold that fact
under a test that derives it:
docs/platforms.mdanddocs/implementations.mdstate the ranges;docs/github-security.mdsays fourteen, and gives the matrix list and the cell count.The other four give a range or a count that nothing checks:
docs/weather-starter.md,docs/test-toolchain.mdandtypescript/README.mdstate the ranges;docs/publishing.mdstates the check count.docs/publishing.mdand the release workflow's error message no longer state a number of requiredchecks: nothing derives it there, so it would have gone stale again.
Tests
conformance vectors ran among them, so the canonical encoding is byte-identical on 3.14. The one
failure in that run was
test_implementer_documents.pycatching the Python row ofdocs/implementations.mdstill saying 3.11–3.13, which is fixed here.tscand 999 passed on each.make checkon the head, with Python 3.14.7 and Node 18.19.1: ruff, mypy, Python 2081 passed and 10 skipped, TypeScript 999 passed.check_contexts.py: 13 contexts produced, all required, plusCodeQL.🤖 Generated with Claude Code