Skip to content

Fix crashes during interpreter shutdown on all Python versions#499

Closed
nbouvrette wants to merge 1 commit intopython-greenlet:masterfrom
nbouvrette:fix/safe-getcurrent-during-finalization
Closed

Fix crashes during interpreter shutdown on all Python versions#499
nbouvrette wants to merge 1 commit intopython-greenlet:masterfrom
nbouvrette:fix/safe-getcurrent-during-finalization

Conversation

@nbouvrette
Copy link
Copy Markdown
Contributor

@nbouvrette nbouvrette commented Mar 11, 2026

Summary

Fix multiple SIGSEGV crash paths during Py_FinalizeEx on all Python versions (3.10–3.14). Observed in production on ARM64 (Python 3.11 + uWSGI with max-requests worker 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:

  1. The vulnerability exists on all Python versions (3.10–3.14), not just < 3.11 — Py_IsFinalizing() is set after atexit handlers complete on every version.
  2. Multiple crash paths were unguardedgetcurrent(), type checkers (GreenletChecker, MainGreenletExactChecker, ContextExactChecker), and clear_deleteme_list() had no shutdown protection.
  3. PR Fix SIGSEGV/SIGABRT during interpreter shutdown on Python < 3.11 #495's tests were smoke tests, not regression tests — they pass on both pre-fix (greenlet 3.1.1) and post-fix (3.3.2) versions, meaning they cannot detect if the fix is reverted.

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:

  1. g_greenlet_shutting_down — an atexit handler registered at module init (LIFO = runs first) sets this flag. Covers the atexit phase of Py_FinalizeEx, where Py_IsFinalizing() is still False on all Python versions.

  2. Py_IsFinalizing() — covers the GC collection and later phases of Py_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, and ThreadState_DestroyNoGIL::AddPendingCall.

Root cause

_Py_IsFinalizing() is only set after atexit handlers complete inside Py_FinalizeEx on all Python versions:

Py_FinalizeEx()
├── call_py_exitfuncs()              ← atexit phase (Py_IsFinalizing() == False)
│   └── g_greenlet_shutting_down     ← our flag covers this gap
├── _PyRuntimeState_SetFinalizing()  ← Py_IsFinalizing() becomes True
├── _PyGC_CollectIfEnabled()         ← GC phase (__del__ methods run here)
│   └── Py_IsFinalizing()           ← standard API covers this
├── finalize_interp_clear()          ← type objects freed here

Without the guards, code running in atexit handlers (e.g. uWSGI plugin cleanup calling Py_FinalizeEx) or __del__ methods could call greenlet.getcurrent(), reaching into partially-torn-down C++ state and crashing in PyType_IsSubtype via GreenletChecker.

What changed

C++ shutdown guards (8 files)

File Change
PyModule.cpp g_greenlet_shutting_down + atexit handler made unconditional (was #if !GREENLET_PY311)
CObjects.cpp PyGreenlet_GetCurrent guard made unconditional
PyGreenlet.cpp murder_in_place() guard made unconditional
TThreadState.hpp clear_deleteme_list() + destructor guards made unconditional
TThreadStateDestroy.cpp AddPendingCall guard extended with g_greenlet_shutting_down
greenlet.cpp Atexit handler registration made unconditional
greenlet_refs.hpp Added guards to GreenletChecker + ContextExactChecker
greenlet_internal.hpp Added guard to MainGreenletExactChecker

Additional hardening

  • clear_deleteme_list() uses std::swap (zero-allocation) instead of copying the PythonAllocator-backed vector
  • deleteme vector uses std::allocator (system malloc) instead of PyMem_Malloc
  • ThreadState uses std::malloc/std::free instead of PyObject_Malloc
  • clear_deleteme_list() preserves pending Python exceptions around its cleanup loop

Tests (3 files)

  • 5 new TDD-certified regression tests in test_interpreter_shutdown.py — verified RED on greenlet 3.3.2 (UNGUARDED) and GREEN with fix (GUARDED) across Python 3.10–3.14
  • 3 strengthened smoke tests — assert getcurrent() still returns valid objects when called before greenlet's cleanup (guards against over-blocking)
  • Updated file docstring and section headers — organized 21 tests into 4 documented groups
  • Fixed test_dealloc_catches_GreenletExit_throws_other — use sys.unraisablehook instead of stderr capture (pytest compatibility)
  • Fixed test_version — skip gracefully on old setuptools that can't parse PEP 639 SPDX license format

TDD verification

Ran both test types against unpatched greenlet 3.3.2 and the patched code across 6 Python versions:

Python greenlet 3.3.2 (RED) Patched (GREEN)
3.9 N/A (requires-python >= 3.10) N/A
3.10 UNGUARDED GUARDED (None)
3.11 UNGUARDED GUARDED (None)
3.12 UNGUARDED GUARDED (None)
3.13 UNGUARDED GUARDED (None)
3.14 UNGUARDED GUARDED (None)

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

  • Full local test suite: 158 passed, 3 skipped, 0 failed (pytest)
  • TDD RED/GREEN verification across Python 3.10–3.14 via Docker
  • Crash reproducer: 45,000 requests, 0 segfaults on ARM64 Python 3.11
  • Behavioral review: murder_in_place() guard only fires during shutdown, not normal thread exit (Group B tests verify GreenletExit/finally still work)
  • Full CI on all supported Python versions

Backport note

These fixes have already been backported to the maint/3.2 branch in PR #500 (targeting 3.2.6), since the previous backport (3.2.5 / PR #495) did not fully stabilize shutdown behavior.

nbouvrette added a commit to nbouvrette/greenlet that referenced this pull request Mar 11, 2026
@nbouvrette nbouvrette force-pushed the fix/safe-getcurrent-during-finalization branch 2 times, most recently from 17d17e3 to 733a419 Compare March 11, 2026 05:37
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
@nbouvrette nbouvrette force-pushed the fix/safe-getcurrent-during-finalization branch from 25a4dfa to e1fdf27 Compare March 24, 2026 11:20
@nbouvrette nbouvrette changed the title Fix crash in getcurrent()/greenlet construction during early Py_FinalizeEx Fix crashes during interpreter shutdown on all Python versions Mar 24, 2026
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
@nbouvrette nbouvrette force-pushed the fix/safe-getcurrent-during-finalization branch from a4a6510 to 5745a6c Compare March 24, 2026 11:47
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
@jamadden
Copy link
Copy Markdown
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.

@jamadden
Copy link
Copy Markdown
Contributor

Apparently I handled the merge wrong as far as the UI is concerned, but this has been merged.

@jamadden jamadden closed this Mar 31, 2026
@nbouvrette nbouvrette deleted the fix/safe-getcurrent-during-finalization branch March 31, 2026 19:01
@nbouvrette
Copy link
Copy Markdown
Contributor Author

Thanks @jamadden - are you consider #500 as well? it would really be great if its possible to backport this fix

@nbouvrette
Copy link
Copy Markdown
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
@nbouvrette
Copy link
Copy Markdown
Contributor Author

nbouvrette commented Mar 31, 2026

@jamadden I ported back all your latest changes on #500

Ported (7 of 8 commits):

Change Files Why port
Atexit refactor — use NewReference/Require framework greenlet.cpp Cleaner code, crash safety non-optional (no PyErr_Clear fallback)
Namespace the flagstatic int in namespace greenlet 7 C++ files Better scoping, removes extern declarations from 3 files
IsShuttingDown() function greenlet_refs.hpp + 6 callers Encapsulates the dual-guard pattern, reduces code duplication
Atomicity comment greenlet_refs.hpp Documents why std::atomic isn't needed
clear_deleteme_list comments TThreadState.hpp Documents deliberate leaking and exception safety
Comment cleanup 4 files Formatting parity with master
test_leaks.py comment reformat test_leaks.py Formatting parity

Skipped (2 items):

  • CI bump (docker/setup-qemu-action v3→v4) — different CI config on maint/3.2
  • test_greenlet.py getattr revert — test_no_gil_on_free_threaded doesn't exist on maint/3.2

Verification: Build succeeded, all 21 shutdown tests passed, full suite 159 passed / 1 skipped.

jamadden added a commit that referenced this pull request Apr 4, 2026
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 &lt;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
&lt;accessing-captured-output&gt;</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 &quot;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>)&quot;</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)
&lt;https://github.com/python-greenlet/greenlet/pull/499&gt;</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
&lt;https://github.com/python-greenlet/greenlet/pull/502&gt;</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
&lt;https://github.com/python-greenlet/greenlet/issues/503&gt;</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 &gt; 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 &gt; 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&gt;=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)
&lt;https://github.com/python-greenlet/greenlet/pull/499&gt;</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
&lt;https://github.com/python-greenlet/greenlet/pull/502&gt;</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
&lt;https://github.com/python-greenlet/greenlet/issues/503&gt;</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 &lt;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 &lt;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 &lt;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 &lt;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 &lt;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…
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants