Skip to content

Bump to 4.6.0: CPython 3.12.14 / 3.13.15 / 3.14.7 (python-build 20260902, dart_bridge 1.8.0) - #247

Merged
FeodorFitsner merged 2 commits into
mainfrom
bump-python-build-20260902
Sep 2, 2026
Merged

Bump to 4.6.0: CPython 3.12.14 / 3.13.15 / 3.14.7 (python-build 20260902, dart_bridge 1.8.0)#247
FeodorFitsner merged 2 commits into
mainfrom
bump-python-build-20260902

Conversation

@FeodorFitsner

Copy link
Copy Markdown
Contributor

Re-pins the bundled snapshot to python-build 20260902 and regenerates the committed version tables from its manifest.json.

4.5.1 4.6.0
CPython 3.12 3.12.13 3.12.14
CPython 3.13 3.13.14 3.13.15
CPython 3.14 3.14.6 3.14.7
Pyodide (3.14) 314.0.3 314.0.6
dart_bridge 1.7.1 1.8.0
python-build snapshot 20260730 20260902

This is the first Python version move since 4.3.x — every 4.4/4.5 release re-pinned python-build for Apple signing work without a Python version changing. Hence 4.6.0 rather than 4.5.2.

Pyodide 3.13 (0.29.4) and 3.12 (0.27.7) stay put; each is already the newest release on its line, so only the 3.14 row moved.

Security content

All three micros are security releases sharing a quadratic-complexity DoS fix in incremental html.parser.HTMLParser parsing (gh-153030) and one for xml.etree.ElementTree XPath index predicates (gh-152674).

They do not share the libexpat fix. 3.12.14 shipped a week after the other two (2026-08-12 vs 2026-08-05) and bundles libexpat 2.8.3 for CVE-2026-72522; 3.13.15 and 3.14.7 still bundle 2.8.2. Checked in each runtime's own Modules/expat/expat.h rather than taken from release notes. It only matters for apps parsing untrusted XML through pyexpat/xml.etree/xml.sax, and upstream picks it up in the next 3.13/3.14 micro — but the changelogs say so rather than implying all three are equally current.

Verification

Run against the published 20260902 artifacts, not assumed:

  • python-ios-dart-3.14.7PY_VERSION 3.14.7; 56 XCFrameworks + 112 slice frameworks, all signed and securely timestamped by Apple Distribution: Appveyor Systems Inc. (GXXRQJK434). Zero unsigned bundles, zero missing timestamps — the same counts 4.5.1 recorded for 3.14.6, so the both-layer signing from 4.5.x survived a full rebuild of every framework.
  • python-ios-dart-3.13.15PY_VERSION 3.13.15; 168 bundles signed; HAVE_DUP3/HAVE_PIPE2 correctly undefined in pyconfig.h. That last one is the load-bearing check: 3.13.15 back-ported the macOS 27 dup3/pipe2 change (gh-153711), which split the configure gate that python-build's vendored Apple-tooling patch widens, and the patch had to be refreshed for it (flet-dev/python-build#40). An undefined pair confirms the refreshed gate landed in the shipped runtime.
  • The release carries all 30 runtime tarballs — every platform × every version — plus manifest.json.
  • CI's drift guard reproduced locally: dart run serious_python:gen_version_tables against the commit is a no-op.
  • dart analyze clean (the 5 invalid_dependency warnings are the pre-existing monorepo path: deps).

Docs

README's Python-versions table is updated, including its 3.14 Pyodide cell, which had drifted to 314.0.0 — the generator doesn't touch README, so that cell had been stale across several releases.

bridge_example/README.md's "Test environment" table still reads CPython 3.14.6: it records the conditions its benchmark numbers were measured under, so it's deliberately left alone.

The first Python version move since 4.3.x -- every 4.4/4.5 release re-pinned
python-build for Apple signing work without a Python version changing. Re-pins
the bundled snapshot to python-build 20260902 (dart_bridge 1.7.1 -> 1.8.0) and
regenerates the committed version tables from its manifest.json.

All three micros are security releases, sharing a quadratic-complexity DoS fix
in incremental html.parser.HTMLParser parsing (gh-153030) and one for
xml.etree.ElementTree XPath index predicates (gh-152674).

They do not share the libexpat fix. 3.12.14 shipped a week after the other two
and bundles libexpat 2.8.3 for CVE-2026-72522; 3.13.15 and 3.14.7 still bundle
2.8.2. Checked in each runtime's own Modules/expat/expat.h rather than taken
from the release notes. It only matters for apps parsing untrusted XML, and
upstream picks it up in the next 3.13/3.14 micro, but the changelogs say so
rather than implying all three are equally current.

Pyodide 3.14 moves 314.0.3 -> 314.0.6. 3.13 (0.29.4) and 3.12 (0.27.7) stay
put -- each is already newest on its line, so only the 3.14 row moved.

Verified on the published 20260902 artifacts rather than assumed:

  * python-ios-dart-3.14.7 -- PY_VERSION 3.14.7, and 56 XCFrameworks plus 112
    slice frameworks all signed and securely timestamped by Apple Distribution:
    Appveyor Systems Inc. (GXXRQJK434). Zero unsigned bundles, zero missing
    timestamps -- the same counts 4.5.1 recorded for 3.14.6, so the both-layer
    signing from 4.5.x survived a full rebuild of every framework.
  * python-ios-dart-3.13.15 -- PY_VERSION 3.13.15, 168 bundles signed, and
    HAVE_DUP3/HAVE_PIPE2 correctly undefined in pyconfig.h. That last one is the
    load-bearing check: 3.13.15 back-ported the macOS 27 dup3/pipe2 change
    (gh-153711), which split the configure gate that python-build's vendored
    Apple-tooling patch widens, and the patch had to be refreshed for it
    (flet-dev/python-build#40). An undefined pair confirms the refreshed gate
    landed.
  * The release carries all 30 runtime tarballs -- every platform x every
    version -- plus manifest.json.

README's Python-versions table is updated, including its 3.14 Pyodide cell,
which had drifted to 314.0.0 (the generator does not touch README).

bridge_example's "Test environment" table still reads CPython 3.14.6: it
records the conditions its benchmark numbers were measured under, so it is
left alone.
main landed the pip --no-input / bounded-timeout fix (#246) under a new
`## 4.5.2` heading in serious_python's changelog, which collided with the
`## 4.6.0` heading this branch adds at the same spot.

4.5.2 was never published -- #246 added the heading but left every pubspec,
the podspec and build.gradle.kts at 4.5.1 -- so there is no released 4.5.2 for
users to have seen. Its bullet moves into 4.6.0 and the heading goes away,
rather than shipping an empty version number between 4.5.1 and 4.6.0.

The pip bullet goes last in the section, after the runtime bullets it is
unrelated to. package_command.dart merged clean and is byte-identical to main.
@FeodorFitsner
FeodorFitsner merged commit a0343f9 into main Sep 2, 2026
30 of 31 checks passed
@FeodorFitsner
FeodorFitsner deleted the bump-python-build-20260902 branch September 2, 2026 22:05
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