Fix crashes during interpreter shutdown on all Python versions#499
Closed
nbouvrette wants to merge 1 commit intopython-greenlet:masterfrom
Closed
Fix crashes during interpreter shutdown on all Python versions#499nbouvrette wants to merge 1 commit intopython-greenlet:masterfrom
nbouvrette wants to merge 1 commit intopython-greenlet:masterfrom
Conversation
nbouvrette
added a commit
to nbouvrette/greenlet
that referenced
this pull request
Mar 11, 2026
Made-with: Cursor
17d17e3 to
733a419
Compare
nbouvrette
added a commit
to nbouvrette/greenlet
that referenced
this pull request
Mar 12, 2026
Ports all crash fixes from the main branch (PR python-greenlet#499) to maint/3.2 for a 3.2.6 release targeting Python 3.9 stability. Three root causes of SIGSEGV during Py_FinalizeEx on Python < 3.11: 1. clear_deleteme_list() vector allocation crash: replaced copy with std::swap and switched deleteme_t to std::allocator (system malloc). 2. ThreadState memory corruption: switched from PythonAllocator (PyObject_Malloc) to std::malloc/std::free. 3. getcurrent() crash on invalidated type objects: added atexit handler that sets g_greenlet_shutting_down before _Py_IsFinalizing() is set. Also fixes exception preservation in clear_deleteme_list(), adds Py_IsFinalizing() compat shim for Python < 3.13, Windows USS tolerance for flaky memory test, and additional shutdown tests. Made-with: Cursor
5 tasks
25a4dfa to
e1fdf27
Compare
During Py_FinalizeEx, multiple greenlet code paths accessed partially-destroyed Python state, causing SIGSEGV in production (uWSGI worker recycling on ARM64 and x86_64, Python 3.11). Root cause: _Py_IsFinalizing() is set AFTER atexit handlers complete on ALL Python versions, leaving a window where getcurrent() and type validators reach into torn-down C++ state. Fix: Two independent guards now protect all shutdown phases: 1. g_greenlet_shutting_down — atexit handler registered at module init (LIFO = runs first). Covers the atexit phase where Py_IsFinalizing() is still False. 2. Py_IsFinalizing() — covers the GC collection and later phases. A compatibility shim is provided for Python < 3.13. These guards are checked in mod_getcurrent, PyGreenlet_GetCurrent, GreenletChecker, MainGreenletExactChecker, ContextExactChecker, clear_deleteme_list, ThreadState destructor, _green_dealloc_kill_started_non_main_greenlet, and AddPendingCall. Additional hardening: - clear_deleteme_list() uses std::swap (zero-allocation) - deleteme vector uses std::allocator (system malloc) - ThreadState uses std::malloc/std::free - clear_deleteme_list() preserves pending Python exceptions TDD-certified: tests fail on greenlet 3.3.2 and pass with the fix across Python 3.10-3.14. Test suite: 21 shutdown tests (5 TDD regression, 2 behavioral, 14 smoke with 3 strengthened). Also fixes: - test_dealloc_catches_GreenletExit_throws_other: use sys.unraisablehook for pytest compatibility - test_version: skip gracefully on old setuptools (PEP 639) - test_no_gil_on_free_threaded: use getattr for pylint compatibility - Flaky USS memory test on Windows Made-with: Cursor
a4a6510 to
5745a6c
Compare
nbouvrette
added a commit
to nbouvrette/greenlet
that referenced
this pull request
Mar 24, 2026
Backport of PR python-greenlet#499 (master) to maint/3.2 for greenlet 3.2.6, with all shutdown guards made unconditional across Python 3.9-3.13. The previous backport (3.2.5 / PR python-greenlet#495) only guarded Python < 3.11, but the vulnerability exists on ALL Python versions: Py_IsFinalizing() is set AFTER atexit handlers complete inside Py_FinalizeEx. Two independent guards now protect all shutdown phases: 1. g_greenlet_shutting_down — atexit handler registered at module init (LIFO = runs first). Covers the atexit phase where Py_IsFinalizing() is still False. 2. Py_IsFinalizing() — covers the GC collection and later phases. A compatibility shim maps to _Py_IsFinalizing() on Python < 3.13. These guards are checked in mod_getcurrent, PyGreenlet_GetCurrent, GreenletChecker, MainGreenletExactChecker, ContextExactChecker, clear_deleteme_list, ThreadState destructor, _green_dealloc_kill_started_non_main_greenlet, and AddPendingCall. Additional hardening: - clear_deleteme_list() uses std::swap (zero-allocation) - deleteme vector uses std::allocator (system malloc) - ThreadState uses std::malloc/std::free - clear_deleteme_list() preserves pending Python exceptions TDD-certified: tests fail on greenlet 3.3.2 and pass with the fix across Python 3.10-3.14. Docker verification on Python 3.9 and 3.10 confirms GUARDED on the maint/3.2 branch. Also fixes: - SPDX license identifier: Python-2.0 -> PSF-2.0 - test_dealloc_catches_GreenletExit_throws_other: use sys.unraisablehook for pytest compatibility - test_version: skip gracefully on old setuptools - Flaky USS memory test on Windows Made-with: Cursor
Contributor
|
Thanks for this PR, it looks sound to me. I've made some minor changes (be more idiomatic, add some more comments, resolve the conflict) which I'll merge after the tests pass. |
Contributor
|
Apparently I handled the merge wrong as far as the UI is concerned, but this has been merged. |
Contributor
Author
Contributor
Author
|
I can bring all your other commits in #500 if this help |
nbouvrette
added a commit
to nbouvrette/greenlet
that referenced
this pull request
Mar 31, 2026
Port the maintainer's (jamadden) follow-up refinements from master to the maint/3.2 backport branch: - Refactor atexit registration to use NewReference/Require framework instead of nested ifs and manual decrefs. Crash safety is not optional. (38bf3d7) - Namespace g_greenlet_shutting_down as static in namespace greenlet instead of extern across multiple files. (c545379) - Encapsulate the dual-guard pattern in IsShuttingDown() function, replacing all g_greenlet_shutting_down || Py_IsFinalizing() checks. (879a868, fbb4bcd) - Add comment explaining why g_greenlet_shutting_down does not need std::atomic<int>. (c79fb07) - Add comments on deliberate leaking and exception safety in clear_deleteme_list. (6c517cb) - Comment cleanup and formatting. (fcf6f72, 98e8fb0 partial) Skipped (not applicable to maint/3.2): - CI: bump docker/setup-qemu-action (7b56329) — different CI config - test_greenlet: revert getattr for _is_gil_enabled (98e8fb0) — test does not exist on maint/3.2 All 21 shutdown tests pass, full suite 159 passed / 1 skipped. Made-with: Cursor
Contributor
Author
|
@jamadden I ported back all your latest changes on #500 Ported (7 of 8 commits):
Skipped (2 items):
Verification: Build succeeded, all 21 shutdown tests passed, full suite 159 passed / 1 skipped. |
shaldengeki
added a commit
to shaldengeki/monorepo
that referenced
this pull request
Apr 14, 2026
Bumps the pip group with 10 updates: | Package | From | To | | --- | --- | --- | | [astroid](https://github.com/pylint-dev/astroid) | `4.0.4` | `4.1.2` | | [boto3](https://github.com/boto/boto3) | `1.42.83` | `1.42.88` | | [boto3-stubs](https://github.com/youtype/mypy_boto3_builder) | `1.42.83` | `1.42.88` | | [platformdirs](https://github.com/tox-dev/platformdirs) | `4.9.4` | `4.9.6` | | [pytest](https://github.com/pytest-dev/pytest) | `9.0.2` | `9.0.3` | | [virtualenv](https://github.com/pypa/virtualenv) | `21.2.0` | `21.2.1` | | [botocore](https://github.com/boto/botocore) | `1.42.83` | `1.42.88` | | [greenlet](https://github.com/python-greenlet/greenlet) | `3.3.2` | `3.4.0` | | [librt](https://github.com/mypyc/librt) | `0.8.1` | `0.9.0` | | [python-discovery](https://github.com/tox-dev/python-discovery) | `1.2.1` | `1.2.2` | Updates `astroid` from 4.0.4 to 4.1.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pylint-dev/astroid/releases">astroid's releases</a>.</em></p> <blockquote> <h2>v4.1.2</h2> <h1>What's New in astroid 4.1.2?</h1> <p>Release date: 2026-03-22</p> <ul> <li> <p>Fix crash accessing property <code>fset</code> in generic classes with type annotations. Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2996">#2996</a></p> </li> <li> <p>Fix infinite recursion caused by cyclic inference in <code>Constraint</code>.</p> </li> <li> <p>Fix <code>RecursionError</code> in <code>_compute_mro()</code> when circular class hierarchies are created through runtime name rebinding. Circular bases are now resolved to the original class instead of recursing.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2967">#2967</a> Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/10821">pylint-dev/pylint#10821</a></p> </li> <li> <p>Fix <code>DuplicateBasesError</code> crash in dataclass transform when a class has duplicate bases in its MRO (e.g., <code>Protocol</code> appearing both directly and indirectly). Catch <code>MroError</code> at <code>.mro()</code> call sites in <code>brain_dataclasses.py</code>, consistent with the existing pattern elsewhere.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2628">#2628</a></p> </li> <li> <p>Fix <code>FunctionModel</code> returning descriptor attributes for builtin functions.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2743">#2743</a></p> </li> <li> <p>Catch <code>MemoryError</code> when inferring f-strings with extremely large format widths (e.g. <code>f'{0:11111111111}'</code>) so that inference yields <code>Uninferable</code> instead of crashing.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2762">#2762</a></p> </li> <li> <p>Fix <code>ValueError</code> in <code>__str__</code>/<code>repr</code> and error messages when nodes have extreme values (very long identifiers or large integers). Clamp pprint width to a minimum of 1 and truncate oversized values in error messages.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2764">#2764</a></p> </li> </ul> <h2>v4.1.1</h2> <h1>What's New in astroid 4.1.1?</h1> <p>Release date: 2026-02-22</p> <ul> <li> <p>Let <code>UnboundMethodModel</code> inherit from <code>FunctionModel</code> to improve inference of dunder methods for unbound methods.</p> <p>Refs <a href="https://redirect.github.com/pylint-dev/astroid/issues/2741">#2741</a></p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/pylint-dev/astroid/blob/main/ChangeLog">astroid's changelog</a>.</em></p> <blockquote> <h1>What's New in astroid 4.1.2?</h1> <p>Release date: 2026-03-22</p> <ul> <li> <p>Fix crash accessing property <code>fset</code> in generic classes with type annotations. Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2996">#2996</a></p> </li> <li> <p>Fix infinite recursion caused by cyclic inference in <code>Constraint</code>.</p> </li> <li> <p>Fix <code>RecursionError</code> in <code>_compute_mro()</code> when circular class hierarchies are created through runtime name rebinding. Circular bases are now resolved to the original class instead of recursing.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2967">#2967</a> Closes <a href="https://redirect.github.com/pylint-dev/pylint/issues/10821">pylint-dev/pylint#10821</a></p> </li> <li> <p>Fix <code>DuplicateBasesError</code> crash in dataclass transform when a class has duplicate bases in its MRO (e.g., <code>Protocol</code> appearing both directly and indirectly). Catch <code>MroError</code> at <code>.mro()</code> call sites in <code>brain_dataclasses.py</code>, consistent with the existing pattern elsewhere.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2628">#2628</a></p> </li> <li> <p>Fix <code>FunctionModel</code> returning descriptor attributes for builtin functions.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2743">#2743</a></p> </li> <li> <p>Catch <code>MemoryError</code> when inferring f-strings with extremely large format widths (e.g. <code>f'{0:11111111111}'</code>) so that inference yields <code>Uninferable</code> instead of crashing.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2762">#2762</a></p> </li> <li> <p>Fix <code>ValueError</code> in <code>__str__</code>/<code>repr</code> and error messages when nodes have extreme values (very long identifiers or large integers). Clamp pprint width to a minimum of 1 and truncate oversized values in error messages.</p> <p>Closes <a href="https://redirect.github.com/pylint-dev/astroid/issues/2764">#2764</a></p> </li> </ul> <h1>What's New in astroid 4.1.1?</h1> <p>Release date: 2026-02-22</p> <ul> <li> <p>Let <code>UnboundMethodModel</code> inherit from <code>FunctionModel</code> to improve inference of dunder methods for unbound methods.</p> <p>Refs <a href="https://redirect.github.com/pylint-dev/astroid/issues/2741">#2741</a></p> </li> <li> <p>Filter <code>Unknown</code> from <code>UnboundMethod</code> and <code>Super</code> special attribute</p> </li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pylint-dev/astroid/commit/91dac1330a52c8e606f18720d02667d49cdce8bd"><code>91dac13</code></a> Bump astroid to 4.1.2, update changelog (<a href="https://redirect.github.com/pylint-dev/astroid/issues/3011">#3011</a>)</li> <li><a href="https://github.com/pylint-dev/astroid/commit/796eba878e3b1767bc817298d0243e1d1c7c0d21"><code>796eba8</code></a> objectmodel: fix crash analyzing property fset in generic classes with type a...</li> <li><a href="https://github.com/pylint-dev/astroid/commit/ca814f0d7106a24f5d2b101ee7aaabaad3428b61"><code>ca814f0</code></a> Update CI workflow to include maintenance branch (<a href="https://redirect.github.com/pylint-dev/astroid/issues/2999">#2999</a>)</li> <li><a href="https://github.com/pylint-dev/astroid/commit/75938774dfaff2e062abd519a82670a9bc19fbc0"><code>7593877</code></a> [Backport maintenance/4.1.x] Fix cyclic inference by constraints (<a href="https://redirect.github.com/pylint-dev/astroid/issues/2998">#2998</a>)</li> <li><a href="https://github.com/pylint-dev/astroid/commit/3f63f905cb2f2e01cdf11451d1ec7733239adbea"><code>3f63f90</code></a> Fix builtin functions incorrectly exposing descriptor attributes (<a href="https://redirect.github.com/pylint-dev/astroid/issues/2983">#2983</a>)</li> <li><a href="https://github.com/pylint-dev/astroid/commit/be7479e2e9980e62801c8cb4bb36263f1d5bb616"><code>be7479e</code></a> Fix ValueError in <strong>str</strong>/repr and error messages with extreme values (<a href="https://redirect.github.com/pylint-dev/astroid/issues/2971">#2971</a>)</li> <li><a href="https://github.com/pylint-dev/astroid/commit/1c9938d4ef2469117d098587aecd022795d4bdbf"><code>1c9938d</code></a> Fix RecursionError in _compute_mro() on circular class hierarchies (<a href="https://redirect.github.com/pylint-dev/astroid/issues/2968">#2968</a>)</li> <li><a href="https://github.com/pylint-dev/astroid/commit/98938adeba4693f0af4ddd39687f8cc86640e8ba"><code>98938ad</code></a> [Backport maintenance/4.1.x] Fix DuplicateBasesError crash in dataclass trans...</li> <li><a href="https://github.com/pylint-dev/astroid/commit/33fabe0cedce85162fcae11c4c57098389d27ee3"><code>33fabe0</code></a> [Backport maintenance/4.1.x] Fix MemoryError when inferring f-string with lar...</li> <li><a href="https://github.com/pylint-dev/astroid/commit/f11d7ae40c6929bed001b807321ff46051cb2064"><code>f11d7ae</code></a> Bump astroid to 4.1.1, update changelog</li> <li>Additional commits viewable in <a href="https://github.com/pylint-dev/astroid/compare/v4.0.4...v4.1.2">compare view</a></li> </ul> </details> <br /> Updates `boto3` from 1.42.83 to 1.42.88 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/boto/boto3/commit/f92a06cca537b03c6cbc71b2ab004674298053dd"><code>f92a06c</code></a> Merge branch 'release-1.42.88'</li> <li><a href="https://github.com/boto/boto3/commit/9bdec29dd7a50a0412772bae77580bb3be674295"><code>9bdec29</code></a> Bumping version to 1.42.88</li> <li><a href="https://github.com/boto/boto3/commit/d880788fea57399dd5e9e2be08691a2b9ec26502"><code>d880788</code></a> Add changelog entries from botocore</li> <li><a href="https://github.com/boto/boto3/commit/39a412231d29b10761a1812efbbf00aa8d17d6a6"><code>39a4122</code></a> chore: add additional text to CONTRIBUTING.rst (<a href="https://redirect.github.com/boto/boto3/issues/4749">#4749</a>)</li> <li><a href="https://github.com/boto/boto3/commit/8d65320e4df23b56f3dc5b09ad75d95bcc85382b"><code>8d65320</code></a> Merge branch 'release-1.42.87'</li> <li><a href="https://github.com/boto/boto3/commit/fdcbb88dfbc65c8ef6fd3557f7d37c73ec6a09a2"><code>fdcbb88</code></a> Merge branch 'release-1.42.87' into develop</li> <li><a href="https://github.com/boto/boto3/commit/aff7ae57451834a94a1ba027b3bce741612e3d09"><code>aff7ae5</code></a> Bumping version to 1.42.87</li> <li><a href="https://github.com/boto/boto3/commit/a58071d342a6c659814e6baca5d353d0c311a5e5"><code>a58071d</code></a> Add changelog entries from botocore</li> <li><a href="https://github.com/boto/boto3/commit/bf26a45aa2447dfee29ab904b99eeda523c20874"><code>bf26a45</code></a> Add boto3 version clarification for login with console credentials (<a href="https://redirect.github.com/boto/boto3/issues/4758">#4758</a>)</li> <li><a href="https://github.com/boto/boto3/commit/a4315bc80b83e8cf59e8582eef0e75f79fc01e4a"><code>a4315bc</code></a> Merge branch 'release-1.42.86'</li> <li>Additional commits viewable in <a href="https://github.com/boto/boto3/compare/1.42.83...1.42.88">compare view</a></li> </ul> </details> <br /> Updates `boto3-stubs` from 1.42.83 to 1.42.88 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/youtype/mypy_boto3_builder/releases">boto3-stubs's releases</a>.</em></p> <blockquote> <h2>8.8.0 - Python 3.8 runtime is back</h2> <h3>Changed</h3> <ul> <li><code>[services]</code> <code>install_requires</code> section is calculated based on dependencies in use, so <code>typing-extensions</code> version is set properly</li> <li><code>[all]</code> Replaced <code>typing</code> imports with <code>collections.abc</code> with a fallback to <code>typing</code> for Python <3.9</li> <li><code>[all]</code> Added aliases for <code>builtins.list</code>, <code>builtins.set</code>, <code>builtins.dict</code>, and <code>builtins.type</code>, so Python 3.8 runtime should work as expected again (reported by <a href="https://github.com/YHallouard"><code>@YHallouard</code></a> in <a href="https://redirect.github.com/youtype/mypy_boto3_builder/issues/340">#340</a> and <a href="https://github.com/Omri-Ben-Yair"><code>@Omri-Ben-Yair</code></a> in <a href="https://redirect.github.com/youtype/mypy_boto3_builder/issues/336">#336</a>)</li> <li><code>[all]</code> Unions use the same type annotations as the rest of the structures due to proper fallbacks</li> </ul> <h3>Fixed</h3> <ul> <li><code>[services]</code> Universal input/output shapes were not replaced properly in service subresources</li> <li><code>[docs]</code> Simplified doc links rendering for services</li> <li><code>[services]</code> Cleaned up unnecessary imports in <code>client.pyi</code></li> <li><code>[builder]</code> Import records with fallback are always rendered</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/youtype/mypy_boto3_builder/commits">compare view</a></li> </ul> </details> <br /> Updates `platformdirs` from 4.9.4 to 4.9.6 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/tox-dev/platformdirs/releases">platformdirs's releases</a>.</em></p> <blockquote> <h2>4.9.6</h2> <!-- raw HTML omitted --> <h2>What's Changed</h2> <ul> <li>🐛 fix(release): use double quotes for tag variable expansion by <a href="https://github.com/gaborbernat"><code>@gaborbernat</code></a> in <a href="https://redirect.github.com/tox-dev/platformdirs/pull/477">tox-dev/platformdirs#477</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/tox-dev/platformdirs/compare/4.9.5...4.9.6">https://github.com/tox-dev/platformdirs/compare/4.9.5...4.9.6</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst">platformdirs's changelog</a>.</em></p> <blockquote> <p>########### Changelog ###########</p> <hr /> <p>4.9.6 (2026-04-09)</p> <hr /> <ul> <li>🐛 fix(release): use double quotes for tag variable expansion :pr:<code>477</code></li> </ul> <hr /> <p>4.9.5 (2026-04-06)</p> <hr /> <ul> <li>📝 docs(appauthor): clarify None vs False on Windows :pr:<code>476</code></li> <li>Separates implementations of macOS dirs that share a default :pr:<code>473</code> - by :user:<code>Goddesen</code></li> <li>Remove persist-credentials: false from release job :pr:<code>472</code></li> <li>fix: do not duplicate site dirs in Unix.iter_{config,site}_dirs() when use_site_for_root is active :pr:<code>469</code> - by :user:<code>viccie30</code></li> <li>🔧 fix(type): resolve ty 0.0.25 type errors :pr:<code>468</code></li> <li>🔒 ci(workflows): add zizmor security auditing :pr:<code>467</code></li> <li>🐛 fix(release): generate docstrfmt-compatible changelog entries :pr:<code>463</code></li> </ul> <hr /> <p>4.9.4 (2026-03-05)</p> <hr /> <ul> <li>[pre-commit.ci] pre-commit autoupdate :pr:<code>461</code> - by :user:<code>pre-commit-ci[bot]</code></li> <li>Update README.md</li> <li>📝 docs: add project logo to documentation :pr:<code>459</code></li> <li>Standardize .github files to .yaml suffix</li> <li>build(deps): bump the all group with 2 updates :pr:<code>457</code> - by :user:<code>dependabot[bot]</code></li> <li>Move SECURITY.md to .github/SECURITY.md</li> <li>Add permissions to workflows :pr:<code>455</code></li> <li>Add security policy</li> <li>[pre-commit.ci] pre-commit autoupdate :pr:<code>454</code> - by :user:<code>pre-commit-ci[bot]</code></li> </ul> <hr /> <p>4.9.2 (2026-02-16)</p> <hr /> <ul> <li>📝 docs: restructure following Diataxis framework :pr:<code>448</code></li> <li>📝 docs(platforms): fix RST formatting and TOC hierarchy :pr:<code>447</code></li> </ul> <hr /> <p>4.9.1 (2026-02-14)</p> <hr /> <ul> <li>📝 docs: enhance README, fix issues, and reorganize platforms.rst :pr:<code>445</code></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/tox-dev/platformdirs/commit/56efd776d68a94898b319c108933d0cfbff813af"><code>56efd77</code></a> Release 4.9.6</li> <li><a href="https://github.com/tox-dev/platformdirs/commit/d5d812a02102c633a39f3dfdddbc6bb1670b13ae"><code>d5d812a</code></a> 🐛 fix(release): use double quotes for tag variable expansion (<a href="https://redirect.github.com/tox-dev/platformdirs/issues/477">#477</a>)</li> <li><a href="https://github.com/tox-dev/platformdirs/commit/c2b0cee3a8261b3a75b283b9ef148d2425d48d35"><code>c2b0cee</code></a> build(deps): bump pypa/gh-action-pypi-publish from 1.13.0 to 1.14.0 in the al...</li> <li><a href="https://github.com/tox-dev/platformdirs/commit/7688069a09e03bb4e97fe0f9cf3aebedc8a6f7f9"><code>7688069</code></a> Release 4.9.5</li> <li><a href="https://github.com/tox-dev/platformdirs/commit/104d28b48c59b327a7832b23509187eef2764af8"><code>104d28b</code></a> 📝 docs(appauthor): clarify None vs False on Windows (<a href="https://redirect.github.com/tox-dev/platformdirs/issues/476">#476</a>)</li> <li><a href="https://github.com/tox-dev/platformdirs/commit/0955048684241725bb2eae8a2ba5bc7f7f46c9a0"><code>0955048</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/tox-dev/platformdirs/issues/475">#475</a>)</li> <li><a href="https://github.com/tox-dev/platformdirs/commit/bd3c76602f88284eb832c7f5297c354ea7ac5906"><code>bd3c766</code></a> build(deps): bump astral-sh/setup-uv from 7.6.0 to 8.0.0 in the all group (<a href="https://redirect.github.com/tox-dev/platformdirs/issues/474">#474</a>)</li> <li><a href="https://github.com/tox-dev/platformdirs/commit/749ac3f33ffc5af04fb8bb046bbbcc4d5aa562c9"><code>749ac3f</code></a> Separates implementations of macOS dirs that share a default (<a href="https://redirect.github.com/tox-dev/platformdirs/issues/473">#473</a>)</li> <li><a href="https://github.com/tox-dev/platformdirs/commit/cb8815684f15c58ad1b87c8b1d34f9bf2d79780e"><code>cb88156</code></a> Remove persist-credentials: false from release job (<a href="https://redirect.github.com/tox-dev/platformdirs/issues/472">#472</a>)</li> <li><a href="https://github.com/tox-dev/platformdirs/commit/a501eabd7dd0e56116c38fa9dba15f3c0b60010a"><code>a501eab</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/tox-dev/platformdirs/issues/470">#470</a>)</li> <li>Additional commits viewable in <a href="https://github.com/tox-dev/platformdirs/compare/4.9.4...4.9.6">compare view</a></li> </ul> </details> <br /> Updates `pytest` from 9.0.2 to 9.0.3 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pytest-dev/pytest/releases">pytest's releases</a>.</em></p> <blockquote> <h2>9.0.3</h2> <h1>pytest 9.0.3 (2026-04-07)</h1> <h2>Bug fixes</h2> <ul> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/12444">#12444</a>: Fixed <code>pytest.approx</code> which now correctly takes into account <code>~collections.abc.Mapping</code> keys order to compare them.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/13634">#13634</a>: Blocking a <code>conftest.py</code> file using the <code>-p no:</code> option is now explicitly disallowed.</p> <p>Previously this resulted in an internal assertion failure during plugin loading.</p> <p>Pytest now raises a clear <code>UsageError</code> explaining that conftest files are not plugins and cannot be disabled via <code>-p</code>.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/13734">#13734</a>: Fixed crash when a test raises an exceptiongroup with <code>__tracebackhide__ = True</code>.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/14195">#14195</a>: Fixed an issue where non-string messages passed to <!-- raw HTML omitted -->unittest.TestCase.subTest()<!-- raw HTML omitted --> were not printed.</p> </li> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/14343">#14343</a>: Fixed use of insecure temporary directory (CVE-2025-71176).</p> </li> </ul> <h2>Improved documentation</h2> <ul> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/13388">#13388</a>: Clarified documentation for <code>-p</code> vs <code>PYTEST_PLUGINS</code> plugin loading and fixed an incorrect <code>-p</code> example.</li> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/13731">#13731</a>: Clarified that capture fixtures (e.g. <code>capsys</code> and <code>capfd</code>) take precedence over the <code>-s</code> / <code>--capture=no</code> command-line options in <code>Accessing captured output from a test function <accessing-captured-output></code>.</li> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/14088">#14088</a>: Clarified that the default <code>pytest_collection</code> hook sets <code>session.items</code> before it calls <code>pytest_collection_finish</code>, not after.</li> <li><a href="https://redirect.github.com/pytest-dev/pytest/issues/14255">#14255</a>: TOML integer log levels must be quoted: Updating reference documentation.</li> </ul> <h2>Contributor-facing changes</h2> <ul> <li> <p><a href="https://redirect.github.com/pytest-dev/pytest/issues/12689">#12689</a>: The test reports are now published to Codecov from GitHub Actions. The test statistics is visible <a href="https://app.codecov.io/gh/pytest-dev/pytest/tests">on the web interface</a>.</p> <p>-- by <code>aleguy02</code></p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pytest-dev/pytest/commit/a7d58d7a21b78581e636bbbdea13c66ad1657c1e"><code>a7d58d7</code></a> Prepare release version 9.0.3</li> <li><a href="https://github.com/pytest-dev/pytest/commit/089d98199c253d8f89a040243bc4f2aa6cd5ab22"><code>089d981</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14366">#14366</a> from bluetech/revert-14193-backport</li> <li><a href="https://github.com/pytest-dev/pytest/commit/8127eaf4ab7f6b2fdd0dc1b38343ec97aeef05ac"><code>8127eaf</code></a> Revert "Fix: assertrepr_compare respects dict insertion order (<a href="https://redirect.github.com/pytest-dev/pytest/issues/14050">#14050</a>) (<a href="https://redirect.github.com/pytest-dev/pytest/issues/14193">#14193</a>)"</li> <li><a href="https://github.com/pytest-dev/pytest/commit/99a7e6029e7a6e8d53e5df114b1346e035370241"><code>99a7e60</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14363">#14363</a> from pytest-dev/patchback/backports/9.0.x/95d8423bd...</li> <li><a href="https://github.com/pytest-dev/pytest/commit/ddee02a578da30dd43aedc39c1c1f1aaadfcee95"><code>ddee02a</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14343">#14343</a> from bluetech/cve-2025-71176-simple</li> <li><a href="https://github.com/pytest-dev/pytest/commit/74eac6916fee34726cb194f16c516e96fbd29619"><code>74eac69</code></a> doc: Update training info (<a href="https://redirect.github.com/pytest-dev/pytest/issues/14298">#14298</a>) (<a href="https://redirect.github.com/pytest-dev/pytest/issues/14301">#14301</a>)</li> <li><a href="https://github.com/pytest-dev/pytest/commit/f92dee777cfdb77d1c43633d02766ddf1f07c869"><code>f92dee7</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14267">#14267</a> from pytest-dev/patchback/backports/9.0.x/d6fa26c62...</li> <li><a href="https://github.com/pytest-dev/pytest/commit/7ee58acc8777c31ac6cf388d01addf5a414a7439"><code>7ee58ac</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/12378">#12378</a> from Pierre-Sassoulas/fix-implicit-str-concat-and-d...</li> <li><a href="https://github.com/pytest-dev/pytest/commit/37da870d37e3a2f5177cae075c7b9ae279432bf8"><code>37da870</code></a> Merge pull request <a href="https://redirect.github.com/pytest-dev/pytest/issues/14259">#14259</a> from mitre88/patch-4 (<a href="https://redirect.github.com/pytest-dev/pytest/issues/14268">#14268</a>)</li> <li><a href="https://github.com/pytest-dev/pytest/commit/c34bfa3b7acb65b594707c714f1d8461b0304eed"><code>c34bfa3</code></a> Add explanation for string context diffs (<a href="https://redirect.github.com/pytest-dev/pytest/issues/14257">#14257</a>) (<a href="https://redirect.github.com/pytest-dev/pytest/issues/14266">#14266</a>)</li> <li>Additional commits viewable in <a href="https://github.com/pytest-dev/pytest/compare/9.0.2...9.0.3">compare view</a></li> </ul> </details> <br /> Updates `virtualenv` from 21.2.0 to 21.2.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pypa/virtualenv/releases">virtualenv's releases</a>.</em></p> <blockquote> <h2>21.2.1</h2> <!-- raw HTML omitted --> <h2>What's Changed</h2> <ul> <li>Upgrade embedded pip/setuptools/wheel by <a href="https://github.com/github-actions"><code>@github-actions</code></a>[bot] in <a href="https://redirect.github.com/pypa/virtualenv/pull/3093">pypa/virtualenv#3093</a></li> <li>Enhance upgrade workflow: age check, dedup, issue tracking by <a href="https://github.com/rahuldevikar"><code>@rahuldevikar</code></a> in <a href="https://redirect.github.com/pypa/virtualenv/pull/3094">pypa/virtualenv#3094</a></li> <li>🐛 fix(create): use commonpath for correct path validation by <a href="https://github.com/gaborbernat"><code>@gaborbernat</code></a> in <a href="https://redirect.github.com/pypa/virtualenv/pull/3097">pypa/virtualenv#3097</a></li> <li>🔒 ci(workflows): add zizmor security auditing by <a href="https://github.com/gaborbernat"><code>@gaborbernat</code></a> in <a href="https://redirect.github.com/pypa/virtualenv/pull/3099">pypa/virtualenv#3099</a></li> <li>Add current and previous maintainers by <a href="https://github.com/rahuldevikar"><code>@rahuldevikar</code></a> in <a href="https://redirect.github.com/pypa/virtualenv/pull/3101">pypa/virtualenv#3101</a></li> <li>🔧 fix(ci): restore git credentials for release and upgrade jobs by <a href="https://github.com/gaborbernat"><code>@gaborbernat</code></a> in <a href="https://redirect.github.com/pypa/virtualenv/pull/3102">pypa/virtualenv#3102</a></li> <li>Fix broken Installation link in README by <a href="https://github.com/Bahtya"><code>@Bahtya</code></a> in <a href="https://redirect.github.com/pypa/virtualenv/pull/3106">pypa/virtualenv#3106</a></li> <li>fix: use terminal width for help formatting instead of hardcoded 240 by <a href="https://github.com/Bahtya"><code>@Bahtya</code></a> in <a href="https://redirect.github.com/pypa/virtualenv/pull/3110">pypa/virtualenv#3110</a></li> <li>🐛 fix(nushell): surface actionable hint in deactivate error output by <a href="https://github.com/gaborbernat"><code>@gaborbernat</code></a> in <a href="https://redirect.github.com/pypa/virtualenv/pull/3112">pypa/virtualenv#3112</a></li> <li>👷 ci: fix setup-uv warnings and drop brew@3.9 by <a href="https://github.com/gaborbernat"><code>@gaborbernat</code></a> in <a href="https://redirect.github.com/pypa/virtualenv/pull/3113">pypa/virtualenv#3113</a></li> <li>fix(ci): fix pre-release push and release note generation by <a href="https://github.com/gaborbernat"><code>@gaborbernat</code></a> in <a href="https://redirect.github.com/pypa/virtualenv/pull/3114">pypa/virtualenv#3114</a></li> <li>fix(ci): check out repo in publish job for gh release notes by <a href="https://github.com/gaborbernat"><code>@gaborbernat</code></a> in <a href="https://redirect.github.com/pypa/virtualenv/pull/3115">pypa/virtualenv#3115</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/github-actions"><code>@github-actions</code></a>[bot] made their first contribution in <a href="https://redirect.github.com/pypa/virtualenv/pull/3093">pypa/virtualenv#3093</a></li> <li><a href="https://github.com/Bahtya"><code>@Bahtya</code></a> made their first contribution in <a href="https://redirect.github.com/pypa/virtualenv/pull/3106">pypa/virtualenv#3106</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/pypa/virtualenv/compare/21.2.0...21.2.1">https://github.com/pypa/virtualenv/compare/21.2.0...21.2.1</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst">virtualenv's changelog</a>.</em></p> <blockquote> <h1>Bugfixes - 21.2.1</h1> <ul> <li> <p>Upgrade embedded wheels:</p> <ul> <li>setuptools to <code>82.0.1</code> from <code>82.0.0</code> (:issue:<code>3093</code>)</li> </ul> </li> <li> <p>Use terminal width for help formatting instead of hardcoded 240. (:issue:<code>3110</code>)</p> </li> </ul> <hr /> <p>v21.2.0 (2026-03-09)</p> <hr /> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pypa/virtualenv/commit/d1fc6e68678da49932707bb09a10464aff2f30cc"><code>d1fc6e6</code></a> Release 21.2.1</li> <li><a href="https://github.com/pypa/virtualenv/commit/4136b51af53ba50354c6727cae3b79c6be2b2a3b"><code>4136b51</code></a> fix(ci): check out repo in publish job for gh release notes (<a href="https://redirect.github.com/pypa/virtualenv/issues/3115">#3115</a>)</li> <li><a href="https://github.com/pypa/virtualenv/commit/d1deceacb19edde2c91a40e20894b7863d2a02ab"><code>d1decea</code></a> fix(ci): persist git credentials in pre-release workflow (<a href="https://redirect.github.com/pypa/virtualenv/issues/3114">#3114</a>)</li> <li><a href="https://github.com/pypa/virtualenv/commit/48e21104c939b6fb582dc4c56349860264d00062"><code>48e2110</code></a> 👷 ci: fix setup-uv warnings and drop brew@3.9 (<a href="https://redirect.github.com/pypa/virtualenv/issues/3113">#3113</a>)</li> <li><a href="https://github.com/pypa/virtualenv/commit/d00c465448230b7d964b2fbf646fa9602c7aa816"><code>d00c465</code></a> 🐛 fix(nushell): surface actionable hint in deactivate error output (<a href="https://redirect.github.com/pypa/virtualenv/issues/3112">#3112</a>)</li> <li><a href="https://github.com/pypa/virtualenv/commit/0a8c46a5436d1d31487b88d0e72be1b48cf9b02e"><code>0a8c46a</code></a> chore(deps): bump pypa/gh-action-pypi-publish from 1.13.0 to 1.14.0 (<a href="https://redirect.github.com/pypa/virtualenv/issues/3111">#3111</a>)</li> <li><a href="https://github.com/pypa/virtualenv/commit/f0bbe174e2c241f9a7fbeaac7446cf200c14a851"><code>f0bbe17</code></a> fix: use terminal width for help formatting instead of hardcoded 240 (<a href="https://redirect.github.com/pypa/virtualenv/issues/3110">#3110</a>)</li> <li><a href="https://github.com/pypa/virtualenv/commit/dfaa73826dad5e9c2cdc2b5873a14eb80c37480b"><code>dfaa738</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/pypa/virtualenv/issues/3109">#3109</a>)</li> <li><a href="https://github.com/pypa/virtualenv/commit/cc658da7f137776813f3304cdd772eb52f8ed36e"><code>cc658da</code></a> chore(deps): bump astral-sh/setup-uv from 7.6.0 to 8.0.0 (<a href="https://redirect.github.com/pypa/virtualenv/issues/3107">#3107</a>)</li> <li><a href="https://github.com/pypa/virtualenv/commit/f235373eee6e3e98e556408fa71e67adb4d4685b"><code>f235373</code></a> Fix broken Installation link in README (<a href="https://redirect.github.com/pypa/virtualenv/issues/3106">#3106</a>)</li> <li>Additional commits viewable in <a href="https://github.com/pypa/virtualenv/compare/21.2.0...21.2.1">compare view</a></li> </ul> </details> <br /> Updates `botocore` from 1.42.83 to 1.42.88 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/boto/botocore/commit/974e23f2630cc634685ed7325829bd81bda22a87"><code>974e23f</code></a> Merge branch 'release-1.42.88'</li> <li><a href="https://github.com/boto/botocore/commit/ec1ea27970237ee7225219a2ebd8087b9ceceeec"><code>ec1ea27</code></a> Bumping version to 1.42.88</li> <li><a href="https://github.com/boto/botocore/commit/67dcb88843c0957b8bc72d2f0571f96e893f6309"><code>67dcb88</code></a> Update to latest models</li> <li><a href="https://github.com/boto/botocore/commit/55f7dc1773bf8f312f5f71013d9597072f8683bb"><code>55f7dc1</code></a> chore: add additional text to CONTRIBUTING.rst (<a href="https://redirect.github.com/boto/botocore/issues/3662">#3662</a>)</li> <li><a href="https://github.com/boto/botocore/commit/215aec9557e79dd75071ce9adae2f7cf1647a7ac"><code>215aec9</code></a> Merge branch 'release-1.42.87'</li> <li><a href="https://github.com/boto/botocore/commit/f85476974e4da29f3f97a450a1b006b20bf5c5f4"><code>f854769</code></a> Merge branch 'release-1.42.87' into develop</li> <li><a href="https://github.com/boto/botocore/commit/1f2c8202dba82dda6f2404e76cc598d496f67beb"><code>1f2c820</code></a> Bumping version to 1.42.87</li> <li><a href="https://github.com/boto/botocore/commit/c104132be094d910b7c9c3e516c1ed7d2074e994"><code>c104132</code></a> Update to latest models</li> <li><a href="https://github.com/boto/botocore/commit/d831a0618fc491a30135f89f743ed12cc09280af"><code>d831a06</code></a> Merge branch 'release-1.42.86'</li> <li><a href="https://github.com/boto/botocore/commit/98ab06bdb669e50503b98d9ea1091bc3c07279d6"><code>98ab06b</code></a> Merge branch 'release-1.42.86' into develop</li> <li>Additional commits viewable in <a href="https://github.com/boto/botocore/compare/1.42.83...1.42.88">compare view</a></li> </ul> </details> <br /> Updates `greenlet` from 3.3.2 to 3.4.0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/python-greenlet/greenlet/blob/master/CHANGES.rst">greenlet's changelog</a>.</em></p> <blockquote> <h1>3.4.0 (2026-04-08)</h1> <ul> <li> <p>Publish binary wheels for RiscV 64.</p> </li> <li> <p>Fix multiple rare crash paths during interpreter shutdown.</p> <p>Note that this now relies on the <code>atexit</code> module, and introduces subtle API changes during interpreter shutdown (for example, <code>getcurrent</code> is no longer available once the <code>atexit</code> callback fires).</p> <p>See <code>PR [#499](python-greenlet/greenlet#499) <https://github.com/python-greenlet/greenlet/pull/499></code>_ by Nicolas Bouvrette.</p> </li> <li> <p>Address the results of an automated code audit performed by Daniel Diniz. This includes several minor correctness changes that theoretically could have been crashing bugs, but typically only in very rare circumstances.</p> <p>See <code>PR 502 <https://github.com/python-greenlet/greenlet/pull/502></code>_.</p> </li> <li> <p>Fix several race conditions that could arise in free-threaded builds when using greenlet objects from multiple threads, some of which could lead to assertion failures or interpreter crashes.</p> <p>See <code>issue 503 <https://github.com/python-greenlet/greenlet/issues/503></code>_, with thanks to Nitay Dariel and Daniel Diniz.</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python-greenlet/greenlet/commit/df6734edbef6a0e54ecc4ba4735d93ae6d721095"><code>df6734e</code></a> Preparing release 3.4.0</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/0f860756608b767b2ed70f935053b319d1a1b828"><code>0f86075</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/504">#504</a> from python-greenlet/freethreading-fixes</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/459657482f3efaee294edff672bde45ac3fac208"><code>4596574</code></a> TLBC: crash appears to still happen on CI 3.14t ubuntu. Re-enable workaround.</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/2f4a1cf53fa282ab28ea4815164a9cb09b9320ce"><code>2f4a1cf</code></a> Make green_switch (python level greenlet.switch) and green_throw check for (p...</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/a0c2a2a7519985d5fe2c034a54f1a0fed82a5905"><code>a0c2a2a</code></a> Fix unused variable warning when asserts are disabled.</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/8688581392187d68f35180148fcd6fb4fd9a972f"><code>8688581</code></a> gcc was complaining about an incomplete std::atomic type. make sure we includ...</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/449c76045b71f7f96c48e8d62672e5382b17cc3d"><code>449c760</code></a> Make MainGreenlet._thread_state atomic; we use it for cross thread checking a...</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/f840e00dea524c20801bcb4f8764b968590eb6ba"><code>f840e00</code></a> Add critical sections to greenlet attribute accessors.</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/6b281d3eca96ec82a87067b2016241296e4c60e9"><code>6b281d3</code></a> test_contextvars: No need for the fallback case where contextvars isn't avail...</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/f52615ae64f73b19e53e71cd1e12cbb1841246ff"><code>f52615a</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/502">#502</a> from python-greenlet/devdanzin-audit</li> <li>Additional commits viewable in <a href="https://github.com/python-greenlet/greenlet/compare/3.3.2...3.4.0">compare view</a></li> </ul> </details> <br /> Updates `librt` from 0.8.1 to 0.9.0 <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/mypyc/librt/commit/8f66cfe9cb3611b32741dd5b00e9049a627d6ccb"><code>8f66cfe</code></a> Bump version to 0.9.0</li> <li><a href="https://github.com/mypyc/librt/commit/149b3698bc3f6f7724f3fe6148938d6a4bc0d421"><code>149b369</code></a> Sync mypy including extract_symbol() PR (<a href="https://redirect.github.com/mypyc/librt/issues/37">#37</a>)</li> <li><a href="https://github.com/mypyc/librt/commit/05c11113460b73eb8ecc90adf539996012510169"><code>05c1111</code></a> Use PEP 639 license metadata (<a href="https://redirect.github.com/mypyc/librt/issues/34">#34</a>)</li> <li>See full diff in <a href="https://github.com/mypyc/librt/compare/v0.8.1...v0.9.0">compare view</a></li> </ul> </details> <br /> Updates `python-discovery` from 1.2.1 to 1.2.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/tox-dev/python-discovery/releases">python-discovery's releases</a>.</em></p> <blockquote> <h2>1.2.2</h2> <!-- raw HTML omitted --> <h2>What's Changed</h2> <ul> <li>export normalize_isa and deprecate KNOWN_ARCHITECTURES by <a href="https://github.com/rahuldevikar"><code>@rahuldevikar</code></a> in <a href="https://redirect.github.com/tox-dev/python-discovery/pull/62">tox-dev/python-discovery#62</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/tox-dev/python-discovery/compare/1.2.1...1.2.2">https://github.com/tox-dev/python-discovery/compare/1.2.1...1.2.2</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/tox-dev/python-discovery/commit/50d83545a3594ce1a5425d8ec33309bc37552707"><code>50d8354</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/tox-dev/python-discovery/issues/61">#61</a>)</li> <li><a href="https://github.com/tox-dev/python-discovery/commit/52d36ef701a71e5dfda01e829a40f98126d12143"><code>52d36ef</code></a> export normalize_isa and deprecate KNOWN_ARCHITECTURES (<a href="https://redirect.github.com/tox-dev/python-discovery/issues/62">#62</a>)</li> <li><a href="https://github.com/tox-dev/python-discovery/commit/993fced4229a1c0335e820a3e85c2b1f4efb6bbf"><code>993fced</code></a> build(deps): bump astral-sh/setup-uv from 7.6.0 to 8.0.0 (<a href="https://redirect.github.com/tox-dev/python-discovery/issues/60">#60</a>)</li> <li><a href="https://github.com/tox-dev/python-discovery/commit/b7ab5b7edd7ab8bcc9ac77f3603c6fe6538892ab"><code>b7ab5b7</code></a> [pre-commit.ci] pre-commit autoupdate (<a href="https://redirect.github.com/tox-dev/python-discovery/issues/58">#58</a>)</li> <li>See full diff in <a href="https://github.com/tox-dev/python-discovery/compare/1.2.1...1.2.2">compare view</a></li> </ul> </details> <br /> Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore <dependency name> major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself) - `@dependabot ignore <dependency name> minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself) - `@dependabot ignore <dependency name>` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself) - `@dependabot unignore <dependency name>` will remove all of the ignore conditions of the specified dependency - `@dependabot unignore <dependency name> <ignore condition>` will remove the ignore condition of the specified dependency and ignore conditions </details> --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Charles OuGuo <shaldengeki@gmail.com>
WilliamBerryiii
added a commit
to microsoft/physical-ai-toolchain
that referenced
this pull request
Apr 14, 2026
…ry with 23 updates (#463) Bumps the training-dependencies group with 23 updates in the /training/rl directory: | Package | From | To | | --- | --- | --- | | [skrl](https://github.com/Toni-SM/skrl) | `1.4.3` | `2.0.0` | | [tensordict](https://github.com/pytorch/tensordict) | `0.11.0` | `0.12.1` | | [google-auth](https://github.com/googleapis/google-auth-library-python) | `2.49.1` | `2.49.2` | | [greenlet](https://github.com/python-greenlet/greenlet) | `3.3.2` | `3.4.0` | | [msal](https://github.com/AzureAD/microsoft-authentication-library-for-python) | `1.35.1` | `1.36.0` | | [opentelemetry-api](https://github.com/open-telemetry/opentelemetry-python) | `1.40.0` | `1.41.0` | | [opentelemetry-instrumentation](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [opentelemetry-instrumentation-asgi](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [opentelemetry-instrumentation-dbapi](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [opentelemetry-instrumentation-django](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [opentelemetry-instrumentation-fastapi](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [opentelemetry-instrumentation-flask](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [opentelemetry-instrumentation-psycopg2](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [opentelemetry-instrumentation-requests](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [opentelemetry-instrumentation-urllib](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [opentelemetry-instrumentation-urllib3](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [opentelemetry-instrumentation-wsgi](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [opentelemetry-proto](https://github.com/open-telemetry/opentelemetry-python) | `1.40.0` | `1.41.0` | | [opentelemetry-sdk](https://github.com/open-telemetry/opentelemetry-python) | `1.40.0` | `1.41.0` | | [opentelemetry-semantic-conventions](https://github.com/open-telemetry/opentelemetry-python) | `0.61b0` | `0.62b0` | | [opentelemetry-util-http](https://github.com/open-telemetry/opentelemetry-python-contrib) | `0.61b0` | `0.62b0` | | [pydantic](https://github.com/pydantic/pydantic) | `2.12.5` | `2.13.0` | | [pydantic-core](https://github.com/pydantic/pydantic) | `2.45.0` | `2.46.0` | Updates `skrl` from 1.4.3 to 2.0.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/Toni-SM/skrl/releases">skrl's releases</a>.</em></p> <blockquote> <h2>skrl-v2.0.0</h2> <h2>[2.0.0] - 2026-04-08</h2> <p>Summary of the most relevant features:</p> <ul> <li>RL algorithm implementations in NVIDIA Warp</li> <li>Differentiate between environment observations and states (also known as privileged observation)</li> <li>Support for MuJoCo Playground and ManiSkill environments</li> </ul> <h3>Added</h3> <ul> <li>Implement RL algorithms in NVIDIA Warp</li> <li>Add loader and wrapper for MuJoCo Playground environments</li> <li>Add wrapper for ManiSkill environments</li> <li>Add Tabular model instantiator (epsilon-greedy variant)</li> <li>Add <code>clip_mean_actions</code> parameter to Gaussian and Multivariate Gaussian models</li> <li>Add <code>render_interval</code> option to trainers to specify the rendering interval for the environments</li> <li>Add <code>compute_space_limits</code> space utility to get Gymnasium spaces' limits</li> <li>Add <code>ScopedTimer</code> utils to measure code execution time</li> <li>Add <code>SummaryWriter</code> implementation to log data to TensorBoard without relying on third-party libraries</li> <li>Log agent inference and algorithm update, and environment steeping time to TensorBoard</li> </ul> <h3>Changed</h3> <ul> <li>Update minimum supported Python version to 3.10</li> <li>Drop support for PyTorch versions prior to 1.11 (the previous supported version was 1.10)</li> <li>Call observation/state preprocessors once when computing the actions during training</li> </ul> <h3>Changed (breaking changes)</h3> <ul> <li>Refactor the library to differentiate between environment observations and states (also known as privileged observation)</li> <li>Implement agent/multi-agent and trainer configurations using Python Data Classes <ul> <li>Unify the different learning rate settings under the <code>learning_rate</code> configuration</li> <li>Rename <code>lambda</code> to <code>gae_lambda</code></li> <li>Remove the <code>clip_predicted_values</code> redundant configuration by checking for <code>value_clip > 0</code></li> <li>Remove specific exploration noise settings (<code>initial_scale</code>, <code>final_scale</code> and <code>timesteps</code>) in favor of generic scheduling functions</li> </ul> </li> <li>Update tabular model definition to operate in any number of parallel environments</li> <li>Refactor multi-agent environment wrappers to support homogeneous and heterogeneous states spaces</li> </ul> <h3>Fixed</h3> <ul> <li>Add entropy loss to the policy loss for on-policy agents/mulit-agents in JAX</li> <li>Fix time limits handling for termination and truncation signals</li> <li>Fix the randomness of the environments by seeding right after initialization (on the first reset)</li> </ul> <h3>Removed</h3> <ul> <li>Remove NumPy backend for JAX implementation</li> <li>Remove checkpoints/models migration support from other RL libraries</li> <li>Remove support for Isaac Gym and Omniverse Isaac Gym environments (deprecated in favor of Isaac Lab)</li> <li>Remove support for Brax and DeepMind environments (in favor of MuJoCo Playground environments)</li> <li>Remove support for Bi-DexHands and robosuite environments</li> <li>Remove Isaac Gym (web viewer, inverse kinematic) and Omniverse Isaac Gym (local environment instance, inverse kinematic) utils</li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/Toni-SM/skrl/blob/develop/CHANGELOG.md">skrl's changelog</a>.</em></p> <blockquote> <h2>[2.0.0] - 2026-04-08</h2> <p>Summary of the most relevant features:</p> <ul> <li>RL algorithm implementations in NVIDIA Warp</li> <li>Differentiate between environment observations and states (also known as privileged observation)</li> <li>Support for MuJoCo Playground and ManiSkill environments</li> </ul> <h3>Added</h3> <ul> <li>Implement RL algorithms in NVIDIA Warp</li> <li>Add loader and wrapper for MuJoCo Playground environments</li> <li>Add wrapper for ManiSkill environments</li> <li>Add Tabular model instantiator (epsilon-greedy variant)</li> <li>Add <code>clip_mean_actions</code> parameter to Gaussian and Multivariate Gaussian models</li> <li>Add <code>render_interval</code> option to trainers to specify the rendering interval for the environments</li> <li>Add <code>compute_space_limits</code> space utility to get Gymnasium spaces' limits</li> <li>Add <code>ScopedTimer</code> utils to measure code execution time</li> <li>Add <code>SummaryWriter</code> implementation to log data to TensorBoard without relying on third-party libraries</li> <li>Log agent inference and algorithm update, and environment steeping time to TensorBoard</li> </ul> <h3>Changed</h3> <ul> <li>Update minimum supported Python version to 3.10</li> <li>Drop support for PyTorch versions prior to 1.11 (the previous supported version was 1.10)</li> <li>Call observation/state preprocessors once when computing the actions during training</li> </ul> <h3>Changed (breaking changes)</h3> <ul> <li>Refactor the library to differentiate between environment observations and states (also known as privileged observation)</li> <li>Implement agent/multi-agent and trainer configurations using Python Data Classes <ul> <li>Unify the different learning rate settings under the <code>learning_rate</code> configuration</li> <li>Rename <code>lambda</code> to <code>gae_lambda</code></li> <li>Remove the <code>clip_predicted_values</code> redundant configuration by checking for <code>value_clip > 0</code></li> <li>Remove specific exploration noise settings (<code>initial_scale</code>, <code>final_scale</code> and <code>timesteps</code>) in favor of generic scheduling functions</li> </ul> </li> <li>Update tabular model definition to operate in any number of parallel environments</li> <li>Refactor multi-agent environment wrappers to support homogeneous and heterogeneous states spaces</li> </ul> <h3>Fixed</h3> <ul> <li>Add entropy loss to the policy loss for on-policy agents/mulit-agents in JAX</li> <li>Fix time limits handling for termination and truncation signals</li> <li>Fix the randomness of the environments by seeding right after initialization (on the first reset)</li> </ul> <h3>Removed</h3> <ul> <li>Remove NumPy backend for JAX implementation</li> <li>Remove checkpoints/models migration support from other RL libraries</li> <li>Remove support for Isaac Gym and Omniverse Isaac Gym environments (deprecated in favor of Isaac Lab)</li> <li>Remove support for Brax and DeepMind environments (in favor of MuJoCo Playground environments)</li> <li>Remove support for Bi-DexHands and robosuite environments</li> <li>Remove Isaac Gym (web viewer, inverse kinematic) and Omniverse Isaac Gym (local environment instance, inverse kinematic) utils</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/Toni-SM/skrl/commit/c29ced630e83ab32304dc8a3de241a70d3bc5746"><code>c29ced6</code></a> Release 2.0.0</li> <li><a href="https://github.com/Toni-SM/skrl/commit/cb00cb5d64858a9b64c3b0869c233d307289cdb8"><code>cb00cb5</code></a> Update CHANGELOG</li> <li><a href="https://github.com/Toni-SM/skrl/commit/ff6426f497ad4e3ec83d2aa5b16819213607cae1"><code>ff6426f</code></a> Use warp-nn dependency for neural networks in Warp (<a href="https://redirect.github.com/Toni-SM/skrl/issues/422">#422</a>)</li> <li><a href="https://github.com/Toni-SM/skrl/commit/22bb9dbd0bd1e4b946f0d07c94149db7696269b9"><code>22bb9db</code></a> Fix setuptools package discovery (<a href="https://redirect.github.com/Toni-SM/skrl/issues/421">#421</a>)</li> <li><a href="https://github.com/Toni-SM/skrl/commit/d81196df22aa8433f3808baa49a24e303f78deaa"><code>d81196d</code></a> Check for configuration compatibility in runners (<a href="https://redirect.github.com/Toni-SM/skrl/issues/420">#420</a>)</li> <li><a href="https://github.com/Toni-SM/skrl/commit/e1b600ee0e30fc2c43c97df71ba4002a1c091d99"><code>e1b600e</code></a> Rename lambda_ to gae_lambda (<a href="https://redirect.github.com/Toni-SM/skrl/issues/419">#419</a>)</li> <li><a href="https://github.com/Toni-SM/skrl/commit/f6e1f3994b9899764e1c866dad7a65b59af59d42"><code>f6e1f39</code></a> Update Playground loader (<a href="https://redirect.github.com/Toni-SM/skrl/issues/418">#418</a>)</li> <li><a href="https://github.com/Toni-SM/skrl/commit/67bb6624ba1a881353728bfdaae7ab4fc3a1a525"><code>67bb662</code></a> Call step preprocessor once (<a href="https://redirect.github.com/Toni-SM/skrl/issues/403">#403</a>)</li> <li><a href="https://github.com/Toni-SM/skrl/commit/2888004c1187c71d057a0e1d01e668493cfd15aa"><code>2888004</code></a> Update docs (<a href="https://redirect.github.com/Toni-SM/skrl/issues/415">#415</a>)</li> <li><a href="https://github.com/Toni-SM/skrl/commit/5a078cff1a611d51eb2164101cdd6fa84e3eec2d"><code>5a078cf</code></a> Add <code>render_interval</code> option to trainers to specify the rendering interval fo...</li> <li>Additional commits viewable in <a href="https://github.com/Toni-SM/skrl/compare/1.4.3...2.0.0">compare view</a></li> </ul> </details> <br /> Updates `tensordict` from 0.11.0 to 0.12.1 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pytorch/tensordict/releases">tensordict's releases</a>.</em></p> <blockquote> <h2>TensorDict v0.12.1</h2> <p>Patch release with a <code>torch.compile</code> bug fix.</p> <h3>Bug Fixes</h3> <ul> <li>Fix <code>unravel_keys</code> inconsistency that prevented <code>torch.compile</code> from working correctly when called with a single key (<a href="https://redirect.github.com/pytorch/tensordict/issues/1674">#1674</a>)</li> </ul> <h3>Installation</h3> <pre lang="bash"><code>pip install tensordict==0.12.1 </code></pre> <h2>TensorDict v0.12.0</h2> <h3>Highlights</h3> <p>TensorDict v0.12.0 introduces <strong>TypedTensorDict</strong> for schema-enforced tensor dictionaries, a full <strong>distributed collectives</strong> suite (broadcast, all_reduce, all_gather, scatter), <strong>TensorDictStore</strong> with Redis/Dragonfly/KeyDB backends, and major <strong>torch.compile</strong> and <strong>performance</strong> improvements. The <strong>UnbatchedTensor</strong> has been rewritten as a proper tensor subclass, and <strong>state_dict</strong> handling has been overhauled for consistency.</p> <h3>Breaking Changes</h3> <ul> <li><code>UnbatchedTensor</code> is now a <code>__torch_dispatch__</code>-based tensor subclass (was previously a wrapper) (<a href="https://redirect.github.com/pytorch/tensordict/issues/1638">#1638</a>, <a href="https://redirect.github.com/pytorch/tensordict/issues/1648">#1648</a>)</li> <li><code>state_dict</code> is now flat by default, with auto-detection in <code>load_state_dict</code> for backwards compatibility</li> <li>TensorClass <code>state_dict</code> now uses logical keys</li> </ul> <h3>Features</h3> <ul> <li><strong>TypedTensorDict</strong>: Schema-enforced TensorDicts with type annotations, cross-class compatibility, and <code>torch.compile</code> support (<a href="https://redirect.github.com/pytorch/tensordict/issues/1657">#1657</a>, <a href="https://redirect.github.com/pytorch/tensordict/issues/1659">#1659</a>, <a href="https://redirect.github.com/pytorch/tensordict/issues/1660">#1660</a>, <a href="https://redirect.github.com/pytorch/tensordict/issues/1662">#1662</a>, <a href="https://redirect.github.com/pytorch/tensordict/issues/1663">#1663</a>)</li> <li><strong>TensorDictStore</strong>: Redis/Dragonfly/KeyDB-backed TensorDict with TensorClass support, lazy stack storage, and optimized indexed ops</li> <li><strong>Distributed collectives</strong>: <code>broadcast</code>, <code>all_reduce</code>, <code>all_gather</code>, <code>scatter</code>, consolidated <code>send</code>/<code>recv</code> and <code>init_remote</code>/<code>from_remote_init</code> with UCXX transport support (<a href="https://redirect.github.com/pytorch/tensordict/issues/1611">#1611</a>)</li> <li><strong><code>set_printoptions</code></strong>: Configurable TensorDict repr with verbose mode (<a href="https://redirect.github.com/pytorch/tensordict/issues/1654">#1654</a>, <a href="https://redirect.github.com/pytorch/tensordict/issues/1655">#1655</a>, <a href="https://redirect.github.com/pytorch/tensordict/issues/1665">#1665</a>)</li> <li><strong><code>torch.func</code> support</strong>: <code>jacrev</code>, <code>jacfwd</code>, and <code>hessian</code> now work with TensorDict (<a href="https://redirect.github.com/pytorch/tensordict/issues/1613">#1613</a>)</li> <li><strong><code>vmap</code> with unbatched data</strong>: TensorDicts containing unbatched tensors can now be vmapped (<a href="https://redirect.github.com/pytorch/tensordict/issues/1625">#1625</a>)</li> <li><code>TensorClass.select(as_tensordict=...)</code> parameter (<a href="https://redirect.github.com/pytorch/tensordict/issues/1544">#1544</a>)</li> <li><code>TensorDictBase.is_non_tensor(key)</code> for consistent non-tensor key detection</li> </ul> <h3>Bug Fixes</h3> <ul> <li>Fix <code>HigherOrderOperator</code> support in <code>__torch_function__</code> (<a href="https://redirect.github.com/pytorch/tensordict/issues/1668">#1668</a>)</li> <li>Fix <code>td[key] = []</code> handling (<a href="https://redirect.github.com/pytorch/tensordict/issues/1666">#1666</a>)</li> <li>Fix <code>UnbatchedTensor.tolist()</code> (<a href="https://redirect.github.com/pytorch/tensordict/issues/1664">#1664</a>)</li> <li>Fix <code>UnbatchedTensor</code> CUDA pickling for multiprocessing (<a href="https://redirect.github.com/pytorch/tensordict/issues/1656">#1656</a>)</li> <li>Fix <code>UnbatchedTensor</code> indexing without batch dim, GPU failures, getitem/stack (<a href="https://redirect.github.com/pytorch/tensordict/issues/1607">#1607</a>, <a href="https://redirect.github.com/pytorch/tensordict/issues/1626">#1626</a>, <a href="https://redirect.github.com/pytorch/tensordict/issues/1633">#1633</a>)</li> <li>Fix <code>replace()</code> recompiles under <code>torch.compile</code> (<a href="https://redirect.github.com/pytorch/tensordict/issues/1605">#1605</a>)</li> <li>Fix <code>auto_batch_size</code> regression with <code>NonTensorStack</code> (<a href="https://redirect.github.com/pytorch/tensordict/issues/1609">#1609</a>)</li> <li>Fix <code>NonTensorData</code> positional args causing graph breaks under <code>torch.compile</code> (<a href="https://redirect.github.com/pytorch/tensordict/issues/1630">#1630</a>)</li> <li>Fix <code>state_dict</code> error messages, params forwarding, detach</li> <li>Pin <code>pybind11>=2.13</code> for Python 3.13 compatibility</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pytorch/tensordict/commit/4d413dd6764dda94f047d245d4c04c32f0ad2228"><code>4d413dd</code></a> [Release] Bump version to 0.12.1</li> <li><a href="https://github.com/pytorch/tensordict/commit/2a7c2ee9076d34d50c75a34ec06b9175b77457e1"><code>2a7c2ee</code></a> [BugFix] <code>unravel_keys</code> inconsistency bug preventing torch.compile (<a href="https://redirect.github.com/pytorch/tensordict/issues/1674">#1674</a>)</li> <li><a href="https://github.com/pytorch/tensordict/commit/bb8825ea4f4a69c3124e24c4a439ca126c2ab162"><code>bb8825e</code></a> [CI] Also disable ROCm wheel builds (tensordict is CPU-only)</li> <li><a href="https://github.com/pytorch/tensordict/commit/015507ba044c8008822b665931da2ba0207f838b"><code>015507b</code></a> [CI] Disable CUDA wheel builds (tensordict is CPU-only) (<a href="https://redirect.github.com/pytorch/tensordict/issues/1672">#1672</a>)</li> <li><a href="https://github.com/pytorch/tensordict/commit/3f84f8d08c3f9780f67912f2a020325d4df91b96"><code>3f84f8d</code></a> [CI] Fix wheel builds (<a href="https://redirect.github.com/pytorch/tensordict/issues/1671">#1671</a>)</li> <li><a href="https://github.com/pytorch/tensordict/commit/b0ebe667e3b86214ed7a3f6662cc19b3bd4405ba"><code>b0ebe66</code></a> [Release] Bump version to 0.12.0 (<a href="https://redirect.github.com/pytorch/tensordict/issues/1670">#1670</a>)</li> <li><a href="https://github.com/pytorch/tensordict/commit/31b5ef5532f945ef10fdd236c03556c6d2951fbf"><code>31b5ef5</code></a> [BugFix] Support HigherOrderOperator in <strong>torch_function</strong> (<a href="https://redirect.github.com/pytorch/tensordict/issues/1668">#1668</a>)</li> <li><a href="https://github.com/pytorch/tensordict/commit/962bf40b756742f0e1f0eb995085ee570c26f5df"><code>962bf40</code></a> [BugFix] Handle <code>td[key] = []</code> properly (<a href="https://redirect.github.com/pytorch/tensordict/issues/1666">#1666</a>)</li> <li><a href="https://github.com/pytorch/tensordict/commit/fb51ac71ea713340eba5a9c5619fd936fbc412e7"><code>fb51ac7</code></a> [Feature] set_printoptions(verbose=False) (<a href="https://redirect.github.com/pytorch/tensordict/issues/1665">#1665</a>)</li> <li><a href="https://github.com/pytorch/tensordict/commit/32d9fb65c37e50999afc4e6f1054e0a80285b995"><code>32d9fb6</code></a> [BugFix] Fix UnbatchedTensor.tolist() (<a href="https://redirect.github.com/pytorch/tensordict/issues/1664">#1664</a>)</li> <li>Additional commits viewable in <a href="https://github.com/pytorch/tensordict/compare/v0.11.0...v0.12.1">compare view</a></li> </ul> </details> <br /> Updates `google-auth` from 2.49.1 to 2.49.2 <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/googleapis/google-auth-library-python/commits">compare view</a></li> </ul> </details> <br /> Updates `greenlet` from 3.3.2 to 3.4.0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/python-greenlet/greenlet/blob/master/CHANGES.rst">greenlet's changelog</a>.</em></p> <blockquote> <h1>3.4.0 (2026-04-08)</h1> <ul> <li> <p>Publish binary wheels for RiscV 64.</p> </li> <li> <p>Fix multiple rare crash paths during interpreter shutdown.</p> <p>Note that this now relies on the <code>atexit</code> module, and introduces subtle API changes during interpreter shutdown (for example, <code>getcurrent</code> is no longer available once the <code>atexit</code> callback fires).</p> <p>See <code>PR [#499](https://github.com/python-greenlet/greenlet/issues/499) <https://github.com/python-greenlet/greenlet/pull/499></code>_ by Nicolas Bouvrette.</p> </li> <li> <p>Address the results of an automated code audit performed by Daniel Diniz. This includes several minor correctness changes that theoretically could have been crashing bugs, but typically only in very rare circumstances.</p> <p>See <code>PR 502 <https://github.com/python-greenlet/greenlet/pull/502></code>_.</p> </li> <li> <p>Fix several race conditions that could arise in free-threaded builds when using greenlet objects from multiple threads, some of which could lead to assertion failures or interpreter crashes.</p> <p>See <code>issue 503 <https://github.com/python-greenlet/greenlet/issues/503></code>_, with thanks to Nitay Dariel and Daniel Diniz.</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python-greenlet/greenlet/commit/df6734edbef6a0e54ecc4ba4735d93ae6d721095"><code>df6734e</code></a> Preparing release 3.4.0</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/0f860756608b767b2ed70f935053b319d1a1b828"><code>0f86075</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/504">#504</a> from python-greenlet/freethreading-fixes</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/459657482f3efaee294edff672bde45ac3fac208"><code>4596574</code></a> TLBC: crash appears to still happen on CI 3.14t ubuntu. Re-enable workaround.</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/2f4a1cf53fa282ab28ea4815164a9cb09b9320ce"><code>2f4a1cf</code></a> Make green_switch (python level greenlet.switch) and green_throw check for (p...</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/a0c2a2a7519985d5fe2c034a54f1a0fed82a5905"><code>a0c2a2a</code></a> Fix unused variable warning when asserts are disabled.</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/8688581392187d68f35180148fcd6fb4fd9a972f"><code>8688581</code></a> gcc was complaining about an incomplete std::atomic type. make sure we includ...</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/449c76045b71f7f96c48e8d62672e5382b17cc3d"><code>449c760</code></a> Make MainGreenlet._thread_state atomic; we use it for cross thread checking a...</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/f840e00dea524c20801bcb4f8764b968590eb6ba"><code>f840e00</code></a> Add critical sections to greenlet attribute accessors.</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/6b281d3eca96ec82a87067b2016241296e4c60e9"><code>6b281d3</code></a> test_contextvars: No need for the fallback case where contextvars isn't avail...</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/f52615ae64f73b19e53e71cd1e12cbb1841246ff"><code>f52615a</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/502">#502</a> from python-greenlet/devdanzin-audit</li> <li>Additional commits viewable in <a href="https://github.com/python-greenlet/greenlet/compare/3.3.2...3.4.0">compare view</a></li> </ul> </details> <br /> Updates `msal` from 1.35.1 to 1.36.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/AzureAD/microsoft-authentication-library-for-python/releases">msal's releases</a>.</em></p> <blockquote> <h2>1.36.0</h2> <h2>What's Changed</h2> <ul> <li>Fix the PoP flow in the console app by <a href="https://github.com/PetarSDimov"><code>@PetarSDimov</code></a> in <a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/pull/887">AzureAD/microsoft-authentication-library-for-python#887</a></li> <li>Add ADO CI, SDL, and release pipelines with e2e test enablement by <a href="https://github.com/RyAuld"><code>@RyAuld</code></a> in <a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/pull/890">AzureAD/microsoft-authentication-library-for-python#890</a></li> <li>Add documentation for Managed Identity v2 Hackathon by <a href="https://github.com/gladjohn"><code>@gladjohn</code></a> in <a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/pull/885">AzureAD/microsoft-authentication-library-for-python#885</a></li> <li>Potential fix for code scanning alert no. 74: Workflow does not contain permissions by <a href="https://github.com/Avery-Dunn"><code>@Avery-Dunn</code></a> in <a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/pull/884">AzureAD/microsoft-authentication-library-for-python#884</a></li> <li>Added withFmi method for cca app by <a href="https://github.com/4gust"><code>@4gust</code></a> in <a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/pull/876">AzureAD/microsoft-authentication-library-for-python#876</a></li> <li>Use cryptographically secure randomness for PKCE, state, and nonce generation by <a href="https://github.com/ashok672"><code>@ashok672</code></a> in <a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/pull/894">AzureAD/microsoft-authentication-library-for-python#894</a></li> <li>Fix OIDC issuer domain spoofing in B2C host validation by <a href="https://github.com/4gust"><code>@4gust</code></a> in <a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/pull/896">AzureAD/microsoft-authentication-library-for-python#896</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/PetarSDimov"><code>@PetarSDimov</code></a> made their first contribution in <a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/pull/887">AzureAD/microsoft-authentication-library-for-python#887</a></li> <li><a href="https://github.com/gladjohn"><code>@gladjohn</code></a> made their first contribution in <a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/pull/885">AzureAD/microsoft-authentication-library-for-python#885</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/AzureAD/microsoft-authentication-library-for-python/compare/1.35.1...1.36.0">https://github.com/AzureAD/microsoft-authentication-library-for-python/compare/1.35.1...1.36.0</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/AzureAD/microsoft-authentication-library-for-python/commit/4a2cb98928a48ff3d9aee8fbd395dad03c510e48"><code>4a2cb98</code></a> Update sku.py</li> <li><a href="https://github.com/AzureAD/microsoft-authentication-library-for-python/commit/a3ba722660e838f58659f8f501a2624044266247"><code>a3ba722</code></a> Fix OIDC issuer domain spoofing in B2C host validation (<a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/issues/896">#896</a>)</li> <li><a href="https://github.com/AzureAD/microsoft-authentication-library-for-python/commit/6a92f2498d221c673d6e725e7f99d958bd189c5a"><code>6a92f24</code></a> Use cryptographically secure randomness for PKCE, state, and nonce generation...</li> <li><a href="https://github.com/AzureAD/microsoft-authentication-library-for-python/commit/ecf515a542feb3bcdfa34ed69144c793ed3be4b6"><code>ecf515a</code></a> Added withFmi method for cca app (<a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/issues/876">#876</a>)</li> <li><a href="https://github.com/AzureAD/microsoft-authentication-library-for-python/commit/eb7806838f0bc13f2f38fd1bf62a1f8991bbe197"><code>eb78068</code></a> Potential fix for code scanning alert no. 74: Workflow does not contain permi...</li> <li><a href="https://github.com/AzureAD/microsoft-authentication-library-for-python/commit/6de712edbf3310aa4af163a51ac8b9eeb9dbe65c"><code>6de712e</code></a> Add documentation for Managed Identity v2 Hackathon (<a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/issues/885">#885</a>)</li> <li><a href="https://github.com/AzureAD/microsoft-authentication-library-for-python/commit/1f71ede35133ed2a2fa707928e60de6d4f067566"><code>1f71ede</code></a> Add ADO CI, SDL, and release pipelines with e2e test enablement (<a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/issues/890">#890</a>)</li> <li><a href="https://github.com/AzureAD/microsoft-authentication-library-for-python/commit/e4e692c5acaa798bd3f24f8178b042fd9a98ab0d"><code>e4e692c</code></a> Fix the PoP flow in the console app (<a href="https://redirect.github.com/AzureAD/microsoft-authentication-library-for-python/issues/887">#887</a>)</li> <li>See full diff in <a href="https://github.com/AzureAD/microsoft-authentication-library-for-python/compare/1.35.1...1.36.0">compare view</a></li> </ul> </details> <br /> Updates `opentelemetry-api` from 1.40.0 to 1.41.0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-python/blob/main/CHANGELOG.md">opentelemetry-api's changelog</a>.</em></p> <blockquote> <h2>Version 1.41.0/0.62b0 (2026-04-09)</h2> <ul> <li><code>opentelemetry-sdk</code>: Add <code>host</code> resource detector support to declarative file configuration via <code>detection_development.detectors[].host</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5002">#5002</a>)</li> <li><code>opentelemetry-sdk</code>: Add <code>container</code> resource detector support to declarative file configuration via <code>detection_development.detectors[].container</code>, using entry point loading of the <code>opentelemetry-resource-detector-containerid</code> contrib package (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5004">#5004</a>)</li> <li><code>opentelemetry-sdk</code>: Add <code>create_tracer_provider</code>/<code>configure_tracer_provider</code> to declarative file configuration, enabling TracerProvider instantiation from config files without reading env vars (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4985">#4985</a>)</li> <li>Enabled the flake8-tidy-import plugins rules for the ruff linter. These rules throw warnings for relative imports in the modules. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5019">#5019</a>)</li> <li><code>opentelemetry-sdk</code>: Fix <code>AttributeError</code> in <code>ExplicitBucketHistogramAggregation</code> when applied to non-Histogram instruments without explicit boundaries (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5034">#5034</a>)</li> <li>Fix <code>BatchLogRecordProcessor</code> default <code>schedule_delay_millis</code> from 5000ms to 1000ms to comply with the OTel specification. Note: logs may be exported 5x more frequently by default (e.g. for users who don't explicitly set the <code>OTEL_BLRP_SCHEDULE_DELAY</code> env var). (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4998">#4998</a>)</li> <li><code>opentelemetry-sdk</code>: Add <code>process</code> resource detector support to declarative file configuration via <code>detection_development.detectors[].process</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5001">#5001</a>)</li> <li><code>opentelemetry-sdk</code>: Add shared <code>_parse_headers</code> helper for declarative config OTLP exporters (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5021">#5021</a>)</li> <li><code>opentelemetry-api</code>: Replace a broad exception in attribute cleaning tests to satisfy pylint in the <code>lint-opentelemetry-api</code> CI job</li> <li><code>opentelemetry-sdk</code>: Add <code>create_meter_provider</code>/<code>configure_meter_provider</code> to declarative file configuration, enabling MeterProvider instantiation from config files without reading env vars (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4987">#4987</a>)</li> <li><code>opentelemetry-sdk</code>: Add <code>create_resource</code> and <code>create_propagator</code>/<code>configure_propagator</code> to declarative file configuration, enabling Resource and propagator instantiation from config files without reading env vars (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4979">#4979</a>)</li> <li><code>opentelemetry-sdk</code>: Map Python <code>CRITICAL</code> log level to OTel <code>FATAL</code> severity text per the specification (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/4984">#4984</a>)</li> <li><code>opentelemetry-sdk</code>: Add file configuration support with YAML/JSON loading, environment variable substitution, and schema validation against the vendored OTel config JSON schema (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4898">#4898</a>)</li> <li>Fix intermittent CI failures in <code>getting-started</code> and <code>tracecontext</code> jobs caused by GitHub git CDN SHA propagation lag by installing contrib packages from the already-checked-out local copy instead of a second git clone (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4958">#4958</a>)</li> <li><code>opentelemetry-sdk</code>: fix type annotations on <code>MetricReader</code> and related types (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4938/">#4938</a>)</li> <li><code>opentelemetry-sdk</code>: implement log creation metric (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4935">#4935</a>)</li> <li><code>opentelemetry-sdk</code>: implement metric reader metrics (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4970">#4970</a>)</li> <li><code>opentelemetry-sdk</code>: implement processor metrics (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5012">#5012</a>)</li> <li><code>opentelemetry-sdk</code>: upgrade vendored OTel configuration schema from v1.0.0-rc.3 to v1.0.0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4965">#4965</a>)</li> <li>improve check-links ci job (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4978">#4978</a>)</li> <li>Resolve some Pyright type errors in Span/ReadableSpan and utility stubs (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4973">#4973</a>)</li> <li><code>opentelemetry-exporter-prometheus</code>: Fix metric name prefix (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4895">#4895</a>)</li> <li><code>opentelemetry-api</code>, <code>opentelemetry-sdk</code>: Add deepcopy support for <code>BoundedAttributes</code> and <code>BoundedList</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4934">#4934</a>)</li> <li><code>opentelemetry-proto-json</code>, <code>opentelemetry-codegen-json</code>: Implement custom protoc plugin to generate OTLP JSON class definitions (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4910">#4910</a>)</li> <li>Add configurable <code>max_export_batch_size</code> to OTLP HTTP metrics exporter</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/1a178fcc5c689516849ced80fb2533fe7db7a80f"><code>1a178fc</code></a> [release/v1.41.x-0.62bx] Prepare release 1.41.0/0.62b0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5064">#5064</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/37dea4bbdb1a3c83b96fc22c2f68a848b4989fb5"><code>37dea4b</code></a> feat: add experimental logger configurator (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/4980">#4980</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/7c860ca40eb87c15fb608ce3598cfec4a5da2d1c"><code>7c860ca</code></a> misc: update version for codegen-json and proto-json packages (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5061">#5061</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/b3d98b392fd1fa1a501e11ce8e126f2003edb895"><code>b3d98b3</code></a> [chore]: update readme (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5060">#5060</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/dbbd1bca26f12d0cefff721a857d08a82476f434"><code>dbbd1bc</code></a> feat(config): Add MeterProvider support for declarative config (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/4987">#4987</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/6faa58c58782313283a87a7c61fbbdd9cd2054d6"><code>6faa58c</code></a> feat(config): add host resource detector support for declarative config (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5002">#5002</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/c0cbfbd62fa59e2c41cd2c88371dc6478fa95716"><code>c0cbfbd</code></a> feat(config): wire container resource detector via entry point loading (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5004">#5004</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/f764e45f52952f5a0287e5a6c094cbfd56accd2b"><code>f764e45</code></a> feat(config): Add TracerProvider support for declarative config (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/4985">#4985</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/e3017323f147fd14a64fa8bb070271026182208a"><code>e301732</code></a> Add MikeGoldsmith to approvers (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5038">#5038</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/8783a5831d54d9224edd930e5106225fc0f97c1b"><code>8783a58</code></a> introduce <code>alls-green</code> action for required checks (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/4988">#4988</a>)</li> <li>Additional commits viewable in <a href="https://github.com/open-telemetry/opentelemetry-python/compare/v1.40.0...v1.41.0">compare view</a></li> </ul> </details> <br /> Updates `opentelemetry-instrumentation` from 0.61b0 to 0.62b0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-python-contrib/releases">opentelemetry-instrumentation's releases</a>.</em></p> <blockquote> <h2>opentelemetry-instrumentation-openai-v2 2.3b0</h2> <ul> <li>Fix <code>AttributeError</code> when handling <code>LegacyAPIResponse</code> (from <code>with_raw_response</code>) (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4017">#4017</a>)</li> <li>Add support for chat completions choice count and stop sequences span attributes (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4028">#4028</a>)</li> <li>Fix crash with streaming <code>with_raw_response</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4033">#4033</a>)</li> <li>Bump to 1.30.0 semconv schema: <code>gen_ai.request.seed</code> instead of <code>gen_ai.openai.request.seed</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4036">#4036</a>)</li> </ul> <h2>opentelemetry-instrumentation-openai-v2 2.2b0</h2> <ul> <li>Fix service tier attribute names: use <code>GEN_AI_OPENAI_REQUEST_SERVICE_TIER</code> for request attributes and <code>GEN_AI_OPENAI_RESPONSE_SERVICE_TIER</code> for response attributes. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/issues/3920">#3920</a>)</li> <li>Added support for OpenAI embeddings instrumentation (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/3461">#3461</a>)</li> <li>Record prompt and completion events regardless of span sampling decision. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/3226">#3226</a>)</li> <li>Filter out attributes with the value of NotGiven instances (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/3760">#3760</a>)</li> <li>Migrate off the deprecated events API to use the logs API (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/3628">#3625</a>)</li> </ul> <h2>opentelemetry-instrumentation-openai-agents-v2 0.1.0</h2> <ul> <li>Initial barebones package skeleton: minimal instrumentor stub, version module, and packaging metadata/entry point. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/3805">#3805</a>)</li> <li>Implement OpenAI Agents span processing aligned with GenAI semantic conventions. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/3817">#3817</a>)</li> <li>Input and output according to GenAI spec. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/3824">#3824</a>)</li> </ul> <h2>opentelemetry-instrumentation-openai-v2 2.1b0</h2> <ul> <li>Coerce openai response_format to semconv format (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/3073">#3073</a>)</li> <li>Add example to <code>opentelemetry-instrumentation-openai-v2</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/3006">#3006</a>)</li> <li>Support for <code>AsyncOpenAI/AsyncCompletions</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/2984">#2984</a>)</li> <li>Add metrics (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/3180">#3180</a>)</li> </ul> <h2>opentelemetry-instrumentation-openai-v2 2.0b0</h2> <ul> <li> <p>Use generic <code>OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT</code> environment variable to control if content of prompt, completion, and other messages is captured. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/2947">#2947</a>)</p> </li> <li> <p>Update OpenAI instrumentation to Semantic Conventions v1.28.0: add new attributes and switch prompts and completions to log-based events. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/2925">#2925</a>)</p> </li> <li> <p>Initial OpenAI instrumentation (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/2759">#2759</a>)</p> </li> </ul> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/CHANGELOG.md">opentelemetry-instrumentation's changelog</a>.</em></p> <blockquote> <h2>Version 1.41.0/0.62b0 (2026-04-09)</h2> <h3>Added</h3> <ul> <li><code>opentelemetry-instrumentation-asgi</code>: Respect <code>suppress_http_instrumentation</code> context in ASGI middleware to skip server span creation when HTTP instrumentation is suppressed (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4375">#4375</a>)</li> <li><code>opentelemetry-instrumentation-confluent-kafka</code>: Loosen confluent-kafka upper bound to <3.0.0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4289">#4289</a>)</li> <li><code>opentelemetry-instrumentation</code>: Add support for wrapt 2.x (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4203">#4203</a>)</li> <li><code>opentelemetry-instrumentation-psycopg2</code>: Add parameter <code>capture_parameters</code> to instrumentor. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4212">#4212</a>)</li> <li><code>opentelemetry-instrumentation-botocore</code>: Add support for instrumenting <code>aiobotocore</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4049">#4049</a>)</li> <li><code>opentelemetry-instrumentation-sqlalchemy</code>: implement new semantic convention opt-in migration (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4110">#4110</a>)</li> </ul> <h3>Fixed</h3> <ul> <li><code>opentelemetry-docker-tests</code>: Replace deprecated <code>SpanAttributes</code> from <code>opentelemetry.semconv.trace</code> with <code>opentelemetry.semconv._incubating.attributes</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4339">#4339</a>)</li> <li><code>opentelemetry-instrumentation-confluent-kafka</code>: Skip <code>recv</code> span creation when <code>poll()</code> returns no message or <code>consume()</code> returns an empty list, avoiding empty spans on idle polls (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4349">#4349</a>)</li> <li>Fix intermittent <code>Core Contrib Test</code> CI failures caused by GitHub git CDN SHA propagation lag by installing core packages from the already-checked-out local copy instead of a second git clone (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4305">#4305</a>)</li> <li>Don't import module in unwrap if not already imported (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4321">#4321</a>)</li> <li><code>opentelemetry-instrumentation-logging</code>: Map Python <code>CRITICAL</code> log level to OTel <code>FATAL</code> severity text and <code>WARNING</code> to <code>WARN</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4365">#4365</a>)</li> <li><code>opentelemetry-instrumentation-logging</code>: Add recursion guard in LoggingHandler.emit to prevent deadlock (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4302">#4302</a>)</li> <li><code>opentelemetry-instrumentation-grpc</code>: Fix bidirectional streaming RPCs raising <code>AttributeError: 'generator' object has no attribute 'add_done_callback'</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4259">#4259</a>)</li> <li><code>opentelemetry-instrumentation-aiokafka</code>: fix <code>Unclosed AIOKafkaProducer</code> warning and <code>RuntimeWarning: coroutine was never awaited</code> in tests (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4384">#4384</a>)</li> <li><code>opentelemetry-instrumentation-aiokafka</code>: Fix compatibility with aiokafka 0.13 by calling <code>_key_serializer</code>/<code>_value_serializer</code> directly instead of the internal <code>_serialize</code> method whose signature changed in 0.13 from <code>(topic, key, value)</code> to <code>(key, value, headers)</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4379">#4379</a>)</li> </ul> <h3>Breaking changes</h3> <ul> <li><code>opentelemetry-instrumentation-boto</code>: Remove instrumentation (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4303">#4303</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/open-telemetry/opentelemetry-python-contrib/commits">compare view</a></li> </ul> </details> <br /> Updates `opentelemetry-instrumentation-asgi` from 0.61b0 to 0.62b0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/CHANGELOG.md">opentelemetry-instrumentation-asgi's changelog</a>.</em></p> <blockquote> <h2>Version 1.41.0/0.62b0 (2026-04-09)</h2> <h3>Added</h3> <ul> <li><code>opentelemetry-instrumentation-asgi</code>: Respect <code>suppress_http_instrumentation</code> context in ASGI middleware to skip server span creation when HTTP instrumentation is suppressed (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4375">#4375</a>)</li> <li><code>opentelemetry-instrumentation-confluent-kafka</code>: Loosen confluent-kafka upper bound to <3.0.0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4289">#4289</a>)</li> <li><code>opentelemetry-instrumentation</code>: Add support for wrapt 2.x (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4203">#4203</a>)</li> <li><code>opentelemetry-instrumentation-psycopg2</code>: Add parameter <code>capture_parameters</code> to instrumentor. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4212">#4212</a>)</li> <li><code>opentelemetry-instrumentation-botocore</code>: Add support for instrumenting <code>aiobotocore</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4049">#4049</a>)</li> <li><code>opentelemetry-instrumentation-sqlalchemy</code>: implement new semantic convention opt-in migration (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4110">#4110</a>)</li> </ul> <h3>Fixed</h3> <ul> <li><code>opentelemetry-docker-tests</code>: Replace deprecated <code>SpanAttributes</code> from <code>opentelemetry.semconv.trace</code> with <code>opentelemetry.semconv._incubating.attributes</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4339">#4339</a>)</li> <li><code>opentelemetry-instrumentation-confluent-kafka</code>: Skip <code>recv</code> span creation when <code>poll()</code> returns no message or <code>consume()</code> returns an empty list, avoiding empty spans on idle polls (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4349">#4349</a>)</li> <li>Fix intermittent <code>Core Contrib Test</code> CI failures caused by GitHub git CDN SHA propagation lag by installing core packages from the already-checked-out local copy instead of a second git clone (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4305">#4305</a>)</li> <li>Don't import module in unwrap if not already imported (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4321">#4321</a>)</li> <li><code>opentelemetry-instrumentation-logging</code>: Map Python <code>CRITICAL</code> log level to OTel <code>FATAL</code> severity text and <code>WARNING</code> to <code>WARN</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4365">#4365</a>)</li> <li><code>opentelemetry-instrumentation-logging</code>: Add recursion guard in LoggingHandler.emit to prevent deadlock (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4302">#4302</a>)</li> <li><code>opentelemetry-instrumentation-grpc</code>: Fix bidirectional streaming RPCs raising <code>AttributeError: 'generator' object has no attribute 'add_done_callback'</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4259">#4259</a>)</li> <li><code>opentelemetry-instrumentation-aiokafka</code>: fix <code>Unclosed AIOKafkaProducer</code> warning and <code>RuntimeWarning: coroutine was never awaited</code> in tests (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4384">#4384</a>)</li> <li><code>opentelemetry-instrumentation-aiokafka</code>: Fix compatibility with aiokafka 0.13 by calling <code>_key_serializer</code>/<code>_value_serializer</code> directly instead of the internal <code>_serialize</code> method whose signature changed in 0.13 from <code>(topic, key, value)</code> to <code>(key, value, headers)</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4379">#4379</a>)</li> </ul> <h3>Breaking changes</h3> <ul> <li><code>opentelemetry-instrumentation-boto</code>: Remove instrumentation (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4303">#4303</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/open-telemetry/opentelemetry-python-contrib/commits">compare view</a></li> </ul> </details> <br /> Updates `opentelemetry-instrumentation-dbapi` from 0.61b0 to 0.62b0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/CHANGELOG.md">opentelemetry-instrumentation-dbapi's changelog</a>.</em></p> <blockquote> <h2>Version 1.41.0/0.62b0 (2026-04-09)</h2> <h3>Added</h3> <ul> <li><code>opentelemetry-instrumentation-asgi</code>: Respect <code>suppress_http_instrumentation</code> context in ASGI middleware to skip server span creation when HTTP instrumentation is suppressed (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4375">#4375</a>)</li> <li><code>opentelemetry-instrumentation-confluent-kafka</code>: Loosen confluent-kafka upper bound to <3.0.0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4289">#4289</a>)</li> <li><code>opentelemetry-instrumentation</code>: Add support for wrapt 2.x (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4203">#4203</a>)</li> <li><code>opentelemetry-instrumentation-psycopg2</code>: Add parameter <code>capture_parameters</code> to instrumentor. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4212">#4212</a>)</li> <li><code>opentelemetry-instrumentation-botocore</code>: Add support for instrumenting <code>aiobotocore</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4049">#4049</a>)</li> <li><code>opentelemetry-instrumentation-sqlalchemy</code>: implement new semantic convention opt-in migration (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4110">#4110</a>)</li> </ul> <h3>Fixed</h3> <ul> <li><code>opentelemetry-docker-tests</code>: Replace deprecated <code>SpanAttributes</code> from <code>opentelemetry.semconv.trace</code> with <code>opentelemetry.semconv._incubating.attributes</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4339">#4339</a>)</li> <li><code>opentelemetry-instrumentation-confluent-kafka</code>: Skip <code>recv</code> span creation when <code>poll()</code> returns no message or <code>consume()</code> returns an empty list, avoiding empty spans on idle polls (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4349">#4349</a>)</li> <li>Fix intermittent <code>Core Contrib Test</code> CI failures caused by GitHub git CDN SHA propagation lag by installing core packages from the already-checked-out local copy instead of a second git clone (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4305">#4305</a>)</li> <li>Don't import module in unwrap if not already imported (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4321">#4321</a>)</li> <li><code>opentelemetry-instrumentation-logging</code>: Map Python <code>CRITICAL</code> log level to OTel <code>FATAL</code> severity text and <code>WARNING</code> to <code>WARN</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4365">#4365</a>)</li> <li><code>opentelemetry-instrumentation-logging</code>: Add recursion guard in LoggingHandler.emit to prevent deadlock (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4302">#4302</a>)</li> <li><code>opentelemetry-instrumentation-grpc</code>: Fix bidirectional streaming RPCs raising <code>AttributeError: 'generator' object has no attribute 'add_done_callback'</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4259">#4259</a>)</li> <li><code>opentelemetry-instrumentation-aiokafka</code>: fix <code>Unclosed AIOKafkaProducer</code> warning and <code>RuntimeWarning: coroutine was never awaited</code> in tests (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4384">#4384</a>)</li> <li><code>opentelemetry-instrumentation-aiokafka</code>: Fix compatibility with aiokafka 0.13 by calling <code>_key_serializer</code>/<code>_value_serializer</code> directly instead of the internal <code>_serialize</code> method whose signature changed in 0.13 from <code>(topic, key, value)</code> to <code>(key, value, headers)</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4379">#4379</a>)</li> </ul> <h3>Breaking changes</h3> <ul> <li><code>opentelemetry-instrumentation-boto</code>: Remove instrumentation (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4303">#4303</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/open-telemetry/opentelemetry-python-contrib/commits">compare view</a></li> </ul> </details> <br /> Updates `opentelemetry-instrumentation-django` from 0.61b0 to 0.62b0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/CHANGELOG.md">opentelemetry-instrumentation-django's changelog</a>.</em></p> <blockquote> <h2>Version 1.41.0/0.62b0 (2026-04-09)</h2> <h3>Added</h3> <ul> <li><code>opentelemetry-instrumentation-asgi</code>: Respect <code>suppress_http_instrumentation</code> context in ASGI middleware to skip server span creation when HTTP instrumentation is suppressed (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4375">#4375</a>)</li> <li><code>opentelemetry-instrumentation-confluent-kafka</code>: Loosen confluent-kafka upper bound to <3.0.0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4289">#4289</a>)</li> <li><code>opentelemetry-instrumentation</code>: Add support for wrapt 2.x (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4203">#4203</a>)</li> <li><code>opentelemetry-instrumentation-psycopg2</code>: Add parameter <code>capture_parameters</code> to instrumentor. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4212">#4212</a>)</li> <li><code>opentelemetry-instrumentation-botocore</code>: Add support for instrumenting <code>aiobotocore</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4049">#4049</a>)</li> <li><code>opentelemetry-instrumentation-sqlalchemy</code>: implement new semantic convention opt-in migration (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4110">#4110</a>)</li> </ul> <h3>Fixed</h3> <ul> <li><code>opentelemetry-docker-tests</code>: Replace deprecated <code>SpanAttributes</code> from <code>opentelemetry.semconv.trace</code> with <code>opentelemetry.semconv._incubating.attributes</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4339">#4339</a>)</li> <li><code>opentelemetry-instrumentation-confluent-kafka</code>: Skip <code>recv</code> span creation when <code>poll()</code> returns no message or <code>consume()</code> returns an empty list, avoiding empty spans on idle polls (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4349">#4349</a>)</li> <li>Fix intermittent <code>Core Contrib Test</code> CI failures caused by GitHub git CDN SHA propagation lag by installing core packages from the already-checked-out local copy instead of a second git clone (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4305">#4305</a>)</li> <li>Don't import module in unwrap if not already imported (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4321">#4321</a>)</li> <li><code>opentelemetry-instrumentation-logging</code>: Map Python <code>CRITICAL</code> log level to OTel <code>FATAL</code> severity text and <code>WARNING</code> to <code>WARN</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4365">#4365</a>)</li> <li><code>opentelemetry-instrumentation-logging</code>: Add recursion guard in LoggingHandler.emit to prevent deadlock (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4302">#4302</a>)</li> <li><code>opentelemetry-instrumentation-grpc</code>: Fix bidirectional streaming RPCs raising <code>AttributeError: 'generator' object has no attribute 'add_done_callback'</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4259">#4259</a>)</li> <li><code>opentelemetry-instrumentation-aiokafka</code>: fix <code>Unclosed AIOKafkaProducer</code> warning and <code>RuntimeWarning: coroutine was never awaited</code> in tests (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4384">#4384</a>)</li> <li><code>opentelemetry-instrumentation-aiokafka</code>: Fix compatibility with aiokafka 0.13 by calling <code>_key_serializer</code>/<code>_value_serializer</code> directly instead of the internal <code>_serialize</code> method whose signature changed in 0.13 from <code>(topic, key, value)</code> to <code>(key, value, headers)</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4379">#4379</a>)</li> </ul> <h3>Breaking changes</h3> <ul> <li><code>opentelemetry-instrumentation-boto</code>: Remove instrumentation (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4303">#4303</a>)</li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li>See full diff in <a href="https://github.com/open-telemetry/opentelemetry-python-contrib/commits">compare view</a></li> </ul> </details> <br /> Updates `opentelemetry-instrumentation-fastapi` from 0.61b0 to 0.62b0 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/CHANGELOG.md">opentelemetry-instrumentation-fastapi's changelog</a>.</em></p> <blockquote> <h2>Version 1.41.0/0.62b0 (2026-04-09)</h2> <h3>Added</h3> <ul> <li><code>opentelemetry-instrumentation-asgi</code>: Respect <code>suppress_http_instrumentation</code> context in ASGI middleware to skip server span creation when HTTP instrumentation is suppressed (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4375">#4375</a>)</li> <li><code>opentelemetry-instrumentation-confluent-kafka</code>: Loosen confluent-kafka upper bound to <3.0.0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4289">#4289</a>)</li> <li><code>opentelemetry-instrumentation</code>: Add support for wrapt 2.x (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4203">#4203</a>)</li> <li><code>opentelemetry-instrumentation-psycopg2</code>: Add parameter <code>capture_parameters</code> to instrumentor. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4212">#4212</a>)</li> <li><code>opentelemetry-instrumentation-botocore</code>: Add support for instrumenting <code>aiobotocore</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4049">#4049</a>)</li> <li><code>opentelemetry-instrumentation-sqlalchemy</code>: implement new semantic convention opt-in migration (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python-contrib/pull/4110">#4110</a>)</li> </ul> <h3>Fixed</h3> <ul> <li><code>opentelemetry-docker-tests</code>: Replace deprecated <code…
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
Fix multiple SIGSEGV crash paths during
Py_FinalizeExon all Python versions (3.10–3.14). Observed in production on ARM64 (Python 3.11 + uWSGI withmax-requestsworker recycling) where greenlet was installed as a transitive dependency but never explicitly used by application code.Relationship to PR #495
PR #495 partially addressed this class of crashes by adding
murder_in_place()and_Py_IsFinalizing()guards, but only on Python < 3.11 (#if !GREENLET_PY311). Further investigation revealed that:Py_IsFinalizing()is set after atexit handlers complete on every version.getcurrent(), type checkers (GreenletChecker,MainGreenletExactChecker,ContextExactChecker), andclear_deleteme_list()had no shutdown protection.This PR supersedes PR #495 by making all guards unconditional, protecting the remaining crash paths, and adding TDD-certified tests that demonstrably fail on unpatched greenlet 3.3.2.
Design
Two independent guards now protect all shutdown phases:
g_greenlet_shutting_down— an atexit handler registered at module init (LIFO = runs first) sets this flag. Covers the atexit phase ofPy_FinalizeEx, wherePy_IsFinalizing()is stillFalseon all Python versions.Py_IsFinalizing()— covers the GC collection and later phases ofPy_FinalizeEx. A compatibility shim is provided for Python < 3.13 (where only the private_Py_IsFinalizing()existed).These guards are checked in
mod_getcurrent,PyGreenlet_GetCurrent,GreenletChecker,MainGreenletExactChecker,ContextExactChecker,clear_deleteme_list(),ThreadState::~ThreadState(),_green_dealloc_kill_started_non_main_greenlet, andThreadState_DestroyNoGIL::AddPendingCall.Root cause
_Py_IsFinalizing()is only set after atexit handlers complete insidePy_FinalizeExon all Python versions:Without the guards, code running in atexit handlers (e.g. uWSGI plugin cleanup calling
Py_FinalizeEx) or__del__methods could callgreenlet.getcurrent(), reaching into partially-torn-down C++ state and crashing inPyType_IsSubtypeviaGreenletChecker.What changed
C++ shutdown guards (8 files)
PyModule.cppg_greenlet_shutting_down+ atexit handler made unconditional (was#if !GREENLET_PY311)CObjects.cppPyGreenlet_GetCurrentguard made unconditionalPyGreenlet.cppmurder_in_place()guard made unconditionalTThreadState.hppclear_deleteme_list()+ destructor guards made unconditionalTThreadStateDestroy.cppAddPendingCallguard extended withg_greenlet_shutting_downgreenlet.cppgreenlet_refs.hppGreenletChecker+ContextExactCheckergreenlet_internal.hppMainGreenletExactCheckerAdditional hardening
clear_deleteme_list()usesstd::swap(zero-allocation) instead of copying thePythonAllocator-backed vectordeletemevector usesstd::allocator(systemmalloc) instead ofPyMem_MallocThreadStateusesstd::malloc/std::freeinstead ofPyObject_Mallocclear_deleteme_list()preserves pending Python exceptions around its cleanup loopTests (3 files)
test_interpreter_shutdown.py— verified RED on greenlet 3.3.2 (UNGUARDED) and GREEN with fix (GUARDED) across Python 3.10–3.14getcurrent()still returns valid objects when called before greenlet's cleanup (guards against over-blocking)test_dealloc_catches_GreenletExit_throws_other— usesys.unraisablehookinstead of stderr capture (pytest compatibility)test_version— skip gracefully on old setuptools that can't parse PEP 639 SPDX license formatTDD verification
Ran both test types against unpatched greenlet 3.3.2 and the patched code across 6 Python versions:
requires-python >= 3.10)PR #495's tests were also re-evaluated as part of this work: all 9 original tests pass on both greenlet 3.1.1 (pre-#495) and 3.3.2 (post-#495), confirming they are smoke tests that cannot detect regressions. The 5 Group D tests added here are the true regression safety net.
Additionally, the crash reproducer (uWSGI + Flask on ARM64 Python 3.11) ran 45,000 requests with 0 crashes (15 worker recycling cycles) with the patched greenlet.
Test plan
murder_in_place()guard only fires during shutdown, not normal thread exit (Group B tests verify GreenletExit/finally still work)Backport note
These fixes have already been backported to the
maint/3.2branch in PR #500 (targeting 3.2.6), since the previous backport (3.2.5 / PR #495) did not fully stabilize shutdown behavior.