)]}'
{
  "log": [
    {
      "commit": "f90c430c3a1ce8f08c09942a5a1c3a797bb2295b",
      "tree": "a4ee51066fdbf3c1ab3484d773679fc8ce1be056",
      "parents": [
        "5e9611aacc0bdd2054aa36800055014ebcd8e805"
      ],
      "author": {
        "name": "Lucas Colley",
        "email": "lucas.colley8@gmail.com",
        "time": "Sat Aug 29 00:48:12 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 16:48:12 2026 -0700"
      },
      "message": "fix: unused-template warnings (#6156)\n\n* fix: remove `static` from `type_id`\n\n* Add -Wunused-template for Clang 18\n\n* fix: remove `static` from `type_has_shared_from_this`\n\n* Remove unreachable overload.\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "5e9611aacc0bdd2054aa36800055014ebcd8e805",
      "tree": "0d23e47b478bc7225b08153634c7a08c511ede5c",
      "parents": [
        "08f89f7b2155097295ec0357e9f2d8e2dec514b7"
      ],
      "author": {
        "name": "Aaron Gokaslan",
        "email": "aaronGokaslan@gmail.com",
        "time": "Mon Aug 24 20:39:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 24 20:39:53 2026 -0700"
      },
      "message": "(BE)(NFC): Use much more specific CPP feature flags (#6150)"
    },
    {
      "commit": "08f89f7b2155097295ec0357e9f2d8e2dec514b7",
      "tree": "34c4c734b16aade24d3697a1da89e3155ce7665a",
      "parents": [
        "22bf5b6ed4487e11d10a474d0b32081626bbb78a"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Sun Aug 23 00:58:05 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 23 00:58:05 2026 -0400"
      },
      "message": "chore: add prepare-release and publish-release agent skills (#6147)\n\n* chore: add prepare-release and publish-release agent skills\n\nSplit the release process from docs/release.rst into two agent skills:\na changelog/version-bump PR, and the manual publication steps after\nthat PR merges. Un-ignore .agents (the MSVC \u0027Release\u0027 pattern matched\nthe release skill directory case-insensitively) and drop the outdated\nmanual _version.py step from docs/release.rst.\n\nAssisted-by: ClaudeCode:claude-fable-5\n\n* [no ci] chore: document changelog style normalization in release skill\n\nTeach the prepare-release skill to proofread generated changelog entries for tense, concision, categorization, and PR-link consistency before opening release-prep PRs.\n\n* [no ci] chore: fix release skill portability\n\n* [no ci] fix: harden release workflows\n\n* [no ci] docs: show explicit manual artifact upload\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "22bf5b6ed4487e11d10a474d0b32081626bbb78a",
      "tree": "2a5acf671549a258dc104a75f0de139f08da71ad",
      "parents": [
        "a49c4dbfa478d98c8b43493d1c2a9699b9726909"
      ],
      "author": {
        "name": "Advit Arora",
        "email": "72540117+advitrocks9@users.noreply.github.com",
        "time": "Thu Aug 20 04:35:59 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 16:05:59 2026 -0700"
      },
      "message": "fix(numpy): accept PYBIND11_TYPE-wrapped types in the dtype macros (#6148)\n\n* fix(numpy): accept PYBIND11_TYPE-wrapped types in the dtype macros\n\n* docs: point at the macro notes from the structured types section\n\n* fix(numpy): accept bare types in direct field descriptor macro calls"
    },
    {
      "commit": "a49c4dbfa478d98c8b43493d1c2a9699b9726909",
      "tree": "06cb900fecb99511e985173eae1c9cb1d91a29bb",
      "parents": [
        "a9524c8254eefbe855d0a1757b6a435254437bdb"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Mon Aug 17 00:50:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 00:50:31 2026 -0400"
      },
      "message": "chore(cmake): carry option-driven defines on pybind11_headers INTERFACE (#6130)\n\n* chore(cmake): carry option-driven defines on pybind11_headers INTERFACE\n\nPYBIND11_DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION and\nPYBIND11_SIMPLE_GIL_MANAGEMENT were directory-scoped\nadd_compile_definitions, which only reached the master-project test\nbuild. On the pybind11_headers INTERFACE (like\nPYBIND11_INTERNALS_VERSION) they also apply in add_subdirectory mode\nand in the exported/installed targets.\n\nAssisted-by: ClaudeCode:claude-fable-5\n\n* test(cmake): verify option-driven defines reach consumer targets\n\nExtend subdirectory_target and installed_target to check that\nPYBIND11_DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION and\nPYBIND11_SIMPLE_GIL_MANAGEMENT propagate through the pybind11_headers\nusage requirements. Fails without the parent commit.\n\nAssisted-by: ClaudeCode:claude-fable-5"
    },
    {
      "commit": "a9524c8254eefbe855d0a1757b6a435254437bdb",
      "tree": "def1a63b8e40832997bb6873add3be241a0af5f3",
      "parents": [
        "0599909bfebc7d3440cc1fda3144e437e6ade056"
      ],
      "author": {
        "name": "aidaodedjl",
        "email": "55816803+aidaodedjl@users.noreply.github.com",
        "time": "Mon Aug 17 02:02:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 16 11:02:48 2026 -0700"
      },
      "message": "Guard cxxabi.h include with __has_include for clang-cl (#6145)\n\n* fix: guard cxxabi.h include with __has_include for clang-cl\n\nclang-cl on Windows defines __GNUG__ but does not ship \u003ccxxabi.h\u003e,\nmaking detail/typeid.h fail to compile. Introduce PYBIND11_HAS_CXXABI_H,\ndefined only when \u003ccxxabi.h\u003e is actually available (__has_include with\na fallback for compilers without it, including C++11), and use it to\nguard both the include and the abi::__cxa_demangle call site.\n\nFixes #6129\n\n* docs: explain the __has_include fallback for GCC \u003c 5\n\n---------\n\nCo-authored-by: aidaodedjl \u003cjialiang.dong@ju-shen.com\u003e"
    },
    {
      "commit": "0599909bfebc7d3440cc1fda3144e437e6ade056",
      "tree": "4e5efda59ae4eef7d0fab33022e5ebb047b6ebb8",
      "parents": [
        "856a3485ca5b704fc7614e89540670cb553e6e4f"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Fri Aug 14 16:33:49 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 14 16:33:49 2026 -0400"
      },
      "message": "fix: returning a copyable type with a deleted move constructor (#6143)\n\n* fix: returning a copyable type with a deleted move constructor (#6142)\n\ndetail::function_ref\u0027s constructor SFINAE required\nis_convertible\u003cRet, Ret\u003e, which is false for a copyable type whose move\nconstructor is explicitly deleted (the trait tests conversion from an\nxvalue). In C++17, such a prvalue return is legal via guaranteed copy\nelision, so also accept an exact type match. Regression introduced in\n3.1.0 by the call_impl outlining (#5887).\n\nFixes #6142\n\nAssisted-by: ClaudeCode:claude-fable-5\n\n* refactor: guard with __cpp_guaranteed_copy_elision\n\nPer review: the feature-test macro expresses the intent more precisely\nthan PYBIND11_CPP17.\n\nAssisted-by: ClaudeCode:claude-opus-5"
    },
    {
      "commit": "856a3485ca5b704fc7614e89540670cb553e6e4f",
      "tree": "1b2db8cabdbeef0535f821d8907984870cd455de",
      "parents": [
        "97bf890db679505a14dfe547a5e77bb2bd05dc90"
      ],
      "author": {
        "name": "Michael Šimáček",
        "email": "michael.simacek@oracle.com",
        "time": "Sat Aug 08 03:07:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 07 18:07:55 2026 -0700"
      },
      "message": "Prepare for GraalPy 3.13 (#6141)"
    },
    {
      "commit": "97bf890db679505a14dfe547a5e77bb2bd05dc90",
      "tree": "aea838909d16836e7d2515dd1ba6e67e2b3f19ae",
      "parents": [
        "05f6e6f6815f91a2df52e270f19f70a5e65c113e"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Thu Aug 06 11:44:21 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 11:44:21 2026 -0400"
      },
      "message": "chore: prepare 3.1.0 release (#6125)\n\n* docs: add 3.1 entries to the changelog\n\nAssisted-by: ClaudeCode:claude-opus-5\nSigned-off-by: Henry Schreiner \u003chenryfs@princeton.edu\u003e\n\n* chore: prepare 3.1.0 release\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* [skip ci] Change release date to August 4, 2026\n\n* docs: add #6127 entry and set release date to August 6, 2026\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n---------\n\nSigned-off-by: Henry Schreiner \u003chenryfs@princeton.edu\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crwgkio@gmail.com\u003e"
    },
    {
      "commit": "05f6e6f6815f91a2df52e270f19f70a5e65c113e",
      "tree": "59f1161c85d92a96430e376c195fba05961808e0",
      "parents": [
        "6dd1756f985816fbd06e13faeac9cda86c6b262e"
      ],
      "author": {
        "name": "ymwang78",
        "email": "wangym@gmail.com",
        "time": "Thu Aug 06 15:05:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 00:05:23 2026 -0700"
      },
      "message": "fix(subinterpreter): don\u0027t touch the thread state before create() attaches one (#6127)\n\n`subinterpreter::create()` documents that \"the main interpreter and its GIL\nare not required to be held prior to calling this function\", but its first\nstatement is `error_scope err_scope;`, i.e. `PyErr_Fetch()`, before\n`main_guard` attaches a thread state. With no current `PyThreadState`,\n`PyErr_Fetch()` -\u003e `_PyErr_GetRaisedException(NULL)` dereferences null and\nthe process dies (SIGSEGV; 0xC0000005 on Windows). `~error_scope` is the\nmirror image: it calls `PyErr_Restore()` after `main_guard` has already\nswapped the thread state back away.\n\nTwo ordinary situations reach `create()` with no thread state:\n\n- an embedder that ends its initialization with `PyEval_SaveThread()`,\n  which is the documented way to hand the GIL back after\n  `Py_InitializeFromConfig()`;\n- any worker thread that has never touched Python.\n\nExisting tests never hit this because they all run under the\n`py::scoped_interpreter guard{}` in catch.cpp, which keeps the GIL held on\nthe main thread for the whole run.\n\nMove `error_scope` inside the `main_guard` scope. The case it exists for is\nunaffected: a caller that already holds the main GIL takes\n`subinterpreter_scoped_activate`\u0027s `simple_gil_` fast path, which keeps the\nsame thread state, so its pending error is still saved across\n`Py_NewInterpreterFromConfig()` and restored afterwards. A caller sitting on\nsome other interpreter never had its error indicator touched in the first\nplace, since everything inside the block runs on the main interpreter\u0027s\nthread state and `PyThreadState_Swap()` does not move error indicators. It\nalso makes the `pybind11_fail()` path unwind in a safer order: `~error_scope`\nnow runs while `main_guard` is still alive.\n\nAdd \"Create Subinterpreter without a thread state\", covering both a thread\nthat dropped its thread state via `gil_scoped_release` and a thread that\nnever had one. It segfaults without the fix and passes with it.\n\nVerified on Windows / MSVC 14.51 / CPython 3.13.14: test_with_catch goes\nfrom 33 to 34 test cases, all passing.\n\nAssisted-by: ClaudeCode:claude-opus-5"
    },
    {
      "commit": "6dd1756f985816fbd06e13faeac9cda86c6b262e",
      "tree": "1bf10ca8de9c4628fdf5c179a7d9c4759264ef20",
      "parents": [
        "59565095fafae453b15d2a9e8a66d8ca4758b6d5"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Thu Aug 06 01:26:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 06 01:26:39 2026 -0400"
      },
      "message": "chore(deps): update pre-commit hooks (#6126)\n\n* chore(deps): update pre-commit hooks\n\nupdates:\n- [github.com/pre-commit/mirrors-clang-format: v22.1.5 → v22.1.8](https://github.com/pre-commit/mirrors-clang-format/compare/v22.1.5...v22.1.8)\n- [github.com/astral-sh/ruff-pre-commit: v0.15.20 → v0.16.1](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.20...v0.16.1)\n- [github.com/pre-commit/mirrors-mypy: v2.1.0 → v2.3.0](https://github.com/pre-commit/mirrors-mypy/compare/v2.1.0...v2.3.0)\n- [github.com/codespell-project/codespell: v2.4.2 → v2.4.3](https://github.com/codespell-project/codespell/compare/v2.4.2...v2.4.3)\n\n* style: pre-commit fixes\n\n* fix: adapt to the ruff 0.16 default rule set\n\nThe hook update pulled in ruff 0.16, which expanded its default rules and\nautofixed `self: S -\u003e S` to `-\u003e Self`. That fix added a runtime\n`typing_extensions` import to setup_helpers.py, which must stay\ndependency-free; it broke every test job whose environment does not supply\nthat package. The import is now guarded by TYPE_CHECKING.\n\nAlso replace the `exec` in docs/conf.py with an importlib module load,\nparenthesize implicit string concatenations in list literals, mark unused\nunpacked variables with a leading underscore, and make noxfile.py\nexecutable to match its shebang.\n\nThe remaining new rules are silenced per-file, with reasons: the chrono\ntests check naive local time on purpose, and the other rules conflict with\nhow the tests are written.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Henry Schreiner \u003chenryfs@princeton.edu\u003e"
    },
    {
      "commit": "59565095fafae453b15d2a9e8a66d8ca4758b6d5",
      "tree": "78b45e061935b328576c6a4f4f023fda034ebd4e",
      "parents": [
        "63d627c5747befad7720a43ebbe5614fd5d83247"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Sun Aug 02 22:37:26 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 02 22:37:26 2026 -0700"
      },
      "message": "Delegate py::print to Python\u0027s native print (#6121)\n\n* refactor: delegate py::print to native print\n\n* style: use auto for print result\n\n* test: focus py::print coverage on delegation\n\n* docs: describe native py::print delegation\n\n* fix: keep py::print silent when builtin is missing\n\n* test: cover py::print with unavailable stdout\n\n* docs: clarify py::print builtins lookup"
    },
    {
      "commit": "63d627c5747befad7720a43ebbe5614fd5d83247",
      "tree": "8eba4f9dffd1fb2beebd011d53adfb873d22da69",
      "parents": [
        "695a7a421dc8a2dccde5d5b07b69e9d2ef917c02"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Sat Aug 01 01:04:32 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 22:04:32 2026 -0700"
      },
      "message": "feat!: drop support for Python 3.8, MSVC 2017 (#6110)\n\n* feat!: drop support for Python 3.8\n\nThe minimum supported version is now Python 3.9. pybind11 v3.0 was the last\nrelease that supports Python 3.8. The deprecation note said that support goes\naway in 3.1.\n\nRemove the code paths that this makes dead:\n\n- the `_PyObject_Vectorcall` fallback in `cast.h`\n- the `frame-\u003ef_code` and `frame-\u003ef_back` fallbacks in `pytypes.h`\n- the `PyFrame_FastToLocals` path in `get_type_override`\n- the conditional `Py_VISIT(Py_TYPE(self))` in `tp_traverse`\n- `PYBIND11_PYCONFIG_SUPPORT_PY_VERSION_HEX`, the pre-PyConfig interpreter\n  init, and the `widen_chars` helpers in `embed.h`\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* ci(appveyor): use Python 3.9\n\nThe AppVeyor job set `PYTHON: 38`, which makes the path `C:\\Python38`.\nThe image gives Python 3.9.13 as `C:\\Python39`.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* feat!: require MSVC 2019 or newer\n\nPython 3.9 is the new minimum, so MSVC 2017 is no longer needed. Raise the\ncompile-time floor to _MSC_VER 1920 and remove the workarounds that only\napplied below it: std::launder, fold expressions, weak_from_this, aligned\nnew/delete, the C4100 warning helper, and the func_handle syntax error.\n\nAppVeyor now builds with Visual Studio 2019.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* fix(appveyor): build against the Python that has the test packages\n\nCMake 4 has no FindPythonLibs, so pybind11 uses FindPython. FindPython reads\nthe registry before PATH and selected `C:\\Python314-x64`, but the test packages\ngo into the Python on PATH. Pass `Python_ROOT_DIR` to name the correct one.\n\nAlso set `CMAKE_ARCH`. It was never set, so the architecture came from the\ngenerator. Visual Studio 2017 defaults to Win32, but Visual Studio 2019\ndefaults to x64, which made this x86 job build 64-bit code.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* fix(appveyor): give the linker Python\u0027s libs directory\n\nThe build compiled but failed to link with LNK1104 on a bare `python39.lib`.\nThat name comes from the `#pragma comment(lib, ...)` in pyconfig.h, so the\nlinker needs the directory. CMake 4 has no FindPythonLibs, and FindPython does\nnot add it for this Debug x86 build. Put it on LIB instead.\n\nThe directory listing is temporary, to confirm the library is present.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* fix(appveyor): link the release Python library in Debug\n\nThe image ships python39_d.lib next to python39.lib, so FindPython picks the\ndebug import library for a Debug build. pybind11 undefines _DEBUG around\nPython.h, so pyconfig.h asks for python39.lib instead and the link failed with\nLNK1104. Name the release library for the debug slot.\n\nSetting LIB does not work, because MSBuild replaces it from the toolset, and it\nwould link both import libraries.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* chore(appveyor): print link settings to debug LNK1104\n\nRevert the two attempted fixes. Neither changed the failure: setting LIB does\nnot survive MSBuild, and naming the release library for Python_LIBRARY_DEBUG\nhad no effect.\n\nPrint the Python cache entries and the link settings of a generated project\nfile instead, to see what the linker really gets. Temporary.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* fix(appveyor): take the release Python library in Debug\n\nThe generated project file linked C:\\Python39\\libs\\python39_d.lib in the Debug\nconfiguration, because the image ships debug binaries next to the release ones.\npybind11 undefines _DEBUG around Python.h, so pyconfig.h asks for python39.lib\nin a #pragma comment(lib), which nothing on the link line satisfies and no\nlibrary directory holds. Map Debug to the release artifacts.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* chore(appveyor): drop the temporary link diagnostic\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* fix(tests): guard the unraisable warning filter for pytest \u003c 6\n\nThe distro pytest in the Clang and GCC Docker jobs has no\nPytestUnraisableExceptionWarning, so an unconditional filterwarnings\nmark makes pytest fail with an INTERNALERROR after the tests pass.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\nClaude-Session: https://claude.ai/code/session_01Aimf6HuSz1vLRwBnbxmCTc\n\n* docs: address review items on version hints, embed docs, and a PyPy xfail\n\nExtend Python_ADDITIONAL_VERSIONS through 3.15, describe the PyConfig\nbehavior of initialize_interpreter, and drop the stale Python 3.8 wording\nfrom the PyPy xfail reason.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* Update README.rst\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crwgkio@gmail.com\u003e\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crwgkio@gmail.com\u003e"
    },
    {
      "commit": "695a7a421dc8a2dccde5d5b07b69e9d2ef917c02",
      "tree": "f8b97d77119279a846a4c9c4aee36c8cd4385d9e",
      "parents": [
        "ea9e6e6a23b1069a561631e7dbf73eb4bb16fa81"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 31 22:58:26 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 22:58:26 2026 -0400"
      },
      "message": "chore(deps): bump the actions group with 3 updates (#6119)\n\nBumps the actions group with 3 updates: [actions/setup-python](https://github.com/actions/setup-python), [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) and [actions/labeler](https://github.com/actions/labeler).\n\n\nUpdates `actions/setup-python` from 6 to 7\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/v6...v7)\n\nUpdates `astral-sh/setup-uv` from 8.2.0 to 9.0.0\n- [Release notes](https://github.com/astral-sh/setup-uv/releases)\n- [Commits](https://github.com/astral-sh/setup-uv/compare/v8.2.0...v9.0.0)\n\nUpdates `actions/labeler` from 6 to 7\n- [Release notes](https://github.com/actions/labeler/releases)\n- [Commits](https://github.com/actions/labeler/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-python\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: actions\n- dependency-name: astral-sh/setup-uv\n  dependency-version: 9.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: actions\n- dependency-name: actions/labeler\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ea9e6e6a23b1069a561631e7dbf73eb4bb16fa81",
      "tree": "5e440dd52ac06d4aa6901f0a07dee18c2e5e2994",
      "parents": [
        "652c69437bbd67e0075648c2fd633eb318f1ee40"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Fri Jul 31 14:17:21 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 31 14:17:21 2026 -0400"
      },
      "message": "feat: small command line helpers for quick tests (#4272)\n\n* feat: small command line helpers for quick tests\n\nAdd --cflags, --ldflags, --embed, and --file to the pybind11 command\nline tool, based on python-config. This makes quick one-off compiles\neasy:\n\n    c++ $(python3 -m pybind11 --file\u003dexample.cpp)\n\nAssisted-by: ClaudeCode:claude-fable-5\n\n* refactor: quote paths, clarify CLI output logic, strengthen tests\n\n- Quote include and library dirs in get_cflags/get_ldflags so paths with\n  spaces work, sharing one quote helper in commands.py\n- Restructure the --file/--cflags/--ldflags printing into a single print\n- Note the Unix-compiler orientation in help text and docs\n- Test -L presence for --embed and quoting of paths with spaces\n\nAssisted-by: ClaudeCode:claude-fable-5\n\n* refactor: simplify flag helpers and keep import pybind11 light\n\n- Replace _get_config_var(name, fmt, quote) with a plain _config(name)\n  string helper; formatting and quoting happen at the call sites\n- Defer sysconfig/shlex imports so import pybind11 does not pay for the\n  CLI (~1ms -\u003e ~0.08ms for pybind11.commands)\n- Fetch EXT_SUFFIX once in main()\n- Import commands normally in the quoting test instead of importlib\n  file loading\n\nAssisted-by: ClaudeCode:claude-fable-5\n\n* fix: shared-library flags on all Unix platforms\n\nThe --file/--ldflags output only added -shared and -fPIC on Linux, so\nother Unix platforms (FreeBSD, Solaris, AIX) linked an executable and\nfailed on the missing main. Gate on os.name instead.\n\nAssisted-by: ClaudeCode:claude-opus-5"
    },
    {
      "commit": "652c69437bbd67e0075648c2fd633eb318f1ee40",
      "tree": "ec0878064b050c6587e66834055c802d8e0177b7",
      "parents": [
        "2f85cc8c4ad7cd9d53edada33c581aad091da0aa"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Wed Jul 29 14:53:47 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 14:53:47 2026 -0400"
      },
      "message": "fix: add py::mod_gil_used() spelling, support pedantic tests (#5797)\n\n* tests: add linking warnings/error\n\nSigned-off-by: Henry Schreiner \u003chenryschreineriii@gmail.com\u003e\n\n* tests: check pedantic C++14\n\n* fix: some pedantic warnings\n\nSigned-off-by: Henry Schreiner \u003chenryschreineriii@gmail.com\u003e\n\n* feat: add py::mod_gil_used()\n\nSigned-off-by: Henry Schreiner \u003chenryschreineriii@gmail.com\u003e\n\n* fix: use not_supported()\n\nSigned-off-by: Henry Schreiner \u003chenryschreineriii@gmail.com\u003e\n\n* style: pre-commit fixes\n\n* Update CMakeLists.txt\n\n* fix: remove the true/false parameter from mod_gil_not_used\n\nSigned-off-by: Henry Schreiner \u003chenryschreineriii@gmail.com\u003e\n\n* style: pre-commit fixes\n\n* Update tests/CMakeLists.txt\n\n* fix: deprecate mod_gil_not_used(bool) instead of removing it\n\nKeep the bool constructor public and mark it deprecated, so existing\ncode that spells mod_gil_not_used(false) still compiles. mod_gil_used()\nnow sets the flag through its friendship, which keeps the deprecated\nconstructor the only bool overload and stops pybind11 warning against\nitself.\n\nAlso use the py:: alias in exo_planet_pybind11.cpp to match its sibling\nhome_planet_very_lonely_traveler.cpp.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* fix: add trailing comma to macros picked up in rebase\n\ntest_smart_ptr.cpp and standalone_enum_module.cpp came from master after\nthis branch was written, so they still invoked variadic macros with no\nvariadic argument. That is a pedantic error below C++20.\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n---------\n\nSigned-off-by: Henry Schreiner \u003chenryschreineriii@gmail.com\u003e\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "2f85cc8c4ad7cd9d53edada33c581aad091da0aa",
      "tree": "dfecd25d356a87c4421b6139e65fdb40f698d66f",
      "parents": [
        "5540f968020451da2c1bf7211b8c861c0fc30cbf"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Wed Jul 29 12:51:20 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 29 12:51:20 2026 -0400"
      },
      "message": "chore(ci): bump NVHPC to 26.5 (#6117)\n\n* chore(ci): bump NVHPC to 26.5\n\nAssisted-by: ClaudeCode:claude-opus-5\n\n* chore(ci): download NVHPC deb with curl retries to dodge CDN 404s\n\nAssisted-by: ClaudeCode:claude-fable-5\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "5540f968020451da2c1bf7211b8c861c0fc30cbf",
      "tree": "e729027b40a925e5c45348dde6a672cd8d72c7b9",
      "parents": [
        "a647cddd4e9f44c033eeb1d423e1bf86c6c198c1"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Tue Jul 28 21:53:36 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 28 18:53:36 2026 -0700"
      },
      "message": "fix: only add string_view life support for transient sources (#6096)\n\n* revert: \"revert: add life support to handles cast to string_view (#6092)\"\n\nThis re-applies #6092 (reverting #6097) so the follow-up fixes in this PR can build on it.\n\nAssisted-by: ClaudeCode:claude-opus-4.8\n\n* fix: don\u0027t throw from string_view life support outside a bound function\n\nPR #6092 added loader_life_support::add_patient(src) to keep the source\nobject alive when loading a string view, fixing a real use-after-free when\na container of views is built from a non-sequence iterable (e.g. a\ngenerator): list_caster materializes a temporary tuple that owns the\nstrings and destroys it when load() returns, before the bound function\nbody runs.\n\nadd_patient throws when there is no life support frame, so casting to a\nview outside a bound function (e.g. a manual py::cast\u003cstd::string_view\u003e)\nnow raises instead of relying on the caller-owned source, a regression\nfrom #6092.\n\nFor these view-into-src cases registration is best effort: inside a bound\nfunction it keeps src alive (fixing the UAF), and outside one the caller\nowns src\u0027s lifetime as before. Add try_add_patient(), which returns false\ninstead of throwing when there is no frame, and use it at the three view\nload sites. add_patient() keeps its strict contract for value-creating\nconversions.\n\nAssisted-by: ClaudeCode:claude-opus-4.8\n\n* fix: only add string_view life support for transient sources\n\nRefine the previous commit. Best-effort registration (try_add_patient)\nsilently produces a dangling view when a container of views is built from\na generator outside a bound function: there the materialized temporary is\nreleased before the view is used, and with no frame nothing keeps it\nalive. Such a cast cannot be made safe, so it should fail loudly, while a\nview into a durable, caller-owned object needs no life support at all.\n\nThe view caster cannot tell a durable source from a pybind11-managed\ntransient one; that provenance lives in the container caster. Introduce an\nambient transient_source_guard that the list, set, map, and array casters\nset around their generator/materialized paths, and have the string caster\nkeep the source alive only when loading from a transient source (via the\nthrowing add_patient, so try_add_patient is no longer needed). This means:\n\n- views into durable sources (direct arguments, sequences, manual casts)\n  add no life support and no longer throw outside a bound function, and\n- a generator used outside a frame throws, rather than silently dangling.\n\nThe guard restores (rather than clears) the previous value, so a durable\ncontainer nested in a transient one is correctly treated as transient.\n\nVerified with AddressSanitizer: the in-frame generator case is clean, the\nout-of-frame durable cases succeed, and the out-of-frame generator case\nthrows.\n\nAssisted-by: ClaudeCode:claude-opus-4.8\n\n* Revert \"fix: only add string_view life support for transient sources\"\n\nThis reverts commit e18b8346a28c125964fcb9d192e6643d5ef3b420.\n\n* test: cover string_view argument life support\n\n* test: cover generated and nested string_view lifetimes\n\n* test: cover temporary-backed string_view casts\n\n* test: explain string_view lifetime regression tests\n\n* docs: clarify string_view lifetime requirements\n\n* docs: explain life support for custom view casters\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "a647cddd4e9f44c033eeb1d423e1bf86c6c198c1",
      "tree": "513839dd7cf686f044de86af0a19352fb022ffc9",
      "parents": [
        "95ebcb3643d4573425aa78a042496a133fb322a3"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Mon Jul 27 09:41:15 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 09:41:15 2026 -0400"
      },
      "message": "fix(cmake): respect explicit PYBIND11_USE_CROSSCOMPILING under CMP0190 (#6094)\n\n* fix(cmake): respect explicit PYBIND11_USE_CROSSCOMPILING under CMP0190\n\nPR #5829 added `AND NOT DEFINED CMAKE_CROSSCOMPILING_EMULATOR` to the\ncondition setting `_PYBIND11_CROSSCOMPILING`. That gate was meant to only\ncontrol the auto-default of `PYBIND11_USE_CROSSCOMPILING`, but it ended up\noverriding a value the project set explicitly. Emscripten/Pyodide defines\n`CMAKE_CROSSCOMPILING_EMULATOR` (node) yet still wants cross-compiling\nmode, so the flag was forced OFF and the build failed with a spurious\n\"Cannot run the interpreter\" / pointer-size mismatch.\n\nMove the emulator check up so it only guards the auto-default, and never\noverride an explicitly set `PYBIND11_USE_CROSSCOMPILING`.\n\nFixes #6043\n\nAssisted-by: ClaudeCode:claude-opus-4.8\n\n* fix(cmake): keep CMP0190 auto-default in add_subdirectory builds\n\nThe previous commit\u0027s `NOT DEFINED PYBIND11_USE_CROSSCOMPILING` guard\nbroke the intended auto-default for top-level / add_subdirectory builds:\nCMakeLists.txt runs `option(PYBIND11_USE_CROSSCOMPILING ... OFF)` before\nincluding pybind11Common.cmake, so the variable is already defined (OFF)\nand the CMP0190 default never applied.\n\nCapture, before the option() call, whether the project set the value\nitself, and let pybind11Common.cmake apply its default unless the value\nwas set explicitly. This keeps both the emulator override fix and the\nCMP0190 auto-default for subdirectory consumers.\n\nAssisted-by: ClaudeCode:claude-opus-4.8"
    },
    {
      "commit": "95ebcb3643d4573425aa78a042496a133fb322a3",
      "tree": "e2590c924068cbd0f86c4b453837d552962f07f4",
      "parents": [
        "f4d31b743dc1a121eb7c3a49efdd7c08cd43b77f"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Mon Jul 27 01:41:07 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 27 01:41:07 2026 -0400"
      },
      "message": "chore(tools): make_changelog missed and resurrected PRs (#6108)"
    },
    {
      "commit": "f4d31b743dc1a121eb7c3a49efdd7c08cd43b77f",
      "tree": "1efb8407551668d3442cc3d289df41bcc5d79f98",
      "parents": [
        "f95b7a58605a91cc832efb821b0c69ccd938b709"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Mon Jul 27 00:26:04 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 21:26:04 2026 -0700"
      },
      "message": "fix(cmake): don\u0027t pass -fno-fat-lto-objects on Apple GCC (#6114)\n\nGCC on macOS has no linker plugin, so `-fno-fat-lto-objects` makes every\nLTO probe fail and LTO is silently disabled. Plain `-flto\u003dauto` works.\n\nFixes #6060\n\nAssisted-by: ClaudeCode:claude-opus-5\nClaude-Session: https://claude.ai/code/session_013JABmnjt9oAh29p1pytAB3"
    },
    {
      "commit": "f95b7a58605a91cc832efb821b0c69ccd938b709",
      "tree": "0311762ff2fcb77c9c53e56eca8b2479824d6a5b",
      "parents": [
        "17b3b605a5f74410a80d67a779de9871d27a4ca1"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Mon Jul 27 00:25:24 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 21:25:24 2026 -0700"
      },
      "message": "fix: include `complex` in std::complex input annotation (#6113)\n\n* fix: include `complex` in std::complex input annotation\n\nThe input annotation for `std::complex\u003cT\u003e` omitted the builtin `complex`\ntype, which typeshed only makes a `typing.SupportsComplex` on Python 3.11+.\n\nAssisted-by: ClaudeCode:claude-opus-5\nClaude-Session: https://claude.ai/code/session_013JABmnjt9oAh29p1pytAB3\n\n* Add comment to explain why the explicit `complex` is needed.\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "17b3b605a5f74410a80d67a779de9871d27a4ca1",
      "tree": "30a70fdc26d8b46f75fbd03c262c94f071bca43c",
      "parents": [
        "57e7a8de342dc20d16859d4eda45bb960b4d18b5"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Sun Jul 26 22:08:59 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 19:08:59 2026 -0700"
      },
      "message": "test: remove dead PR3068 workaround branch (#6109)\n\n`WORKAROUND_ENABLING_ROLLBACK_OF_PR3068` compared the 5-element\n`sys.version_info` tuple to `(3, 9)`, so it was always False. The guarded\nbranch never ran. Remove the constant and keep only the branch that runs.\n\nAssisted-by: ClaudeCode:claude-opus-5"
    },
    {
      "commit": "57e7a8de342dc20d16859d4eda45bb960b4d18b5",
      "tree": "89d0bcd12bfd62e6fc19c39d0ba2fdd0b1f2ad76",
      "parents": [
        "36341ba9ba53096a5c4cc7fe69be577430f69d04"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Sun Jul 26 06:14:56 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 26 03:14:56 2026 -0700"
      },
      "message": "fix(stl_bind): correct __delitem__ for negative-step slices and re-enable contiguous erase fast path (#6088)\n\n* fix(stl_bind): correct __delitem__ for negative-step slices and re-enable contiguous erase fast path\n\nThe slice __delitem__ binding advanced the erase index by step - 1 for\nall steps. That correction is only valid for positive steps, where\nerasing shifts later elements down by one. For negative steps the\nvisited indices are strictly decreasing and erasing never shifts them,\nso the extra -1 deleted the wrong elements (e.g. del v[::-2] on\n[0,1,2,3] yielded [1,2] instead of [0,2]) and del v[::-1] walked off the\nfront of the vector (v.begin() - 1, observed SIGBUS).\n\nSwitch to the signed slice::compute overload so negative steps stay\nsigned, advance by step for negative steps and step - 1 for positive\nones, and drop the \u0026\u0026 false that had disabled the O(n) contiguous fast\npath since 2016.\n\nAssisted-by: ClaudeCode:claude-fable-5\n\n* refactor: address review — static_cast and parametrized test\n\nUse static_cast instead of a C-style cast for the slice.compute() size\nargument, and convert the __delitem__ slice test to\npytest.mark.parametrize over the slice cases.\n\nAssisted-by: ClaudeCode:claude-fable-5\n\n* test(stl_bind): cover slice deletion edge cases\n\n* fix(stl_bind): erase strided slices in descending order\n\n* Eliminate a variable and avoid redundant index increment (i + 1, ++i).\n\nThe control flow handles all relevant boundaries:\n\n- slicelength \u003d\u003d 0: excluded by the outer guard.\n- slicelength \u003d\u003d 1: erases once, decrements to zero, and breaks without touching start.\n- Larger slices: updates start exactly when another erase remains.\n- slicelength cannot underflow because the loop exits when it reaches zero.\n- Mutating slicelength is harmless because it is not used afterward.\n- The potentially dangerous final start +\u003d step remains eliminated.\n\nIt also removes the separate loop counter. The compiler would probably\noptimize the former i + 1, ++i mechanics away, but the new source expresses\nthe real state more directly: \"number of erasures remaining.\"\n\nThe unconditional while (true) is safe because entry is strictly guarded by\nslicelength \u003e 0, and the decrement guarantees eventual termination.\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "36341ba9ba53096a5c4cc7fe69be577430f69d04",
      "tree": "2de14ed7320e7e9b1db843a427ea770670640401",
      "parents": [
        "fb836a2f1fc0c30bf9f8959ab54a42d9337f5824"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Fri Jul 24 20:32:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 20:32:52 2026 -0400"
      },
      "message": "ci: test Python 3.15 (#6107)"
    },
    {
      "commit": "fb836a2f1fc0c30bf9f8959ab54a42d9337f5824",
      "tree": "5e8aafdabc902447347ecd80843784184963a871",
      "parents": [
        "85198b598fd4e369dd9d766598713ee2d9c8d0b3"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Fri Jul 24 17:38:59 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 17:38:59 2026 -0400"
      },
      "message": "ci: drop near-duplicate jobs (#6106)\n\nRemove ten jobs whose coverage is already provided by other jobs:\nduplicate ubuntu pypy/graalpy/3.11/3.14t runs, an intel-mac 3.11\nsmart_holder run, a windows job pinning the default MSVC runtime,\nsandwiched clang 14 and gcc 10/C++20 entries, and extra win32 and\nwin32-debug variants. Also delete the gcc PYBIND11_TEST_OVERRIDE steps,\ndead since gcc 12 left the matrix (the windows-2022 job still runs the\nsame exercise).\n\nAssisted-by: ClaudeCode:claude-fable-5"
    },
    {
      "commit": "85198b598fd4e369dd9d766598713ee2d9c8d0b3",
      "tree": "18a33b39b098a1d2986d8e761ca08155b8eaae38",
      "parents": [
        "7478df9420fbb1fe0db4fdfe032014c17fc66156"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Fri Jul 24 10:45:22 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 10:45:22 2026 -0400"
      },
      "message": "fix(ci): use the intended Python interpreter for CMake discovery (#6105)\n\n* fix(ci): pin the discovered Python to the venv/setup-python interpreter\n\nThe manylinux/musllinux images added Python 3.15 and dropped 3.13t;\nFindPython\u0027s version scan then picked /usr/local/bin/python3.15 over\nthe uv-created venv (Python_ROOT_DIR is only a hint). Similarly, the\nmacOS and Windows 3.14t jobs picked a system 3.14 over setup-python\u0027s\nfree-threaded interpreter. Pin the interpreter explicitly in both\nplaces, and drop the 3.13t manylinux jobs.\n\nAssisted-by: ClaudeCode:claude-fable-5\n\n* ci: use setup-python\u0027s python-path output instead of a locate step\n\nAssisted-by: ClaudeCode:claude-fable-5\n\n* Apply suggestions from code review\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crwgkio@gmail.com\u003e\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crwgkio@gmail.com\u003e"
    },
    {
      "commit": "7478df9420fbb1fe0db4fdfe032014c17fc66156",
      "tree": "3cdd9d93d8d137d1e7403f1f348f484343ef5988",
      "parents": [
        "34566e1d2ab190f38196d2c09ccd706fe4ccbeeb"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Thu Jul 23 01:40:11 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 01:40:11 2026 -0400"
      },
      "message": "fix(cmake): unset stale PYTHON_MODULE_DEBUG_POSTFIX and correct USE_PYTHON_INCLUDE_DIR variable (#6086)\n\nWhen the Python executable changes between CMake runs,\nPYTHON_MODULE_DEBUG_POSTFIX was not being unset alongside PYTHON_IS_DEBUG\nand PYTHON_MODULE_EXTENSION, allowing a stale postfix to survive interpreter\nchanges.\n\nIn the USE_PYTHON_INCLUDE_DIR block, the elseif branch checked\nPYTHON_INCLUDE_DIR (singular) but expanded PYTHON_INCLUDE_DIRS (plural),\nalways silently resolving to an empty string. Correct it to expand\n${PYTHON_INCLUDE_DIR}. Also add a Python3_INCLUDE_DIRS branch so the\noption works when pybind11NewTools resolves Python via the Python3\nfind-package component.\n\nAssisted-by: ClaudeCode:claude-fable-5"
    },
    {
      "commit": "34566e1d2ab190f38196d2c09ccd706fe4ccbeeb",
      "tree": "2e653c62c1e683a8a312f26a532c9f2deefe5ad4",
      "parents": [
        "28b98f2d39296651917c9a63acf1bd679ae0a40f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 15 22:51:27 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 15 22:51:27 2026 -0500"
      },
      "message": "chore(deps): bump soupsieve from 2.5 to 2.8.4 in /docs (#6100)\n\nBumps [soupsieve](https://github.com/facelessuser/soupsieve) from 2.5 to 2.8.4.\n- [Release notes](https://github.com/facelessuser/soupsieve/releases)\n- [Commits](https://github.com/facelessuser/soupsieve/compare/2.5...2.8.4)\n\n---\nupdated-dependencies:\n- dependency-name: soupsieve\n  dependency-version: 2.8.4\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "28b98f2d39296651917c9a63acf1bd679ae0a40f",
      "tree": "e3b0902d31bec62eb963e873c7a0f1502ab57318",
      "parents": [
        "7ca651c0e5e087a5d34c742c3c355726a4e9b8bb"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Wed Jul 08 23:31:36 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 23:31:36 2026 -0400"
      },
      "message": "ci: update cibuildwheel to v4.1 and pyodide to 314 (#6095)\n\n* ci: update cibuildwheel to v4.1 and pyodide to 314\n\nBump pypa/cibuildwheel from v3.4 to v4.1 across the Pyodide, iOS, and\nAndroid jobs. Move the Pyodide build to cp314-pyodide_wasm32\n(pyodide 314.0.0).\n\nDrop the iOS CIBW_SKIP: cp314-* workaround now that pypa/cibuildwheel#2494\nis resolved.\n\nAssisted-by: ClaudeCode:claude-opus-4.8\n\n* test: xfail array resize on numpy\u003c2.4 + Python 3.14\n\nRemoving the cp314 iOS skip surfaced a pre-existing numpy bug, not a\ncibuildwheel regression: numpy\u003c2.4 has a resize(refcheck\u003dTrue) regression\non Python 3.14 where the reference held by the bound function isn\u0027t\ndetected, so a resize that should raise instead succeeds and the later\nreshape rejects the non-square size. Fixed in numpy\u003e\u003d2.4, but the iOS test\nenvironment has no numpy wheel newer than 2.3.5.post1, so xfail the test\nfor that specific combination.\n\nAssisted-by: ClaudeCode:claude-opus-4.8\n\n* test: link numpy resize aliasing issue and trim comment\n\niOS numpy wheels updated to 2.5.0, so the xfail is a general numpy\u003c2.4 +\nPython 3.14 guard rather than iOS-specific. Reference numpy/numpy#30265.\n\nAssisted-by: ClaudeCode:claude-opus-4.8"
    },
    {
      "commit": "7ca651c0e5e087a5d34c742c3c355726a4e9b8bb",
      "tree": "20a05600cad173b8a2e6e4255e5d47a6431d379c",
      "parents": [
        "b57b4393ff92dfcea0da1b64eb359c8f900cbcec"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Wed Jul 08 16:45:20 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 08 16:45:20 2026 -0400"
      },
      "message": "chore(deps): update pre-commit hooks (#6099)\n\nupdates:\n- [github.com/astral-sh/ruff-pre-commit: v0.15.15 → v0.15.20](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.15...v0.15.20)\n- [github.com/adhtruong/mirrors-typos: v1.47.0 → v1.48.0](https://github.com/adhtruong/mirrors-typos/compare/v1.47.0...v1.48.0)\n- [github.com/PyCQA/pylint: v4.0.5 → v4.0.6](https://github.com/PyCQA/pylint/compare/v4.0.5...v4.0.6)\n- [github.com/python-jsonschema/check-jsonschema: 0.37.2 → 0.37.4](https://github.com/python-jsonschema/check-jsonschema/compare/0.37.2...0.37.4)\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "b57b4393ff92dfcea0da1b64eb359c8f900cbcec",
      "tree": "9376218a795c592453aa83ad59038ef0c21cc1ee",
      "parents": [
        "db92ad940f143a48ba8c422d6bfee7f536f35e6d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Jul 03 14:50:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 14:50:43 2026 -0700"
      },
      "message": "chore(deps): bump the actions group with 3 updates (#6098)\n\n* chore(deps): bump the actions group with 3 updates\n\nBumps the actions group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) and [pypa/cibuildwheel](https://github.com/pypa/cibuildwheel).\n\n\nUpdates `actions/checkout` from 6 to 7\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Commits](https://github.com/actions/checkout/compare/v6...v7)\n\nUpdates `astral-sh/setup-uv` from 8.1.0 to 8.2.0\n- [Release notes](https://github.com/astral-sh/setup-uv/releases)\n- [Commits](https://github.com/astral-sh/setup-uv/compare/v8.1.0...v8.2.0)\n\nUpdates `pypa/cibuildwheel` from 3.4 to 4.1\n- [Release notes](https://github.com/pypa/cibuildwheel/releases)\n- [Changelog](https://github.com/pypa/cibuildwheel/blob/main/docs/changelog.md)\n- [Commits](https://github.com/pypa/cibuildwheel/compare/v3.4...v4.1)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: actions\n- dependency-name: astral-sh/setup-uv\n  dependency-version: 8.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: actions\n- dependency-name: pypa/cibuildwheel\n  dependency-version: \u00274.1\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\n\n* ci: restore checkout v1 for i386 job\n\n---------\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "db92ad940f143a48ba8c422d6bfee7f536f35e6d",
      "tree": "32dbf9b2516e39e851b2cb294df4b872794e839e",
      "parents": [
        "84da0e25455a33634857f88491b72c9c835b88a7"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Mon Jun 29 00:38:56 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 00:38:56 2026 -0400"
      },
      "message": "revert: \"add life support to handles cast to string_view (#6092)\" (#6097)\n\nThis reverts commit 59d7cb28c1f5a014bb17ad4a8e80da2fb51a6159 (#6092).\n\n#6092 introduced regressions that are being addressed in #6096; reverting\n\nAssisted-by: ClaudeCode:claude-opus-4.8"
    },
    {
      "commit": "84da0e25455a33634857f88491b72c9c835b88a7",
      "tree": "c14ff2d3045c7cb5f7f7706c41d006eb8c412a34",
      "parents": [
        "3de0402476ed689052e6d709924755c52e901f5e"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Wed Jun 24 00:15:58 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 21:15:58 2026 -0700"
      },
      "message": "refactor: remove needless load_src alias in string_caster (#6093)\n\n`load_src` was a Python 2-era leftover. A removed branch used to reassign\nit to a temporary unicode object; since that was deleted with Python 2\nsupport, it is now an exact, never-reassigned alias of `src`. Use `src`\ndirectly.\n\nSpotted in review of #6092.\n\nAssisted-by: ClaudeCode:claude-opus-4.8"
    },
    {
      "commit": "3de0402476ed689052e6d709924755c52e901f5e",
      "tree": "097f96794d460ae4695b874912321692d8138a5b",
      "parents": [
        "085b66068af8ce82dab122a7b1c9cbc9e9ac99ea"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Tue Jun 23 23:49:20 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 23:49:20 2026 -0400"
      },
      "message": "chore: add agent files (#6082)\n\n* chore: add agent files\n\nAssisted-by: ClaudeCode:claude-opus-4.8\nSigned-off-by: Henry Schreiner \u003chenryfs@princeton.edu\u003e\n\n* fix: better AGENTS.md\n\nSigned-off-by: Henry Schreiner \u003chenryfs@princeton.edu\u003e\n\n* Apply suggestions from code review\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crwgkio@gmail.com\u003e\nCo-authored-by: Henry Schreiner \u003cHenrySchreinerIII@gmail.com\u003e\n\n---------\n\nSigned-off-by: Henry Schreiner \u003chenryfs@princeton.edu\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crwgkio@gmail.com\u003e"
    },
    {
      "commit": "085b66068af8ce82dab122a7b1c9cbc9e9ac99ea",
      "tree": "92b490f4d8e3d3ea039503602a9480adc11f6632",
      "parents": [
        "59d7cb28c1f5a014bb17ad4a8e80da2fb51a6159"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Tue Jun 23 21:48:26 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 21:48:26 2026 -0400"
      },
      "message": "fix: data race on last_storage_ptr_ cache in gil_safe_call_once_and_store (#6087)\n\nUnder free-threaded CPython (Py_GIL_DISABLED) the GIL provides no mutual\nexclusion, so the plain pointer last_storage_ptr_ was read and written\nconcurrently without synchronization, a C++ data race. Make it a\nstd::atomic\u003cT *\u003e.\n\nAlso reorder get_stored() to check is_last_storage_valid() before loading\nthe cached pointer. The writer publishes the pointer before setting the\nvalidity flag, so the flag must be observed first for correct\nacquire/release ordering.\n\nAssisted-by: ClaudeCode:claude-fable-5"
    },
    {
      "commit": "59d7cb28c1f5a014bb17ad4a8e80da2fb51a6159",
      "tree": "2c16d087a829a8f11d10682992adf11d2771bc3a",
      "parents": [
        "da3bdcad040c1c2da02358e0ff5e281e9e97348a"
      ],
      "author": {
        "name": "Charles Beattie",
        "email": "cbeattie@google.com",
        "time": "Wed Jun 24 02:44:39 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 23 21:44:39 2026 -0400"
      },
      "message": "fix: add life support to handles cast to string_view (#6092)\n\n* Fix handling of string_view to prevent GC\u0027ing strings before they are used.\n\n* style: pre-commit fixes\n\n* Update cast.h\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "da3bdcad040c1c2da02358e0ff5e281e9e97348a",
      "tree": "bff2fcdd3dd02b4cbf21847f7a8255f78baac379",
      "parents": [
        "99117da02050edef2802322031eac9c40cfc1872"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Wed Jun 17 08:16:49 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 08:16:49 2026 -0400"
      },
      "message": "chore(setup_helpers): remove dead cpp_flag_cache and fix parameter typo (#6085)\n\nRemove the module-level `cpp_flag_cache \u003d None` variable and its stale\ncomment \"Every call will cache the result\". The actual caching is handled\nby the `@lru_cache` decorator on `auto_cpp_level` directly below.\n\nAlso rename the typo\u0027d parameter `obg` to `obj` in `no_recompile`.\nNothing passes this argument by keyword, so there is no API break.\n\nPart of #6084\n\nAssisted-by: ClaudeCode:claude-sonnet-4-6"
    },
    {
      "commit": "99117da02050edef2802322031eac9c40cfc1872",
      "tree": "a3d3de03cfbe932ffd61d2e0e51c3dcd8722138c",
      "parents": [
        "f00aa6fe079a77e2cf9a114ebafb3847d75e72cc"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Wed Jun 17 08:16:04 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 08:16:04 2026 -0400"
      },
      "message": "chore(eval): drop Python 2 coding cookie prepended to evaluated source (#6089)\n\nThe `# -*- coding: utf-8 -*-` line prepended to every string passed to\nPyRun_String was a Python 2 workaround. Python 3\u0027s PyRun_String already\nassumes UTF-8 source encoding, so the cookie is dead weight — and\nharmful: it shifts all line numbers up by one in tracebacks and\nSyntaxErrors from evaluated code (a `raise` on line 2 would incorrectly\nappear as line 3).\n\nRemove the cookie and replace the stale comment with one that explains\nthe actual reason for the `std::string` conversion (need a C string for\nPyRun_String). No other location in eval.h uses this pattern\n(eval_file reads directly from a FILE*).\n\nAssisted-by: ClaudeCode:claude-fable-5"
    },
    {
      "commit": "f00aa6fe079a77e2cf9a114ebafb3847d75e72cc",
      "tree": "0cd1e3d0064bd350e347c635f83246ebcdd8f380",
      "parents": [
        "ff1a35cb849247dd14d5c6c9aefae45a7ab6f695"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Wed Jun 17 08:13:47 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 08:13:47 2026 -0400"
      },
      "message": "ci: drop boost from 32-bit mingw32 install (#6091)\n\n* ci: drop boost from 32-bit mingw32 install\n\nMSYS2 removed the mingw-w64-i686-boost package (32-bit i686 is being\nphased out), so the mingw32 matrix entry now fails at the pacman install\nstep with \"target not found: mingw-w64-i686-boost\". Boost is optional\ntest coverage (boost::optional / boost::variant casters, gated behind\nPYBIND11_TEST_BOOST); without it those tests are skipped and the rest of\nthe job builds and runs normally. Move boost to the mingw64 extra_install\nso the 64-bit job keeps that coverage.\n\nAssisted-by: ClaudeCode:claude-opus-4.8\n\n* Apply suggestion from @henryiii"
    },
    {
      "commit": "ff1a35cb849247dd14d5c6c9aefae45a7ab6f695",
      "tree": "bb463226e8dbee479146609331279afb9bfc1cd1",
      "parents": [
        "ec1d8762a8ed9d786ba6ef500c3d1e54d5016288"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Wed Jun 10 16:03:38 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 16:03:38 2026 -0400"
      },
      "message": "ci: update GraalPy from 24.2 to 25.0 (Python 3.12 based) (#6083)\n\n* ci: update GraalPy from 24.2 to 25.0 (Python 3.12 based)\n\n- Replace graalpy-24.2 with graalpy-25.0 in CI matrix\n- Replace graalpy-24.1 with graalpy-24.2 (shift older version up)\n- Remove dead GRAALPY_VERSION \u003c (24, 2) xfail guards from tests\n- Remove unused GRAALPY_VERSION from tests/env.py\n- Update internals.h comment to reference v25.0\n\nAssisted-by: OpenCode:glm-5\n\n* fix: use numpy 2.2.x for GraalPy 3.12 (graalpy312 wheels)\n\nnumpy 1.26.x only has graalpy311 wheels; GraalPy 25.0 (Python 3.12)\nrequires numpy 2.2.x which has graalpy312 wheels on the GraalVM index.\n\nAssisted-by: OpenCode:glm-5\n\n* fix: simplify numpy requirement for GraalPy (drop 3.11 branch)\n\nWe no longer test GraalPy 3.11, so the version split is unnecessary.\n\nAssisted-by: OpenCode:glm-5"
    },
    {
      "commit": "ec1d8762a8ed9d786ba6ef500c3d1e54d5016288",
      "tree": "cb93f2de17ed849bcaa3ee6822c525171b2ef86e",
      "parents": [
        "6079989cf70555d213add249cfb36dad14519791"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Sat Jun 06 11:06:45 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 11:06:45 2026 -0700"
      },
      "message": "chore(deps): update pre-commit hooks (#6079)\n\nupdates:\n- [github.com/pre-commit/mirrors-clang-format: v22.1.4 → v22.1.5](https://github.com/pre-commit/mirrors-clang-format/compare/v22.1.4...v22.1.5)\n- [github.com/astral-sh/ruff-pre-commit: v0.15.12 → v0.15.15](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.12...v0.15.15)\n- [github.com/pre-commit/mirrors-mypy: v1.20.2 → v2.1.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.20.2...v2.1.0)\n- [github.com/adhtruong/mirrors-typos: v1.46.0 → v1.47.0](https://github.com/adhtruong/mirrors-typos/compare/v1.46.0...v1.47.0)\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "6079989cf70555d213add249cfb36dad14519791",
      "tree": "701efb0bff2bb6489518dc17fa6c2ca303c6d880",
      "parents": [
        "46ebf5031b751f59337b498ce630df8659177492"
      ],
      "author": {
        "name": "Matti Picus",
        "email": "matti.picus@gmail.com",
        "time": "Wed May 27 18:07:53 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 08:07:53 2026 -0700"
      },
      "message": "Pypy testing no longer xfails (#6077)\n\n* test passes on PyPy macOS\n\n* adjust tests for pypy HEAD\n\n* fixes from review\n\n* pypy 7.3.23 was released, drop some PyPy testing\n\n* pin to pypy version 7.3.23\n\n* Restore xfail for cross-module translator platforms\n\nKeep the expected failure for Android and FreeBSD while limiting the PyPy-specific part to versions before 7.3.23. Android CIBW still raises RuntimeError for this test, matching the existing tracked platform issue.\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "46ebf5031b751f59337b498ce630df8659177492",
      "tree": "aee8932f774497abb998a63fcf55259822162684",
      "parents": [
        "f891299e6adb7f90155d979907d3787836dd47d9"
      ],
      "author": {
        "name": "ymwang78",
        "email": "wangym@gmail.com",
        "time": "Mon May 25 21:31:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 09:31:14 2026 -0400"
      },
      "message": "feat(subinterpreter): reusable PyThreadState via subinterpreter_thread_state (#6073)\n\n* feat(subinterpreter): add opt-in TLS-cached thread state mode\n\nsubinterpreter_scoped_activate previously created and destroyed a fresh\nPyThreadState on every activation when the calling OS thread was not\nalready running the target interpreter. Workloads that repeatedly\nre-enter the same sub-interpreter from the same thread therefore churn\nthread states and lose per-thread interpreter state between activations\n(see pybind/pybind11#6040).\n\nAdd an opt-in subinterpreter_thread_state::cached policy: on first use a\nPyThreadState is created and stored in OS-thread-local storage keyed by\nthe target interpreter; subsequent activations on that thread only swap\nit in/out and never destroy it. The default stays transient, so existing\nbehavior is unchanged.\n\nSince pybind11 does not control thread lifetime, cleanup is explicit:\nsubinterpreter::release_cached_thread_state() releases the calling\nthread\u0027s cached state for one interpreter, and the static\nrelease_all_cached_thread_states() releases all of the calling thread\u0027s\ncached states as an end-of-thread hook. The TLS map\u0027s destructor only\nfrees its own nodes and never touches the Python C API, so an\nunreleased state leaks rather than crashing at thread exit.\n\nIncludes test coverage and embedding docs.\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n\n* style: pre-commit fixes\n\n* refactor(subinterpreter): replace cached enum/TLS with subinterpreter_thread_state RAII\n\nAddress review feedback on the original \"cached\" mode by switching to an\nexplicit two-RAII design suggested by @b-pass:\n\n  \"Create a class ... to RAII-manage the PyThreadState but start its\n   lifetime in an already released state. You could create another\n   class (or modify scoped_activate) to scoped/RAII activate the\n   inactive threadstate.\"\n\nRemoved\n  - enum subinterpreter_thread_state { transient, cached } and the\n    defaulted ctor parameter on subinterpreter_scoped_activate.\n  - detail::subinterpreter_thread_state_cache thread_local map.\n  - subinterpreter::release_cached_thread_state() and\n    subinterpreter::release_all_cached_thread_states().\n\nThis eliminates: the hidden per-thread map, the \"release_all\" footgun\nacross pybind11 modules (the cache was module-local), and the implicit\n\"must not be active when called\" contract on the release functions.\n\nAdded\n  - Public class subinterpreter_thread_state that owns one PyThreadState\n    for a given subinterpreter on its constructing OS thread, created in\n    a released state (not current, no GIL). Non-copyable, non-movable\n    (PyThreadState is bound to its creating OS thread).\n  - subinterpreter_scoped_activate(subinterpreter_thread_state \u0026)\n    overload: swaps the owned PyThreadState in on entry, swaps it out\n    on exit, does not touch its lifetime.\n\nBehavior\n  - The existing subinterpreter_scoped_activate(subinterpreter const \u0026)\n    overload is unchanged (still transient: New on entry, Delete on\n    exit). All previously-working code keeps working.\n  - With subinterpreter_thread_state, one OS thread can alternate\n    between multiple subinterpreters and each PyThreadState is preserved\n    across activations -- the use case that gil_scoped_release/acquire\n    + a long-lived scoped_activate cannot solve alone (the per-thread\n    internals.tstate slot holds only one inactive tstate).\n  - The dtor of subinterpreter_thread_state guards against the\n    \"destroyed-while-active\" contract violation: if Swap reveals the\n    cached tstate was current, do not Swap back to a now-deleted\n    pointer (the safe-when-active fix b-pass requested for the old\n    release_* functions, applied at the natural location instead).\n\nLifetime contract is enforced by ordinary C++ scope: typical placement\nis `thread_local`. No new release/cleanup APIs are required.\n\nTests cover (a) tstate identity preserved across activations on a\nthread, (b) transient and reusing modes do not share state, (c)\ndifferent OS threads get distinct PyThreadStates, and (d) the\nmulti-subinterpreter alternation case.\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n\n* fix(subinterpreter): address review on #6073 (same-thread checks, test scoping)\n\nPer @b-pass\u0027s review:\n\n- ~subinterpreter_thread_state(): add a PYBIND11_DETAILED_ERROR_MESSAGES-\n  guarded check that destruction happens on the OS thread that created the\n  PyThreadState (same PyThread_get_thread_native_id pattern as ~subinterpreter),\n  failing with pybind11_fail otherwise.\n- subinterpreter_scoped_activate(subinterpreter_thread_state \u0026): add the\n  matching DETAILED_ERROR_MESSAGES check that activation happens on the\n  creating OS thread, enforcing the newly documented rule.\n- docs: document that activating a subinterpreter_thread_state on another OS\n  thread is illegal.\n- tests: keep each subinterpreter (and its subinterpreter_thread_state) in an\n  enclosing scope so destruction order is thread-state -\u003e subinterpreter -\u003e\n  unsafe_reset_internals_for_single_interpreter(). The previous top-level\n  declarations ran the reset while the subinterpreters were still alive, which\n  is the likely cause of the CI crashes.\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n\n* docs: fix codespell (re-used -\u003e reused) in embedding.rst\n\nCo-Authored-By: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.7 \u003cnoreply@anthropic.com\u003e\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "f891299e6adb7f90155d979907d3787836dd47d9",
      "tree": "49272c4c38d10051727dd4d7cf247b82bc039fdc",
      "parents": [
        "a2592ad9d6510a4d48b4706852ef812bb01401c4"
      ],
      "author": {
        "name": "ctmd1234567",
        "email": "wang195072@gmail.com",
        "time": "Mon May 25 12:04:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 21:04:39 2026 -0700"
      },
      "message": "Fix custom __str__ for enum_ (#6078)\n\n* fix: prioritize custom enum __str__\n\n* test: strengthen custom enum __str__ regression\n\n* refactor: move enum __str__ handling into enum_\n\nKeep class_::def() generic and let enum_ own the enum-specific\nbehavior for custom __str__ overloads. This avoids using the private\n__entries attribute as a runtime sentinel for py::enum_ while preserving\nthe prepend behavior that lets user-defined enum __str__ methods take\nprecedence over the generated default.\n\nOne caveat is that this applies to normal py::enum_ API usage. Code that\nintentionally upcasts an enum_ binding to class_\u0026 and then calls\nclass_::def(\"__str__\", ...) will bypass this enum_ override and keep the\ngeneric class_ behavior.\n\n* fix: avoid enum def ambiguity on MinGW\n\nRemove the inherited class_::def overload set from enum_ and add an explicit forwarding overload for non-string def() calls. GCC 15 on MinGW otherwise sees the duplicate dependent-base def(const char *, ...) template as ambiguous with enum_::def(const char *, ...), breaking the C++11 build.\n\n---------\n\nCo-authored-by: ctmd1234567 \u003cctmd1234567@users.noreply.github.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "a2592ad9d6510a4d48b4706852ef812bb01401c4",
      "tree": "65c0deeecb7aa9f754c3ae24adc4b7136a575813",
      "parents": [
        "5205df97fcb47015fac2feb06306c58ba80fd88f"
      ],
      "author": {
        "name": "jjuang-apple",
        "email": "jjuang@apple.com",
        "time": "Sun May 24 11:28:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 11:28:53 2026 -0700"
      },
      "message": "Apply -undefined dynamic_lookup to all Apple platforms (#6075)\n\n* Apply -undefined dynamic_lookup to all Apple platforms\n\n* style: pre-commit fixes\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "5205df97fcb47015fac2feb06306c58ba80fd88f",
      "tree": "48d391226718c80a5c70e072d6f43d44ef48d7cb",
      "parents": [
        "28bbda9ddf974f5f077059716bfbd3a3d77738bc"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed May 20 15:23:32 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 15:23:32 2026 -0700"
      },
      "message": "chore(deps): bump idna from 3.7 to 3.15 in /docs (#6074)\n\nBumps [idna](https://github.com/kjd/idna) from 3.7 to 3.15.\n- [Release notes](https://github.com/kjd/idna/releases)\n- [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.md)\n- [Commits](https://github.com/kjd/idna/compare/v3.7...v3.15)\n\n---\nupdated-dependencies:\n- dependency-name: idna\n  dependency-version: \u00273.15\u0027\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "28bbda9ddf974f5f077059716bfbd3a3d77738bc",
      "tree": "ac17c0136f138a8f3bab888cb4ea8544467e70e2",
      "parents": [
        "3160c82392900f824deeb875e903f84679c1c64d"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Mon May 18 21:36:16 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 21:36:16 2026 -0700"
      },
      "message": "[skip ci] test: reject shared_ptr casts for custom holders (#6069)\n\nLock down the current behavior discussed in issue #6064: py::cast() from std::shared_ptr\u003cT\u003e remains rejected for custom holder bindings that are not std::shared_ptr or py::smart_holder.\n\nThis extracts the incompatible-holder coverage from PR #6068 and adds a test shaped like issue #6064, while PR #6065 and PR #6066 explore alternative support paths."
    },
    {
      "commit": "3160c82392900f824deeb875e903f84679c1c64d",
      "tree": "5b2b2802b2a05cff4dc60218e4d9bf9b2154ee76",
      "parents": [
        "5a5f21deb6c1dbfe8fc36547419d188ce7ab30cc"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Mon May 18 11:31:19 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 11:31:19 2026 -0700"
      },
      "message": "ci: pin Ubuntu PyPy 3.11 to 7.3.21 (#6070)"
    },
    {
      "commit": "5a5f21deb6c1dbfe8fc36547419d188ce7ab30cc",
      "tree": "9e6e01e69e8a937dfdda21fa935b2e76d689ebbc",
      "parents": [
        "00a9c6244ca6213cf47ba4dd74654ca93fdfedbb"
      ],
      "author": {
        "name": "Matthias Klumpp",
        "email": "matthias@tenstral.net",
        "time": "Sat May 16 20:28:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 16 11:28:05 2026 -0700"
      },
      "message": "fix: Invert input/output context if a Python function is called from C++ (#6055)\n\nWhen the Callable itself is an input (parameter) to a C++ function, its\narguments are outputs (C++ passes them to the Python callback), and vice\nversa.\nTherefore, we must invert them if C++ calls a Python function, but keep\nthem the same in the other direction."
    },
    {
      "commit": "00a9c6244ca6213cf47ba4dd74654ca93fdfedbb",
      "tree": "4027d40d222e8bd27bcf457e2025c9a7da92fede",
      "parents": [
        "59a917db6b6664b390e52573fa6aa263856b1195"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Wed May 13 19:03:57 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 19:03:57 2026 -0700"
      },
      "message": "chore(deps): update pre-commit hooks (#6054)\n\n* chore(deps): update pre-commit hooks\n\nupdates:\n- [github.com/pre-commit/mirrors-clang-format: v22.1.2 → v22.1.4](https://github.com/pre-commit/mirrors-clang-format/compare/v22.1.2...v22.1.4)\n- [github.com/astral-sh/ruff-pre-commit: v0.15.9 → v0.15.12](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.9...v0.15.12)\n- [github.com/pre-commit/mirrors-mypy: v1.20.0 → v1.20.2](https://github.com/pre-commit/mirrors-mypy/compare/v1.20.0...v1.20.2)\n- [github.com/adhtruong/mirrors-typos: v1.45.0 → v1.46.0](https://github.com/adhtruong/mirrors-typos/compare/v1.45.0...v1.46.0)\n- [github.com/python-jsonschema/check-jsonschema: 0.37.1 → 0.37.2](https://github.com/python-jsonschema/check-jsonschema/compare/0.37.1...0.37.2)\n\n* fix: correct detailed error message comment wording\n\nClarify when detailed error messages are enabled and remove the typo caught by typos.\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "59a917db6b6664b390e52573fa6aa263856b1195",
      "tree": "91167e94f40cf5885783b908d176d913f9940102",
      "parents": [
        "81817aed7ebf4f93ae803a66faf8c7e97f069073"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed May 13 17:16:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 13 17:16:53 2026 -0700"
      },
      "message": "chore(deps): bump urllib3 from 2.6.3 to 2.7.0 in /docs (#6058)\n\nBumps [urllib3](https://github.com/urllib3/urllib3) from 2.6.3 to 2.7.0.\n- [Release notes](https://github.com/urllib3/urllib3/releases)\n- [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst)\n- [Commits](https://github.com/urllib3/urllib3/compare/2.6.3...2.7.0)\n\n---\nupdated-dependencies:\n- dependency-name: urllib3\n  dependency-version: 2.7.0\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "81817aed7ebf4f93ae803a66faf8c7e97f069073",
      "tree": "c8bb490cf1621154b89e06f89557df1a1f0d5368",
      "parents": [
        "9cc298a48157dc988f632503f252e52baa2ab97e"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Sat May 02 19:02:46 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 19:02:46 2026 -0700"
      },
      "message": "ci: remove the deadsnakes job (#6052)\n\nDrop the last remaining deadsnakes-based Linux job because it mostly duplicates the main Ubuntu coverage while failing in external Launchpad/PPA setup, and the old Valgrind/debug path it used to complement has already been retired.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "9cc298a48157dc988f632503f252e52baa2ab97e",
      "tree": "5a95d23ac8782d17a36c1bd36a95e6b662e0a022",
      "parents": [
        "c5b3ae8168b887c0beb1d2b387a7c082b8ccc39d"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Sat May 02 17:49:31 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 17:49:31 2026 -0700"
      },
      "message": "ci: pass explicit ARM64 Python artifacts on windows-11-arm (#6051)\n\nAvoid relying on Python_ROOT_DIR alone because CMake FindPython can still resolve the hosted x64 python.org install on the Windows ARM runner and then fail at link time with an x64/arm64 mismatch.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "c5b3ae8168b887c0beb1d2b387a7c082b8ccc39d",
      "tree": "9e2e5add7ca0556b329275c0214f54cf266982a6",
      "parents": [
        "ee1d83f6c134609df8d177b239115c034e5f9e6c"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Sat May 02 16:03:42 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 16:03:42 2026 -0700"
      },
      "message": "ci: pin PyPy 3.11 to 7.3.21 on macOS and Windows (#6050)\n\nTemporarily pin the two failing PyPy 3.11 jobs while investigating the PyPy 7.3.22 import regression.\n\nRefs #6049.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "ee1d83f6c134609df8d177b239115c034e5f9e6c",
      "tree": "51d5edc4c8c6f417066eacebdf82ac8f826abadb",
      "parents": [
        "0f8396e4fff99814a3b3f96cf30e1832c2d5f03a"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat May 02 13:14:44 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 13:14:44 2026 -0700"
      },
      "message": "chore(deps): bump the actions group with 2 updates (#6047)\n\nBumps the actions group with 2 updates: [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) and [scientific-python/upload-nightly-action](https://github.com/scientific-python/upload-nightly-action).\n\n\nUpdates `astral-sh/setup-uv` from 8.0.0 to 8.1.0\n- [Release notes](https://github.com/astral-sh/setup-uv/releases)\n- [Commits](https://github.com/astral-sh/setup-uv/compare/v8.0.0...v8.1.0)\n\nUpdates `scientific-python/upload-nightly-action` from 0.6.3 to 0.6.4\n- [Release notes](https://github.com/scientific-python/upload-nightly-action/releases)\n- [Commits](https://github.com/scientific-python/upload-nightly-action/compare/5748273c71e2d8d3a61f3a11a16421c8954f9ecf...e76cfec8a4611fd02808a801b0ff5a7d7c1b2d99)\n\n---\nupdated-dependencies:\n- dependency-name: astral-sh/setup-uv\n  dependency-version: 8.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: actions\n- dependency-name: scientific-python/upload-nightly-action\n  dependency-version: 0.6.4\n  dependency-type: direct:production\n  update-type: version-update:semver-patch\n  dependency-group: actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "0f8396e4fff99814a3b3f96cf30e1832c2d5f03a",
      "tree": "0445bb29d1ceeebe4f88df44e775454de7bad8e2",
      "parents": [
        "d4336108df0171e23774def1ff007c259a254d09"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Sat May 02 11:47:01 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 02 11:47:01 2026 -0700"
      },
      "message": "[skip ci] ci: schedule recurring CI and CIBW runs (#6048)\n\nRun ci.yml and tests-cibw.yml twice weekly so master bitrot is easier to spot and root-cause before weekend maintenance.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "d4336108df0171e23774def1ff007c259a254d09",
      "tree": "bb0bed87e1ff612a628479cc02e023d1f5f8cc90",
      "parents": [
        "678b6735e44fe9d7feac7ff31bc9c86d42c04613"
      ],
      "author": {
        "name": "Christoph Grüninger",
        "email": "foss@grueninger.de",
        "time": "Mon Apr 27 02:06:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 26 17:06:06 2026 -0700"
      },
      "message": "[ci] Drop GitHub Action seanmiddleditch/gha-setup-ninja (#6044)\n\nFrom the GitHub Action README: \"This action is no longer\nnecessary, as ninja is now included on all default\nGitHub runner instances.\""
    },
    {
      "commit": "678b6735e44fe9d7feac7ff31bc9c86d42c04613",
      "tree": "bf725482c6e6681cf385a4c324908c191e1b2b20",
      "parents": [
        "ae05b1556632cf1469ee99a9d3836a8fb861da8d"
      ],
      "author": {
        "name": "Eisuke Kawashima",
        "email": "e.kawaschima+github@gmail.com",
        "time": "Sun Apr 19 07:10:30 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 18 15:10:30 2026 -0700"
      },
      "message": "build: support Eigen 5 (#6036)\n\n* build: support Eigen 5\n\nfix #6034\n\n* build: probe Eigen 3 and 5 separately in CMake config mode\n\nAvoid relying on package-specific handling of a bounded version range when discovering Eigen through Eigen3Config.cmake.\n\nMade-with: Cursor\n\n* [skip ci] build: clarify Eigen 5 module fallback comment\n\nExplain that the MODULE-mode fallback only exists for older Eigen 3 setups so the remaining fallback path does not look like an unresolved Eigen 5 issue.\n\nMade-with: Cursor\n\n* [skip ci] docs: add Eigen 5 entry to v3.0.4 changelog\n\nDocument the Eigen 5 CMake package detection fix in the 3.0.4 release notes before merging the PR.\n\nMade-with: Cursor\n\n---------\n\nCo-authored-by: Eisuke Kawashima \u003ce-kwsm@users.noreply.github.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "ae05b1556632cf1469ee99a9d3836a8fb861da8d",
      "tree": "60ab6babceac79fc1b59658c5550dc8abc12f3b7",
      "parents": [
        "7029f99cc62beb9f8c2b13dfaaa1ef04e040cb60"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Sun Apr 19 01:47:16 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 18 11:47:16 2026 -0700"
      },
      "message": "[skip ci] docs: add v3.0.4 changelog updates. (#6041)\n\nDocument the post-v3.0.3 fixes and CI changes ahead of the patch release so the release prep can be reviewed before the version bump work.\n\nMade-with: Cursor"
    },
    {
      "commit": "7029f99cc62beb9f8c2b13dfaaa1ef04e040cb60",
      "tree": "92626e4bc90e441f1ca1203761da233ee721e1e7",
      "parents": [
        "288913638bb2da563f1c39e7d07071c2f21bfb25"
      ],
      "author": {
        "name": "Agis Kounelis",
        "email": "36283973+kounelisagis@users.noreply.github.com",
        "time": "Thu Apr 16 07:08:06 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 21:08:06 2026 -0700"
      },
      "message": "fix: segfault when moving `scoped_ostream_redirect` (#6033)\n\n* fix: segfault when moving `scoped_ostream_redirect`\n\nThe default move constructor left the stream (`std::cout`) pointing at\nthe moved-from `pythonbuf`, whose internal buffer and streambuf pointers\nwere nulled by the move. Any subsequent write through the stream\ndereferenced null, causing a segfault.\n\nReplace `\u003d default` with an explicit move constructor that re-points\nthe stream to the new buffer and disarms the moved-from destructor.\n\n* fix: mark move constructor noexcept to satisfy clang-tidy\n\n* fix: use bool flag instead of nullptr sentinel for moved-from state\n\nUsing `old \u003d\u003d nullptr` as the moved-from sentinel was incorrect because\nnullptr is a valid original rdbuf() value (e.g. `std::ostream os(nullptr)`).\nReplace with an explicit `active` flag so the destructor correctly\nrestores nullptr buffers.\n\nAdd tests for the nullptr-rdbuf edge case.\n\n* fix: remove noexcept and propagate active flag from source\n\n- Remove noexcept: pythonbuf inherits from std::streambuf whose move\n  is not guaranteed nothrow on all implementations. Suppress clang-tidy\n  with NOLINTNEXTLINE instead.\n- Initialize active from other.active so that moving an already\n  moved-from object does not incorrectly re-activate the redirect.\n- Only rebind the stream and disarm the source when active.\n\n* test: add unflushed ostream redirect regression\n\nCover the buffered-before-move case for `scoped_ostream_redirect`, which still crashes despite the current move fix. This gives the PR a direct reproducer for the remaining bug path.\n\nMade-with: Cursor\n\n* fix: disarm moved-from pythonbuf after redirect move\n\nThe redirect guard now survives moves, but buffered output could still remain in the moved-from `pythonbuf` and be flushed during destruction through moved-out Python handles. Rebuild the destination put area from the transferred storage and clear the source put area so unflushed bytes follow the active redirect instead of crashing in the moved-from destructor.\n\nMade-with: Cursor\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "288913638bb2da563f1c39e7d07071c2f21bfb25",
      "tree": "012521e093edc10174f9eb56d00a8b36f41d6e0f",
      "parents": [
        "0db7f72dc29af735f7242da170d5325d4f48ee2a"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Sun Apr 12 01:45:57 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 11 22:45:57 2026 -0700"
      },
      "message": "ci: bump setup-uv to maintained tag scheme (#6035)\n\nThe old vX tags have been dropped to (force) (usually) better security practices. Dependabot will not update, however, leaving this v7 tag forever. Manually updating now.\n\nSee https://github.com/astral-sh/setup-uv/issues/830\n\nCommitted via https://github.com/asottile/all-repos"
    },
    {
      "commit": "0db7f72dc29af735f7242da170d5325d4f48ee2a",
      "tree": "c63bce699ef902c90847ceba8f2f5aa10a371b0a",
      "parents": [
        "4158dcfe7d1d9926911d090dc92750d5270b52d8"
      ],
      "author": {
        "name": "Max Bachmann",
        "email": "kontakt@maxbachmann.de",
        "time": "Sun Apr 12 05:02:27 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 11 20:02:27 2026 -0700"
      },
      "message": "Handle result from PyObject_VisitManagedDict (#6032)\n\n* Handle result from PyObject_VisitManagedDict\n\n* add unit test\n\n* style: pre-commit fixes\n\n* use different variable name\n\nThis avoids a warning on msvc about Py_Visit shadowing the vret variable.\n\n* skip test_get_referrers on unsupported runtimes\n\nThe managed-dict referrer check is only known to work on CPython 3.13.13+ and 3.14.4+, while earlier releases and non-CPython interpreters can report different traversal behavior.\n\nMade-with: Cursor\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "4158dcfe7d1d9926911d090dc92750d5270b52d8",
      "tree": "002ff69aa491c3fc2e5a38f7022432f59e0f445b",
      "parents": [
        "98e50b702d9ab784ec918399aaa20adcfd1af9a9"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Sat Apr 11 13:45:53 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 11 13:45:53 2026 -0700"
      },
      "message": "chore(deps): update pre-commit hooks (#6029)\n\n* chore(deps): update pre-commit hooks\n\nupdates:\n- [github.com/pre-commit/mirrors-clang-format: v22.1.0 → v22.1.2](https://github.com/pre-commit/mirrors-clang-format/compare/v22.1.0...v22.1.2)\n- [github.com/astral-sh/ruff-pre-commit: v0.15.4 → v0.15.9](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.4...v0.15.9)\n- [github.com/pre-commit/mirrors-mypy: v1.19.1 → v1.20.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.19.1...v1.20.0)\n- [github.com/codespell-project/codespell: v2.4.1 → v2.4.2](https://github.com/codespell-project/codespell/compare/v2.4.1...v2.4.2)\n- [github.com/adhtruong/mirrors-typos: v1.44.0 → v1.45.0](https://github.com/adhtruong/mirrors-typos/compare/v1.44.0...v1.45.0)\n- [github.com/python-jsonschema/check-jsonschema: 0.37.0 → 0.37.1](https://github.com/python-jsonschema/check-jsonschema/compare/0.37.0...0.37.1)\n\n* fix: allow NumPy writeable spelling in typos\n\nNumPy uses `writeable` in public flags and API names, so typos should treat that spelling as intentional instead of blocking pre-commit runs.\n\nMade-with: Cursor\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "98e50b702d9ab784ec918399aaa20adcfd1af9a9",
      "tree": "276a2748fdedaf8e6a59f56dead02ddfa956770a",
      "parents": [
        "bfd6cbda2f6cb9f750254dd493d257612c39f343"
      ],
      "author": {
        "name": "Dustin Spicuzza",
        "email": "dustin@virtualroadside.com",
        "time": "Mon Apr 06 11:50:55 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 08:50:55 2026 -0700"
      },
      "message": "fix: avoid copy constructor instantiation in shared_ptr fallback cast (#6028)\n\n* tests: add regressions for shared_ptr reference_internal fallback\n\n* fix: avoid copy constructor instantiation in shared_ptr fallback cast\n\n* Remove stray empty line\n\n* tests: rename PyTorch shared_ptr regression test files\n\n* refactor: add cast_non_owning helper for reference-like casts\n\nName the non-owning generic cast path so callers do not have to rediscover that\nreference-like policies must pass null copy/move constructor callbacks. This\nkeeps the shared_ptr reference_internal fallback self-documenting and points\nfuture maintainers toward the safe API.\n\nMade-with: Cursor\n\n* tests: guard deprecated-copy warning probes with __has_warning\n\nUse __has_warning for the Clang-only regression test so older compiler jobs skip\nunsupported warning groups instead of failing with -Wunknown-warning-option. A\nsimple __clang_major__ \u003e\u003d 13 guard would be shorter, but it bakes in a version\ncutoff; __has_warning is slightly more verbose while being more robust to\nvendor builds, backports, and future packaging differences.\n\nMade-with: Cursor\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "bfd6cbda2f6cb9f750254dd493d257612c39f343",
      "tree": "0a12378cec808fd83f9a9225675862526ac9ca6b",
      "parents": [
        "d2413f5bca91a2c091b9b0801e0c1b5bf089e31d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Mar 31 23:43:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 23:43:00 2026 -0400"
      },
      "message": "chore(deps): bump the actions group with 2 updates (#6027)"
    },
    {
      "commit": "d2413f5bca91a2c091b9b0801e0c1b5bf089e31d",
      "tree": "6dd097f033f786939fc00d484b0880f1f0d3347b",
      "parents": [
        "50930ae7652c0f381072abfaaeb317d5375ff9d1"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Tue Mar 31 10:35:57 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 20:35:57 2026 -0700"
      },
      "message": "docs: add v3.0.3 and v3.1.0 changelog updates. (#6023)\n\n* [skip ci] docs: add v3.0.3 and v3.1.0 changelog updates.\n\nMade-with: Cursor\n\n* [skip ci] docs: set v3.0.3 release date: March 31, 2026"
    },
    {
      "commit": "50930ae7652c0f381072abfaaeb317d5375ff9d1",
      "tree": "ce1c18d2a187db046aa32bb0ab20358e7412941d",
      "parents": [
        "609d2c812dfa4cc64a7c7692e35311854b017cf4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Mar 30 12:04:38 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 12:04:38 2026 -0700"
      },
      "message": "chore(deps): bump pygments from 2.17.2 to 2.20.0 in /docs (#6024)\n\nBumps [pygments](https://github.com/pygments/pygments) from 2.17.2 to 2.20.0.\n- [Release notes](https://github.com/pygments/pygments/releases)\n- [Changelog](https://github.com/pygments/pygments/blob/master/CHANGES)\n- [Commits](https://github.com/pygments/pygments/compare/2.17.2...2.20.0)\n\n---\nupdated-dependencies:\n- dependency-name: pygments\n  dependency-version: 2.20.0\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "609d2c812dfa4cc64a7c7692e35311854b017cf4",
      "tree": "afe916d1a788c62a50009e93f01be5f41f7c3997",
      "parents": [
        "83f71d8b82e9bf1360cfc926afd70c40412f469d"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Mon Mar 30 10:49:45 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 29 20:49:45 2026 -0700"
      },
      "message": "Fix heap-buffer-overflow in `pythonbuf` with undersized buffers (#6019)\n\n* Fix heap-buffer-overflow in pythonbuf with undersized buffers (gh-5886)\n\nThe _sync() UTF-8 remainder logic can leave pptr() past the end of\nthe allocated buffer when buf_size \u003c 4: after moving up to 3 bytes\nof an incomplete UTF-8 sequence to the front, pbump(remainder) pushes\npptr() beyond epptr() and the buffer boundary.  The next overflow()\nthen writes out of bounds.\n\nFix by clamping the buffer size to a minimum of 4 in the constructor,\nensuring the maximum UTF-8 remainder (3 bytes) plus the overflow slot\n(1 byte) always fits within the allocated buffer.\n\nMade-with: Cursor\n\n* Avoid C++14 ODR-use linker error for minimum_buffer_size\n\nstd::max takes arguments by const\u0026, which ODR-uses the static constexpr\nmember and requires an out-of-line definition in C++14. Replace with a\nternary expression that uses the value without taking its address.\n\nMade-with: Cursor"
    },
    {
      "commit": "83f71d8b82e9bf1360cfc926afd70c40412f469d",
      "tree": "24cb19c72d09119368d1ce1c9fa9002f506078e3",
      "parents": [
        "524d72b36dad6ece7e389b709d5081976de42630"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Mon Mar 30 10:49:27 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 29 20:49:27 2026 -0700"
      },
      "message": "fix: detect virtual inheritance in add_base to prevent pointer offset crash (#6017)\n\nVirtual inheritance places the base subobject at a dynamic offset, but\nload_impl Case 2a uses reinterpret_cast which assumes a fixed offset.\nThis caused segfaults when dispatching inherited methods through virtual\nbases (e.g. SftVirtDerived2::name()).\n\nAdd an is_static_downcastable SFINAE trait that detects whether\nstatic_cast\u003cDerived*\u003e(Base*) is valid. When it is not (virtual\ninheritance), set multiple_inheritance \u003d true in add_base to force the\nimplicit_casts path, which correctly adjusts pointers at runtime.\n\nRemove the workaround .def(\"name\", \u0026SftVirtDerived2::name) from\ntest_smart_ptr.cpp that was papering over the issue.\n\nMade-with: Cursor"
    },
    {
      "commit": "524d72b36dad6ece7e389b709d5081976de42630",
      "tree": "466096a85ce59774057eea883cbb7b237c40e885",
      "parents": [
        "e8cead16267e039304fc59766262b6b6d16ad4f2"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Mon Mar 30 10:17:22 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 29 20:17:22 2026 -0700"
      },
      "message": "fix: strdup `\"self\"` arg in `def_property_static`, partially revert #6010 (gh-5976) (#6015)\n\n* fix: strdup args added after initialize_generic in def_property_static (gh-5976)\n\n`def_property_static` calls `process_attributes::init` on already-initialized\nfunction records (after `initialize_generic`\u0027s strdup loop has run).\nArgs added at this stage (e.g. \"self\" via `append_self_arg_if_needed`) remain\nas string literals, so `destruct()` would call `free()` on them.\n\nFix by strdup\u0027ing name/descr of any args appended by the late\n`process_attributes::init` call. Root cause introduced by gh-5486.\n\nMade-with: Cursor\n\n* Partially revert gh-6010: remove py_is_finalizing() workarounds\n\nNow that the root cause (free of string literals in def_property_static,\ngh-5976) is fixed in the previous commit, the py_is_finalizing() guards\nintroduced in gh-6010 are no longer needed:\n\n- tp_dealloc_impl: remove early return during finalization (was leaking\n  all function records instead of properly destroying them)\n- destruct(): remove guard around arg.value.dec_ref()\n- common.h: remove py_is_finalizing() helper (no remaining callers)\n\nThe genuine fix from gh-6010 (PyObject_Free + Py_DECREF ordering in\ntp_dealloc_impl) is retained.\n\nMade-with: Cursor\n\n* test: add embedding test for py::enum_ across interpreter restart (gh-5976)\n\npy::enum_ is the primary trigger for gh-5976 because its constructor\ncreates properties via def_property_static / def_property_readonly_static,\nwhich call process_attributes::init on already-initialized function records.\nYet none of the existing embedding tests used py::enum_ at all.\n\nAdd an PYBIND11_EMBEDDED_MODULE with py::enum_ and a test case that imports\nit, finalize/reinitializes the interpreter, and re-imports it. This exercises\nthe def_property_static code path that was fixed in the preceding commit.\n\nNote: on Python 3.14.2 (and likely 3.12+), tp_dealloc_impl is not called\nduring Py_FinalizeEx for function record PyObjects — they simply leak because\ntypes are effectively immortalized. As a result, this test cannot trigger the\noriginal free()-on-string-literal crash on this Python version. However, it\nremains valuable as a regression guard: on Python builds where finalization\ndoes clean up function records (or if CPython changes this behavior), the\ntest would catch the crash. It also verifies that py::enum_ survives\ninterpreter restart correctly, which was previously untested.\n\nMade-with: Cursor\n\n* test: skip enum restart test on Python 3.12 (pre-existing crash)\n\nMade-with: Cursor\n\n* Add test_standalone_enum_module.py, standalone_enum_module.cpp\n\n* Make standalone_enum_module.cpp more similar to #5976 reproducer. Also fix clang-tidy error.\n\n* This crashes when testing locally:\n\n( cd /wrk/forked/pybind11/tests \u0026\u0026 PYTHONPATH\u003d/wrk/bld/pybind11_gcc_v3.14.2_df793163d58_default/lib /wrk/bld/pybind11_gcc_v3.14.2_df793163d58_default/TestVenv/bin/python3 -m pytest test_standalone_enum_module.py )\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d test session starts \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nplatform linux -- Python 3.14.2, pytest-9.0.2, pluggy-1.6.0\ninstalled packages of interest: build\u003d\u003d1.4.2 numpy\u003d\u003d2.4.3 scipy\u003d\u003d1.17.1\nC++ Info: 13.3.0 C++20 __pybind11_internals_v12_system_libstdcpp_gxx_abi_1xxx_use_cxx11_abi_1__ PYBIND11_SIMPLE_GIL_MANAGEMENT\u003dFalse\nrootdir: /wrk/forked/pybind11/tests\nconfigfile: pytest.ini\nplugins: timeout-2.4.0, xdist-3.8.0\ncollected 1 item\n\ntest_standalone_enum_module.py F                                         [100%]\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d FAILURES \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n________________________ test_enum_import_exit_no_crash ________________________\n\n    def test_enum_import_exit_no_crash():\n        # Modeled after reproducer under issue #5976\n\u003e       env.check_script_success_in_subprocess(\n            f\"\"\"\n            import sys\n            sys.path.insert(0, {os.path.dirname(env.__file__)!r})\n            import standalone_enum_module as m\n            assert m.SomeEnum.__class__.__name__ \u003d\u003d \"pybind11_type\"\n            \"\"\",\n            rerun\u003d1,\n        )\n\ntest_standalone_enum_module.py:10:\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\ncode \u003d \u0027import sys\\nsys.path.insert(0, \\\u0027/wrk/forked/pybind11/tests\\\u0027)\\nimport standalone_enum_module as m\\nassert m.SomeEnum.__class__.__name__ \u003d\u003d \"pybind11_type\"\u0027\n\n    def check_script_success_in_subprocess(code: str, *, rerun: int \u003d 8) -\u003e None:\n        \"\"\"Runs the given code in a subprocess.\"\"\"\n        import os\n        import subprocess\n        import sys\n        import textwrap\n\n        if ANDROID or IOS or sys.platform.startswith(\"emscripten\"):\n            pytest.skip(\"Requires subprocess support\")\n\n        code \u003d textwrap.dedent(code).strip()\n        try:\n            for _ in range(rerun):  # run flakily failing test multiple times\n                subprocess.check_output(\n                    [sys.executable, \"-c\", code],\n                    cwd\u003dos.getcwd(),\n                    stderr\u003dsubprocess.STDOUT,\n                    text\u003dTrue,\n                )\n        except subprocess.CalledProcessError as ex:\n\u003e           raise RuntimeError(\n                f\"Subprocess failed with exit code {ex.returncode}.\\n\\n\"\n                f\"Code:\\n\"\n                f\"```python\\n\"\n                f\"{code}\\n\"\n                f\"```\\n\\n\"\n                f\"Output:\\n\"\n                f\"{ex.output}\"\n            ) from None\nE           RuntimeError: Subprocess failed with exit code -6.\nE\nE           Code:\nE           ```python\nE           import sys\nE           sys.path.insert(0, \u0027/wrk/forked/pybind11/tests\u0027)\nE           import standalone_enum_module as m\nE           assert m.SomeEnum.__class__.__name__ \u003d\u003d \"pybind11_type\"\nE           ```\nE\nE           Output:\nE           munmap_chunk(): invalid pointer\n\n_          \u003d 0\ncode       \u003d \u0027import sys\\nsys.path.insert(0, \\\u0027/wrk/forked/pybind11/tests\\\u0027)\\nimport standalone_enum_module as m\\nassert m.SomeEnum.__class__.__name__ \u003d\u003d \"pybind11_type\"\u0027\nos         \u003d \u003cmodule \u0027os\u0027 (frozen)\u003e\nrerun      \u003d 1\nsubprocess \u003d \u003cmodule \u0027subprocess\u0027 from \u0027/wrk/cpython_installs/v3.14.2_df793163d58_default/lib/python3.14/subprocess.py\u0027\u003e\nsys        \u003d \u003cmodule \u0027sys\u0027 (built-in)\u003e\ntextwrap   \u003d \u003cmodule \u0027textwrap\u0027 from \u0027/wrk/cpython_installs/v3.14.2_df793163d58_default/lib/python3.14/textwrap.py\u0027\u003e\n\nenv.py:68: RuntimeError\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d short test summary info \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\nFAILED test_standalone_enum_module.py::test_enum_import_exit_no_crash - Runti...\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d 1 failed in 0.23s \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nERROR: completed_process.returncode\u003d1\n\n* Add \"Added in PR #6015\" comments, for easy reference back to this PR\n\n* test: use PYBIND11_CATCH2_SKIP_IF for Python 3.12 enum restart skip\n\nReplace #if/#else/#endif preprocessor guard with runtime\nPYBIND11_CATCH2_SKIP_IF so the test is always compiled and\nshows [ SKIPPED ] in output on Python 3.12.\n\nMade-with: Cursor\n\n* fix: suppress MSVC C4127 in PYBIND11_CATCH2_SKIP_IF macro\n\nThe constant condition in PYBIND11_CATCH2_SKIP_IF triggers MSVC\nwarning C4127 (conditional expression is constant), which becomes\na build error under /WX.\n\nMade-with: Cursor"
    },
    {
      "commit": "e8cead16267e039304fc59766262b6b6d16ad4f2",
      "tree": "6591c904adc9a9b32e96aec00e0a61bedd65ad2d",
      "parents": [
        "70b6fd30f4c8f0bbdba04b6bb776ffb063bc8681"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Sun Mar 29 22:03:41 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 29 08:03:41 2026 -0700"
      },
      "message": "Harden `PYBIND11_MODULE_PYINIT` and `get_internals()` against crashes during module init (#6018)\n\n* Wrap ensure_internals() in try-catch in PYBIND11_MODULE_PYINIT\n\nPreviously, ensure_internals() was called without exception handling\nin the PyInit_* function (PYBIND11_MODULE_PYINIT), while the same call\nin PYBIND11_MODULE_EXEC was already wrapped in try-catch. On MSVC,\na C++ exception propagating through the extern \"C\" PyInit_* boundary\nis undefined behavior, which can manifest as an access violation\ninstead of a clean error message. This is a potential contributor to\ncrashes like gh-5993. Wrap the entire PyInit body in try/catch using\nthe existing PYBIND11_CATCH_INIT_EXCEPTIONS pattern.\n\nMade-with: Cursor\n\n* Add nullptr guards in get_internals() for better crash diagnostics\n\nAdd explicit null checks after get_pp() and create_pp_content_once()\nin get_internals(), calling pybind11_fail() with descriptive messages.\nThese guards convert potential null-pointer dereferences (which produce\nunhelpful access-violation crashes, especially on Windows) into clear\nruntime_error messages that can be caught and reported as ImportError\nby the try-catch added in the previous commit.\n\nMade-with: Cursor"
    },
    {
      "commit": "70b6fd30f4c8f0bbdba04b6bb776ffb063bc8681",
      "tree": "96566ef1aea37e9b64d8eb6dd49d908a183caad0",
      "parents": [
        "3b62426106e475a98346645727750e07ad0cdb6e"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Sun Mar 29 22:03:31 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 29 08:03:31 2026 -0700"
      },
      "message": "Fix TSS key exhaustion in implicitly_convertible() (gh-5975) (#6020)\n\nReplace `static thread_specific_storage\u003cint\u003e` with `thread_local bool`\nin the implicit conversion reentrancy guard. Since implicitly_convertible\nis a template function, each unique \u003cInputType, OutputType\u003e pair created\nits own TSS key via PyThread_tss_create(). Projects with hundreds of\nmodules and many implicit conversions could exhaust PTHREAD_KEYS_MAX\n(1024 on Linux, 512 on macOS), especially on Python 3.12+ where CPython\nitself consumes more TSS keys for subinterpreter support.\n\nthread_local bool is safe here because:\n- bool is trivially destructible, so it works on all C++11 platforms\n  including older macOS (the concern that motivated the TSS approach in\n  PR #5777 applied only to types with non-trivial destructors needing\n  __cxa_thread_atexit runtime support)\n- Each thread gets its own copy, so it is thread-safe for free-threading\n- Subinterpreter sharing is benign: the guard prevents recursive implicit\n  conversions on the same thread regardless of which interpreter is active\n- The v3.0.0 code already used thread_local bool under Py_GIL_DISABLED\n\nThis effectively reverts the core change from PR #5777 while keeping\nthe non-copyable/non-movable set_flag guard.\n\nMade-with: Cursor"
    },
    {
      "commit": "3b62426106e475a98346645727750e07ad0cdb6e",
      "tree": "7dde48f3adb8798d8d081069480e47e5c45d391c",
      "parents": [
        "c0bbd8b7098b1a9a341462c725940bf936aa0aac"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Fri Mar 27 17:02:05 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 27 11:02:05 2026 +0100"
      },
      "message": "Fix `static_pointer_cast` build failure with virtual inheritance in `holder_caster_foreign_helpers.h` (#6014)\n\n* Add regression test for #5989: static_pointer_cast fails with virtual inheritance\n\nWhen a class uses virtual inheritance and its holder type is shared_ptr,\npassing a shared_ptr of the derived type as a method argument triggers\na compilation error because static_pointer_cast cannot downcast through\na virtual base (dynamic_pointer_cast is needed instead).\n\nMade-with: Cursor\n\n* Fix #5989: use dynamic_pointer_cast for virtual inheritance in esft downcast\n\nReplace the unconditional static_pointer_cast in set_via_shared_from_this\nwith a SFINAE-dispatched esft_downcast helper that falls back to\ndynamic_pointer_cast when static_cast through a virtual base is ill-formed.\n\nAlso add a workaround in the test binding (.def(\"name\") on SftVirtDerived2)\nfor a separate pre-existing issue with inherited method dispatch through\nvirtual bases.\n\nMade-with: Cursor"
    },
    {
      "commit": "c0bbd8b7098b1a9a341462c725940bf936aa0aac",
      "tree": "303fbf748f2410204ab6d6217273786893d35b80",
      "parents": [
        "e4fbc05701ab41ebc927f558f2e047aef3d2c90d"
      ],
      "author": {
        "name": "Aaron Gokaslan",
        "email": "aaronGokaslan@gmail.com",
        "time": "Thu Mar 26 19:21:32 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 16:21:32 2026 -0700"
      },
      "message": "fix: bind noexcept and ref-qualified methods from unregistered base classes (#5992)\n\n* Strip noexcept from cpp17 function type bindings\n\n* Fix a bug and increase test coverage\n\n* Does this fix it?\n\n* Silence clang-tidy issue\n\n* Simplify method adapter with macro and add missing rvalue adaptors + tests\n\n* Supress clang-tidy errors\n\n* Improve test coverage\n\n* Add additional static assert\n\n* Try to resolve MSVC C4003 warning\n\n* Simplify method adaptor into 2 template instatiations with enable_if_t\n\n* Fix ambiguous STL template\n\n* Close remaining qualifier consistency gaps for member pointer bindings.\n\nA production-code review after #2234 showed that ref-qualified member pointers were still inconsistently handled across def_buffer, vectorize, and overload_cast, so this adds the missing overloads with focused tests for each newly-supported signature.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Clarify why def_buffer/vectorize omit rvalue-qualified overloads.\n\nThese comments were added while reviewing the qualifier coverage follow-up, to document that buffer/vectorized calls operate on existing Python-owned instances and should not move-from self.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Add compile-only overload_cast guard for ref-qualified methods.\n\nThis was added as a maintenance follow-up to the qualifier-consistency work, so future changes that introduce overload_cast ambiguity or wrong ref/noexcept resolution fail at compile time.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Refactor overload_cast_impl qualifier overloads with a macro.\n\nAs part of the qualifier-consistency maintenance follow-up, this reduces duplication in overload_cast_impl while preserving the same ref/noexcept coverage and keeping pedantic-clean macro expansion.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Expose __cpp_noexcept_function_type to Python tests and use explicit skip guards.\n\nThis replaces hasattr-based optional assertions with skipif-gated noexcept-only tests so skipped coverage is visible in pytest output while keeping non-noexcept checks always active.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Add static_assert in method_adaptor to guard that T is a member function pointer.\n\nSuggested by @Skylion007 in PR #5992 review comment [T007].\n\nMade-with: Cursor\n\n* automatic clang-format change (because of #6002)\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "e4fbc05701ab41ebc927f558f2e047aef3d2c90d",
      "tree": "4ca8ae3caccae0391d5ef5ea7776c1143bf319c6",
      "parents": [
        "ce9f83c700cb559232295559a3279b411ed9a552"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Mar 26 09:16:56 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 09:16:56 2026 -0700"
      },
      "message": "chore(deps): bump requests from 2.32.4 to 2.33.0 in /docs (#6013)\n\nBumps [requests](https://github.com/psf/requests) from 2.32.4 to 2.33.0.\n- [Release notes](https://github.com/psf/requests/releases)\n- [Changelog](https://github.com/psf/requests/blob/main/HISTORY.md)\n- [Commits](https://github.com/psf/requests/compare/v2.32.4...v2.33.0)\n\n---\nupdated-dependencies:\n- dependency-name: requests\n  dependency-version: 2.33.0\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ce9f83c700cb559232295559a3279b411ed9a552",
      "tree": "afb6d2d544cd151d765d1f613c142ad29d14f8e2",
      "parents": [
        "2d1723c0d6e3ea3f10600cac310cbf6e77867596"
      ],
      "author": {
        "name": "Dustin Spicuzza",
        "email": "dustin@virtualroadside.com",
        "time": "Tue Mar 24 10:58:42 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 07:58:42 2026 -0700"
      },
      "message": "Fix crash in def_readwrite for non-smart-holder properties of smart-holder classes (v2) (#6008)\n\n* Add tests that cause crash in def_readwrite\n\n- Occurs with non-smart-holder property of smart-holder class\n\n* Fix crash in def_readwrite for non-smart-holder properties of smart-holder classes\n\n* Use default policy\n\n* Address PR comments\n\n* Add test for cast error path\n\n* style: pre-commit fixes\n\n* Revert \"Use default policy\"\n\nThis reverts commit b299f321044ff946701a0020a4549f3eb0525b83.\n\n* Disable test_shared_ptr_return_for_unique_ptr_holder when PYBIND11_TEST_SMART_HOLDER\u003dON\n\n* Add counterexample\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "2d1723c0d6e3ea3f10600cac310cbf6e77867596",
      "tree": "76a86ab00d18fd211f2c7725b9a7b86e7a2693e0",
      "parents": [
        "dd95d53f0a55ba166940f2a67c07150521202b4b"
      ],
      "author": {
        "name": "Marco Garten",
        "email": "mgarten@lbl.gov",
        "time": "Mon Mar 23 21:25:38 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 23 21:25:38 2026 -0700"
      },
      "message": "Resolve ambiguous factory spec. with nvcc+GCC (#6011)\n\nExplicitly specify the 4th template parameter in the\nsingle-factory partial specialization of `factory` to\ndisambiguate it from the dual-factory specialization\nwhen compiled with nvcc + GCC 14. Fixes #5565.\n\nCo-authored-by: Oz \u003coz-agent@warp.dev\u003e"
    },
    {
      "commit": "dd95d53f0a55ba166940f2a67c07150521202b4b",
      "tree": "4197563c853e4bd303bedecba1c6840a386d45f1",
      "parents": [
        "0a45af2531d5d8a05fddac62dea25cfa222966ce"
      ],
      "author": {
        "name": "Yury Matveev",
        "email": "43314316+yamatveev@users.noreply.github.com",
        "time": "Tue Mar 24 05:14:00 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 11:14:00 2026 +0700"
      },
      "message": "Fix memory leak: clear managed dict in pybind11_object_dealloc on Python 3.13+          (#5999)\n\n* fix: clear managed dict in pybind11_object_dealloc on Python 3.13+\n\nOn Python 3.14, PyObject_GC_Del (tp_free) no longer implicitly clears\nthe managed dict of objects with Py_TPFLAGS_MANAGED_DICT. Without an\nexplicit PyObject_ClearManagedDict() call before tp_free(), objects\nstored in the __dict__ of py::dynamic_attr() instances have their\nrefcounts permanently abandoned, causing memory leaks — capsule\ndestructors for numpy arrays (and other objects) never run.\n\nAdds a regression test: stores a py::capsule in the __dict__ of a\nDynamicClass instance and asserts the capsule destructor is called\nwhen the instance is deleted.\n\n* [tests]: mark test_dynamic_attr_dealloc_frees_dict_contents to be strict\u003dFalse xfail on PYPY\n\n* [docs]: clarify Python version comments in pybind11_object_dealloc\n\nDistinguish between when the API is available (3.13+, where\nPyObject_ClearManagedDict was introduced) and when the leak actually\nmanifests (3.14+, where tp_free stopped implicitly clearing the\nmanaged dict).\n\n---------\n\nCo-authored-by: Yury Matveev \u003cyury.matveev@desy.de\u003e"
    },
    {
      "commit": "0a45af2531d5d8a05fddac62dea25cfa222966ce",
      "tree": "d2dcd9db9197267164393f28f21019256e3312e5",
      "parents": [
        "1c72409f7ff218726b8142d0d03417ccdc32ce0f"
      ],
      "author": {
        "name": "Itamar Oren",
        "email": "itamarost@gmail.com",
        "time": "Mon Mar 23 20:59:26 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 23 20:59:26 2026 -0700"
      },
      "message": "gh-5991: Fix segfault during finalization related to function_record (#6010)\n\n* gh-5991: Fix segfault during finalization related to function_record\n\nThis patch was developed with assistance from  Claude Code Opus 4.6\n\nHere\u0027s Claude\u0027s explanation of the crash mechanism and some reasoning for the difficulty to repro:\n\n`tp_dealloc_impl` calls `cpp_function::destruct` which:\n1. Calls `std::free()` on function_record string members (`name`, `doc`, `signature`)\n2. Calls `arg.value.dec_ref()` on default argument values\n3. Calls `delete rec` on the function_record\n\nBut it never calls `PyObject_Free(self)` or `Py_DECREF(Py_TYPE(self))`, which are\nrequired for heap types.\n\nDuring `_Py_Finalize`, final GC collects the heap types (which survive module dict\nclearing via `tp_mro` self-references). This triggers a massive cascade:\n`type_dealloc → property_dealloc → meth_dealloc → tp_dealloc_impl → destruct`.\n\nAt scale (~1,200+ function_records), the volume of `delete`/`free` calls corrupts\nheap metadata, causing subsequent `std::free()` to receive garbage pointers → SEGV.\n\n* Add detail::py_is_finalizing() wrapper to deduplicate version-guarded #ifdef blocks\n\nAlso fixes clang-tidy readability-implicit-bool-conversion warnings.\n\nMade-with: Cursor\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "1c72409f7ff218726b8142d0d03417ccdc32ce0f",
      "tree": "d75f575533b45f65481a3d2a3a3ddf71d73ba81f",
      "parents": [
        "4d51aefc2c4d7daa0445c2a383dafe49b9b5eda0"
      ],
      "author": {
        "name": "Henry Schreiner",
        "email": "HenrySchreinerIII@gmail.com",
        "time": "Sun Mar 22 17:27:20 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 22 14:27:20 2026 -0700"
      },
      "message": "chore: some minor CPython API cleanup (#6005)\n\n* chore: use PyType_GetFlags\n\nSigned-off-by: Henry Schreiner \u003chenryfs@princeton.edu\u003e\n\n* chore: use public VectorCall in 3.9+\n\nSigned-off-by: Henry Schreiner \u003chenryfs@princeton.edu\u003e\n\n---------\n\nSigned-off-by: Henry Schreiner \u003chenryfs@princeton.edu\u003e"
    },
    {
      "commit": "4d51aefc2c4d7daa0445c2a383dafe49b9b5eda0",
      "tree": "3137b1980b66165aa767eaf8294e68436cffb066",
      "parents": [
        "cd538ed1184d41cf685dd4da81c1eca80d24f353"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Sun Mar 22 14:23:00 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 22 14:23:00 2026 -0700"
      },
      "message": "chore(deps): update pre-commit hooks (#6002)\n\n* chore(deps): update pre-commit hooks\n\nupdates:\n- [github.com/pre-commit/mirrors-clang-format: v21.1.8 → v22.1.0](https://github.com/pre-commit/mirrors-clang-format/compare/v21.1.8...v22.1.0)\n- [github.com/astral-sh/ruff-pre-commit: v0.14.14 → v0.15.4](https://github.com/astral-sh/ruff-pre-commit/compare/v0.14.14...v0.15.4)\n- [github.com/adhtruong/mirrors-typos: v1.42.3 → v1.44.0](https://github.com/adhtruong/mirrors-typos/compare/v1.42.3...v1.44.0)\n- [github.com/PyCQA/pylint: v4.0.4 → v4.0.5](https://github.com/PyCQA/pylint/compare/v4.0.4...v4.0.5)\n- [github.com/python-jsonschema/check-jsonschema: 0.36.1 → 0.37.0](https://github.com/python-jsonschema/check-jsonschema/compare/0.36.1...0.37.0)\n\n* style: pre-commit fixes\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "cd538ed1184d41cf685dd4da81c1eca80d24f353",
      "tree": "e9bba99f87b79417063f6092661973853fd972e9",
      "parents": [
        "9d8c57fee240f486af4da7abfbb9de4a06530419"
      ],
      "author": {
        "name": "Malcolm Smith",
        "email": "smith@chaquo.com",
        "time": "Mon Mar 02 20:03:46 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 02 15:03:46 2026 -0500"
      },
      "message": "Re-enable Android tests in CIBW workflow (#6001)\n\n* Re-enable Android tests in CIBW workflow\n\n* Skip subprocess tests on Android\n\n* Remove Android workarounds no longer necessary with current cibuildwheel version\n\n* Skip more subprocess tests on Android"
    },
    {
      "commit": "9d8c57fee240f486af4da7abfbb9de4a06530419",
      "tree": "1d1ca85af97c78cd1f5add94633f87d9fc85e09c",
      "parents": [
        "4a77b97725e310903a45e98177ac660e1ad9b5de"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sun Mar 01 08:34:07 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 01 08:34:07 2026 -0500"
      },
      "message": "chore(deps): bump the actions group with 3 updates (#6000)\n\n"
    },
    {
      "commit": "4a77b97725e310903a45e98177ac660e1ad9b5de",
      "tree": "7c222127deb3ed0d73e6d1c2d0898c151f414858",
      "parents": [
        "1a863647c5dc4f2b39602cede1710d35fe9e42d8"
      ],
      "author": {
        "name": "Yaakov Selkowitz",
        "email": "yselkowi@redhat.com",
        "time": "Sun Feb 22 23:49:34 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Feb 22 20:49:34 2026 -0800"
      },
      "message": "Move tomlkit dependency to dev group (#5990)\n\ntomlkit is used only in the packaging tests which are not ordinarily run as\npart of the normal workflow of a user or downstream packager.\n\nSigned-off-by: Yaakov Selkowitz \u003cyselkowi@redhat.com\u003e"
    },
    {
      "commit": "1a863647c5dc4f2b39602cede1710d35fe9e42d8",
      "tree": "3d6fa5b908e806ab9257f53a3de606b968c71036",
      "parents": [
        "ac286c932f9c627f6fbfebb1c01dd47ab203d101"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Tue Feb 17 14:03:35 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 16 23:03:35 2026 -0800"
      },
      "message": "[ci skip] fix(tests): make async callback test deterministic (#5986)\n\nReplace the fixed sleep in test_async_callbacks with a bounded wait for all expected callback results, so detached worker scheduling no longer causes sporadic CI failures.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "ac286c932f9c627f6fbfebb1c01dd47ab203d101",
      "tree": "92eb19a4a8f8159e7fb92bf42bbaacc689f77e68",
      "parents": [
        "ccb7129f54fcef8db14c7e662cec4ae98ad13541"
      ],
      "author": {
        "name": "Aaron Gokaslan",
        "email": "aaronGokaslan@gmail.com",
        "time": "Tue Feb 17 02:00:56 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 16 23:00:56 2026 -0800"
      },
      "message": "internals: optimize std::unordered_map internals with noexcept (#5960)\n\n"
    },
    {
      "commit": "ccb7129f54fcef8db14c7e662cec4ae98ad13541",
      "tree": "6a8926204eb51e63a2a802fcc812c86c824db276",
      "parents": [
        "e8e8d6ab22f39938607f31d457d4d359c130f078"
      ],
      "author": {
        "name": "Scott Wolchok",
        "email": "swolchok@meta.com",
        "time": "Mon Feb 16 23:00:21 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 16 23:00:21 2026 -0800"
      },
      "message": "Improve performance of enum_ operators by going back to specific implementation (#5887)\n\n* Improve performance of enum_ operators by going back to specific implementation\n\ntest_enum needs a patch because ops are now overloaded and this affects their docstrings.\n\n* outline call_impl to save on code size\n\nThis does cause more move constructions, as shown by the needed update to test_copy_move. Up to reviewers whether they want more code size or more moves.\n\n* add function_ref.h to PYBIND11_HEADERS.\n\n* Update test_copy_move tests with C++17 passing values just so we can see mostly-not-red tests\n\n* Remove stray TODO\n\n* fix clang-tidy\n\n* fix clang-tidy again. add function_ref.h to test_files.py\n\n* Add static assertion for function_ref lifetime safety in call_impl\n\nAdd a static_assert to document and enforce that function_ref is\ntrivially copyable, ensuring safe pass-by-value usage. This also\ndocuments the lifetime safety guarantees: function_ref is created\nfrom cap-\u003ef which lives in the capture object, and is only used\nsynchronously within call_impl without being stored beyond its scope.\n\n* Add #undef cleanup for enum operator macros\n\nUndefine all enum operator macros after their last use to prevent\nmacro pollution and follow the existing code pattern. This matches\nthe cleanup pattern used for the previous enum operator macros.\n\n* Rename PYBIND11_THROW to PYBIND11_ENUM_OP_THROW_TYPE_ERROR\n\nRename the macro to be more specific and avoid potential clashes with\npublic macros. The new name clearly indicates it\u0027s scoped to enum\noperations and describes its purpose (throwing a type error).\n\n* Clarify comments in function_ref.h\n\nReplace vague comments about \u0027extensions to \u003cfunctional\u003e\u0027 and \u0027functions\u0027\nwith a clearer description that this is a header-only class template\nsimilar to std::function but with non-owning semantics. This makes it\nclear that it\u0027s template-only and requires no additional library linking.\n\n---------\n\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "e8e8d6ab22f39938607f31d457d4d359c130f078",
      "tree": "1f2a877780cd4f8ee799f9ab8e33634af33d8753",
      "parents": [
        "2448bc5853c8191d8b50250433084683887d0067"
      ],
      "author": {
        "name": "Michael Carlstrom",
        "email": "rmc@carlstrom.com",
        "time": "Mon Feb 16 23:00:01 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 16 23:00:01 2026 -0800"
      },
      "message": "Expand float and complex strict mode to allow ints and ints/float (for PEP 484 compatibility). (#5879)\n\n* init\n\nSigned-off-by: Michael Carlstrom \u003crmc@carlstrom.com\u003e\n\n* Add constexpr to is_floating_point check\n\nThis is known at compile time so it can be constexpr\n\n* Allow noconvert float to accept int\n\n* Update noconvert documentation\n\n* Allow noconvert complex to accept int and float\n\n* Add complex strict test\n\n* style: pre-commit fixes\n\n* Update unit tests so int, becomes double.\n\n* style: pre-commit fixes\n\n* remove if (constexpr)\n\nSigned-off-by: Michael Carlstrom \u003crmc@carlstrom.com\u003e\n\n* fix spelling error\n\n* bump order in #else\n\n* Switch order in c++11 only section\n\nSigned-off-by: Michael Carlstrom \u003crmc@carlstrom.com\u003e\n\n* ci: trigger build\n\n* ci: trigger build\n\n* Allow casting from float to int\n\nThe int type caster allows anything that implements __int__ with explicit exception of the python float. I can\u0027t see any reason for this.\nThis modifies the int casting behaviour to accept a float.\nIf the argument is marked as noconvert() it will only accept int.\n\n* tests for py::float into int\n\n* Update complex_cast tests\n\n* Add SupportsIndex to int and float\n\n* style: pre-commit fixes\n\n* fix assert\n\n* Update docs to mention other conversions\n\n* fix pypy __index__ problems\n\n* style: pre-commit fixes\n\n* extract out PyLong_AsLong __index__ deprecation\n\nSigned-off-by: Michael Carlstrom \u003crmc@carlstrom.com\u003e\n\n* style: pre-commit fixes\n\n* Add back env.deprecated_call\n\nSigned-off-by: Michael Carlstrom \u003crmc@carlstrom.com\u003e\n\n* remove note\n\nSigned-off-by: Michael Carlstrom \u003crmc@carlstrom.com\u003e\n\n* remove untrue comment\n\nSigned-off-by: Michael Carlstrom \u003crmc@carlstrom.com\u003e\n\n* fix noconvert_args\n\nSigned-off-by: Michael Carlstrom \u003crmc@carlstrom.com\u003e\n\n* resolve error\n\nSigned-off-by: Michael Carlstrom \u003crmc@carlstrom.com\u003e\n\n* Add comment\n\nSigned-off-by: Michael Carlstrom \u003crmc@carlstrom.com\u003e\n\n* [skip ci]\n\ntests: Add overload resolution test for float/int breaking change\n\nAdd test_overload_resolution_float_int() to explicitly test the breaking\nchange where int arguments now match float overloads when registered first.\n\nThe existing tests verify conversion behavior (int -\u003e float, int/float -\u003e complex)\nbut do not test overload resolution when both float and int overloads exist.\nThis test fills that gap by:\n\n- Testing that float overload registered before int overload matches int(42)\n- Testing strict mode (noconvert) overload resolution breaking change\n- Testing complex overload resolution with int/float/complex overloads\n- Documenting the breaking change explicitly\n\nThis complements existing tests which verify \u0027can it convert?\u0027 by testing\n\u0027which overload wins when multiple can convert?\u0027\n\n* Add test to verify that custom __index__ objects (not PyLong) work correctly with complex conversion. These should be consistent across CPython, PyPy, and GraalPy.\n\n* Improve comment clarity for PyPy __index__ handling\n\nReplace cryptic \u0027So: PYBIND11_INDEX_CHECK(src.ptr())\u0027 comment with\nclearer explanation of the logic:\n\n- Explains that we need to call PyNumber_Index explicitly on PyPy\n  for non-PyLong objects\n- Clarifies the relationship to the outer condition: when convert\n  is false, we only reach this point if PYBIND11_INDEX_CHECK passed\n  above\n\nThis makes the code more maintainable and easier to understand\nduring review.\n\n* Undo inconsequential change to regex in test_enum.py\n\nDuring merge, HEAD\u0027s regex pattern was kept, but master\u0027s version is preferred.\nThe order of ` ` and `\\|` in the character class is arbitrary. Keep master\u0027s order\n(already fixed in PR #5891; sorry I missed looking back here when working on 5891).\n\n* test_methods_and_attributes.py: Restore existing `m.overload_order(1.1)` call and clearly explain the behavior change.\n\n* Reject float → int conversion even in convert mode\n\nEnabling implicit float → int conversion in convert mode causes\nsilent truncation (e.g., 1.9 → 1). This is dangerous because:\n\n1. It\u0027s implicit - users don\u0027t expect truncation when calling functions\n2. It\u0027s silent - no warning or error\n3. It can hide bugs - precision loss is hard to detect\n\nThis change restores the explicit rejection of PyFloat_Check for integer\ncasters, even in convert mode. This is more in line with Python\u0027s behavior\nwhere int(1.9) must be explicit.\n\nNote that the int → float conversion in noconvert mode is preserved,\nas that\u0027s a safe widening conversion.\n\n* Revert test changes that sidestepped implicit float→int conversion\n\nThis reverts all test modifications that were made to accommodate\nimplicit float→int conversion in convert mode. With the production\ncode change that explicitly rejects float→int conversion even in\nconvert mode, these test workarounds are no longer needed.\n\nChanges reverted:\n- test_builtin_casters.py: Restored cant_convert(3.14159) and\n  np.float32 conversion with deprecated_call wrapper\n- test_custom_type_casters.py: Restored TypeError expectation for\n  m.ints_preferred(4.0)\n- test_methods_and_attributes.py: Restored TypeError expectation\n  for m.overload_order(1.1)\n- test_stl.py: Restored float literals (2.0) that were replaced with\n  strings to avoid conversion\n- test_factory_constructors.py: Restored original constructor calls\n  that were modified to avoid float→int conversion\n\nAlso removes the unused avoid_PyLong_AsLong_deprecation fixture\nand related TypeVar imports, as all uses were removed.\n\n* Replace env.deprecated_call() with pytest.deprecated_call()\n\nThe env.deprecated_call() function was removed, but two test cases\nstill reference it. Replace with pytest.deprecated_call(), which is\nthe standard pytest context manager for handling deprecation warnings.\n\nSince we already require pytest\u003e\u003d6 (see tests/requirements.txt), the\ncompatibility function is obsolete and pytest.deprecated_call() is\navailable.\n\n* Update test expectations for swapped NoisyAlloc overloads\n\nPR 5879 swapped the order of NoisyAlloc constructor overloads:\n- (int i, double) is now placement new (comes first)\n- (double d, double) is now factory pointer (comes second)\n\nThis swap is necessary because pybind11 tries overloads in order\nuntil one matches. With int → float conversion now allowed:\n\n- create_and_destroy(4, 0.5): Without the swap, (double d, double)\n  would match first (since int → double conversion is allowed),\n  bypassing the more specific (int i, double) overload. With the\n  swap, (int i, double) matches first (exact match), which is\n  correct.\n\n- create_and_destroy(3.5, 4.5): (int i, double) fails (float → int\n  is rejected), then (double d, double) matches, which is correct.\n\nThe swap ensures exact int matches are preferred over double matches\nwhen an int is provided, which is the expected overload resolution\nbehavior.\n\nUpdate the test expectations to match the new overload resolution\norder.\n\n* Resolve clang-tidy error:\n\n/__w/pybind11/pybind11/include/pybind11/cast.h:253:46: error: repeated branch body in conditional chain [bugprone-branch-clone,-warnings-as-errors]\n  253 |         } else if (PyFloat_Check(src.ptr())) {\n      |                                              ^\n/__w/pybind11/pybind11/include/pybind11/cast.h:258:10: note: end of the original\n  258 |         } else if (convert || PYBIND11_LONG_CHECK(src.ptr()) || PYBIND11_INDEX_CHECK(src.ptr())) {\n      |          ^\n/__w/pybind11/pybind11/include/pybind11/cast.h:283:16: note: clone 1 starts here\n  283 |         } else {\n      |                ^\n\n* Add test coverage for __index__ and __int__ edge cases: incorrectly returning float\n\nThese tests ensure that:\n- Invalid return types (floats) are properly rejected\n- The fallback from __index__ to __int__ works correctly in convert mode\n- noconvert mode correctly prevents fallback when __index__ fails\n\n* Minor comment-only changes: add PR number, for easy future reference\n\n* Ensure we are not leaking a Python error is something is wrong elsewhere (e.g. UB, or bug in Python beta testing).\n\nSee also: https://github.com/pybind/pybind11/pull/5879#issuecomment-3521099331\n\n* [skip ci] Bump PYBIND11_INTERNALS_VERSION to 12 (for PRs 5879, 5887, 5960)\n\n---------\n\nSigned-off-by: Michael Carlstrom \u003crmc@carlstrom.com\u003e\nCo-authored-by: gentlegiantJGC \u003cgentlegiantJGC@users.noreply.github.com\u003e\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e"
    },
    {
      "commit": "2448bc5853c8191d8b50250433084683887d0067",
      "tree": "08f67085714636b85a1b1df763ce3e2087987afb",
      "parents": [
        "45fab4087eaaff234227a10cf7845e8b07f28a98"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Tue Feb 17 12:12:56 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 16 21:12:56 2026 -0800"
      },
      "message": "[skip ci] Bump version to v3.1.0a0 (#5987)\n\n"
    },
    {
      "commit": "45fab4087eaaff234227a10cf7845e8b07f28a98",
      "tree": "ae06f7475b3c3c2e9ea29ae2398e4a1ed75f81e1",
      "parents": [
        "44a0cd241e74c01152fc5871e0e536d3f802850f"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Tue Feb 17 11:31:46 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 16 20:31:46 2026 -0800"
      },
      "message": "Update version number to v3.0.2 (final) and set release date in changelog.md to February 16, 2026 (#5985)\n\n"
    },
    {
      "commit": "44a0cd241e74c01152fc5871e0e536d3f802850f",
      "tree": "fe08ca99206e7fca01dd9f90cf03e1cd31bedcce",
      "parents": [
        "3ae5a173c54ab64339ad4a6c57557896b8bad6f9"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Tue Feb 17 00:33:30 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 16 09:33:30 2026 -0800"
      },
      "message": "[ci skip] docs/changelog.md updates for 3.0.2, to account for 5 additional PRs (#5984)\n\n"
    },
    {
      "commit": "3ae5a173c54ab64339ad4a6c57557896b8bad6f9",
      "tree": "6c0b925fbbb52627e688c6642d7958e7433119f5",
      "parents": [
        "5f2c678916ce2890e51333e0b684eb443e8848ed"
      ],
      "author": {
        "name": "Xuehai Pan",
        "email": "XuehaiPan@pku.edu.cn",
        "time": "Tue Feb 10 13:14:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 09 21:14:07 2026 -0800"
      },
      "message": "Add fallback implementation of `PyCriticalSection_BeginMutex` for Python 3.13t (#5981)\n\n* Add failback implementation of `PyCriticalSection_BeginMutex` for Python 3.13t\n\n* Add comment for Python version\n\n* Use `_PyCriticalSection_BeginSlow`\n\n* Add forward declaration\n\n* Fix forward declaration\n\n* Remove always true condition `defined(PY_VERSION_HEX)`\n\n* Detect musllinux\n\n* Add manylinux test\n\n* Use direct mutex locking for Python 3.13t\n\n`_PyCriticalSection_BeginSlow` is a private CPython function not exported\non Linux. For Python \u003c 3.14.0rc1, use direct `mutex.lock()`/`mutex.unlock()`\ninstead of critical section APIs.\n\n* Empty commit to trigger CI\n\n* Empty commit to trigger CI\n\n* Empty commit to trigger CI\n\n* Run apt update before apt install\n\n* Remove unnecessary prefix\n\n* Add manylinux test with Python 3.13t\n\n* Simplify pycritical_section with std::unique_lock fallback for Python \u003c 3.14\n\n* Fix potential deadlock in make_iterator_impl for Python 3.13t\n\nRefactor pycritical_section into a unified class with internal version\nchecks instead of using a type alias fallback. Skip locking in\nmake_iterator_impl for Python \u003c 3.14.0rc1 to avoid deadlock during\ntype registration, as pycritical_section cannot release the mutex\nduring Python callbacks without PyCriticalSection_BeginMutex.\n\n* Add reference for xfail message"
    },
    {
      "commit": "5f2c678916ce2890e51333e0b684eb443e8848ed",
      "tree": "87f0969d11d4a74146cbbb024bb2a85faa46f15c",
      "parents": [
        "8f68ecd32c8e18d3b064dbf0ea5fc31a6cb37e9a"
      ],
      "author": {
        "name": "Daniel Simon",
        "email": "dansimon09@gmail.com",
        "time": "Sun Feb 08 15:04:46 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Feb 08 15:04:46 2026 -0800"
      },
      "message": "Add helpers to array that return the size and strides as a std::span (#5974)\n\n* Add helper functions to pybind11::array to return the shape and strides as a std::span. These functions are hidden with macros unless PYBIND11_CPP20 is defined and the \u003cspan\u003e include has been found.\n\n* style: pre-commit fixes\n\n* tests: Add unit tests for shape_span() and strides_span()\n\nAdd comprehensive unit tests for the new std::span helper functions:\n- Test 0D, 1D, 2D, and 3D arrays\n- Verify spans match regular shape()/strides() methods\n- Test that spans can be used to construct new arrays\n- Tests are conditionally compiled only when PYBIND11_HAS_SPAN is defined\n\n* Use __cpp_lib_span feature test macro instead of __has_include\n\nReplace __has_include(\u003cspan\u003e) check with __cpp_lib_span feature test macro\nto resolve ambiguity where some pre-C++20 systems might have a global\nheader called \u003cspan\u003e that isn\u0027t the C++20 std::span.\n\nThe check is moved after \u003cversion\u003e is included, consistent with how\n__cpp_lib_char8_t is handled.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Fix: Use py::ssize_t instead of ssize_t in span tests\n\nOn Windows/MSVC, ssize_t is not available in the standard namespace\nwithout proper includes. Use py::ssize_t (the pybind11 typedef) instead\nto ensure cross-platform compatibility.\n\nFixes compilation errors on:\n- Windows/MSVC 2022 (C++20)\n- GCC 10 (C++20)\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "8f68ecd32c8e18d3b064dbf0ea5fc31a6cb37e9a",
      "tree": "429f082bb32615e0584a86ab8ac8372bf430fbab",
      "parents": [
        "4d7d02a8e528f3d3ba14d9b10b813557b2e9d0e2"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Mon Feb 02 17:16:53 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Feb 02 17:16:53 2026 -0800"
      },
      "message": "chore(deps): update pre-commit hooks (#5982)\n\nupdates:\n- [github.com/astral-sh/ruff-pre-commit: v0.14.10 → v0.14.14](https://github.com/astral-sh/ruff-pre-commit/compare/v0.14.10...v0.14.14)\n- [github.com/Lucas-C/pre-commit-hooks: v1.5.5 → v1.5.6](https://github.com/Lucas-C/pre-commit-hooks/compare/v1.5.5...v1.5.6)\n- [github.com/adhtruong/mirrors-typos: v1.41.0 → v1.42.3](https://github.com/adhtruong/mirrors-typos/compare/v1.41.0...v1.42.3)\n- [github.com/python-jsonschema/check-jsonschema: 0.36.0 → 0.36.1](https://github.com/python-jsonschema/check-jsonschema/compare/0.36.0...0.36.1)\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "4d7d02a8e528f3d3ba14d9b10b813557b2e9d0e2",
      "tree": "9845d0479c76404bc80a3727b3ef92e9de51b3dd",
      "parents": [
        "e7754de037fe6bc9910e1b09691c7d0ca2ee3057"
      ],
      "author": {
        "name": "Sam Gross",
        "email": "colesbury@gmail.com",
        "time": "Mon Feb 02 01:02:50 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Feb 01 22:02:50 2026 -0800"
      },
      "message": "Fix race condition with py::make_key_iterator in free threading (#5971)\n\n* Fix race condition with py::make_key_iterator in free threading\n\nThe creation of the iterator class needs to be synchronized.\n\n* style: pre-commit fixes\n\n* Use PyCriticalSection_BeginMutex instead of recursive mutex\n\n* style: pre-commit fixes\n\n* Make pycritical_section non-copyable and non-movable\n\nThe pycritical_section class is a RAII wrapper that manages a Python\ncritical section lifecycle:\n- Acquires the critical section in the constructor via\n  PyCriticalSection_BeginMutex\n- Releases it in the destructor via PyCriticalSection_End\n- Holds a reference to a pymutex\n\nAllowing copy or move operations would be dangerous:\n\n1. Copy: Both the original and copied objects would call\n   PyCriticalSection_End on the same PyCriticalSection object in their\n   destructors, leading to double-unlock and undefined behavior.\n\n2. Move: The moved-from object\u0027s destructor would still run and attempt\n   to end the critical section, while the moved-to object would also try\n   to end it, again causing double-unlock.\n\nThis follows the same pattern used by other RAII lock guards in the\ncodebase, such as gil_scoped_acquire and gil_scoped_release, which also\nexplicitly delete copy/move operations to prevent similar issues.\n\nBy explicitly deleting these operations, we prevent accidental misuse\nand ensure the critical section is properly managed by a single RAII\nobject throughout its lifetime.\n\n* Drop Python 3.13t support from CI\n\nPython 3.13t was experimental, while Python 3.14t is not. This PR\nuses PyCriticalSection_BeginMutex which is only available in Python\n3.14+, making Python 3.13t incompatible with the changes.\n\nRemoved all Python 3.13t CI jobs:\n- ubuntu-latest, 3.13t (standard-large matrix)\n- macos-15-intel, 3.13t (standard-large matrix)\n- windows-latest, 3.13t (standard-large matrix)\n- manylinux job testing 3.13t\n\nThis aligns with the decision to drop Python 3.13t support as\ndiscussed in PR #5971.\n\n* Add Python 3.13 (default) replacement jobs for removed 3.13t jobs\n\nAfter removing Python 3.13t support (incompatible with PyCriticalSection_BeginMutex\nwhich requires Python 3.14+), we\u0027re adding replacement jobs using Python 3.13\n(default) to maintain test coverage in key dimensions:\n\n1. ubuntu-latest, Python 3.13: C++20 + DISABLE_HANDLE_TYPE_NAME_DEFAULT_IMPLEMENTATION\n   - Replaces: ubuntu-latest, 3.13t with same config\n   - Maintains coverage for this specific configuration combination\n\n2. macos-15-intel, Python 3.13: C++11\n   - Replaces: macos-15-intel, 3.13t with same config\n   - Maintains macOS coverage for Python 3.13\n\n3. manylinux (musllinux), Python 3.13: GIL testing\n   - Replaces: manylinux, 3.13t job\n   - Maintains manylinux/musllinux container testing coverage\n\nThese additions are proposed to get feedback on which jobs should be kept\nto maintain appropriate test coverage without the experimental 3.13t builds.\n\n* ci: run in free-threading mode a bit more on 3.14\n\n* Revert \"ci: run in free-threading mode a bit more on 3.14\"\n\nThis reverts commit 91189c9242e787922d26ca467710dcc494871b82.\n\nReason: https://github.com/pybind/pybind11/pull/5971#issuecomment-3831321903\n\n* Reapply \"ci: run in free-threading mode a bit more on 3.14\"\n\nThis reverts commit f3197de97557a86a9a73df7890be1c227a7c4c59.\n\nAfter #5972 is/was merged, tests should pass (already tested under #5980).\n\nSee also https://github.com/pybind/pybind11/pull/5972#discussion_r2752674989\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crgrossekunst@nvidia.com\u003e\nCo-authored-by: Henry Schreiner \u003cHenrySchreinerIII@gmail.com\u003e\nCo-authored-by: Ralf W. Grosse-Kunstleve \u003crwgkio@gmail.com\u003e"
    },
    {
      "commit": "e7754de037fe6bc9910e1b09691c7d0ca2ee3057",
      "tree": "342bc70e0301330216b608b3ff241ffbc18afb00",
      "parents": [
        "0080cae388f6e6ec8d12b51138c6389e0a0c6e9b"
      ],
      "author": {
        "name": "Xuehai Pan",
        "email": "XuehaiPan@pku.edu.cn",
        "time": "Mon Feb 02 13:54:05 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Feb 01 21:54:05 2026 -0800"
      },
      "message": "Revert internals destruction and add test for internals recreation (#5972)\n\n* Bump internals version\n\n* Prevent internals destruction before all pybind11 types are destroyed\n\n* Use Py_XINCREF and Py_XDECREF\n\n* Hold GIL before decref\n\n* Use weakrefs\n\n* Remove unused code\n\n* Move code location\n\n* Move code location\n\n* Move code location\n\n* Try add tests\n\n* Fix PYTHONPATH\n\n* Fix PYTHONPATH\n\n* Skip tests for subprocess\n\n* Revert to leak internals\n\n* Revert to leak internals\n\n* Revert \"Revert to leak internals\"\n\nThis reverts commit c5ec1cf8862b43c125bdaf582445f3cbb1347017.\nThis reverts commit 72c2e0aa9b481debd94557b629e86b954543d64b.\n\n* Revert internals version bump\n\n* Reapply to leak internals\n\nThis reverts commit 8f25a254e893817c2ed70d97cde7f62778a14de2.\n\n* Add re-entrancy detection for internals creation\n\nPrevent re-creation of internals after destruction during interpreter\nshutdown. If pybind11 code runs after internals have been destroyed,\nfail early with a clear error message instead of silently creating\nnew empty internals that would cause type lookup failures.\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n\n* Fix C++11/C++14 support\n\n* Add lock under multiple interpreters\n\n* Try fix tests\n\n* Try fix tests\n\n* Try fix tests\n\n* Update comments and assertion messages\n\n* Update comments and assertion messages\n\n* Update comments\n\n* Update lock scope\n\n* Use original pointer type for Windows\n\n* Change hard error to warning\n\n* Update lock scope\n\n* Update lock scope to resolve deadlock\n\n* Remove scope release of GIL\n\n* Update comments\n\n* Lock pp on reset\n\n* Mark content created after assignment\n\n* Update comments\n\n* Simplify implementation\n\n* Update lock scope when delete unique_ptr\n\n---------\n\nCo-authored-by: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "0080cae388f6e6ec8d12b51138c6389e0a0c6e9b",
      "tree": "564dac6174dad207c74f85c202e29398e8547594",
      "parents": [
        "95d4af7ff90c4c1d98087e629a57c8d969897e45"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Sat Jan 31 22:10:57 2026 -0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 31 22:10:57 2026 -0800"
      },
      "message": "chore(deps): bump jwlawson/actions-setup-cmake in the actions group (#5978)\n\nBumps the actions group with 1 update: [jwlawson/actions-setup-cmake](https://github.com/jwlawson/actions-setup-cmake).\n\n\nUpdates `jwlawson/actions-setup-cmake` from 2.0 to 2.1\n- [Release notes](https://github.com/jwlawson/actions-setup-cmake/releases)\n- [Commits](https://github.com/jwlawson/actions-setup-cmake/compare/v2.0...v2.1)\n\n---\nupdated-dependencies:\n- dependency-name: jwlawson/actions-setup-cmake\n  dependency-version: \u00272.1\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\n  dependency-group: actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "95d4af7ff90c4c1d98087e629a57c8d969897e45",
      "tree": "0bcb5de2e4bd8c9a0130f22cec5b8419409c9cc9",
      "parents": [
        "4f81a1250748008965c59f67b7ec1c10e40ce600"
      ],
      "author": {
        "name": "Ralf W. Grosse-Kunstleve",
        "email": "rwgkio@gmail.com",
        "time": "Sun Feb 01 13:09:06 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jan 31 22:09:06 2026 -0800"
      },
      "message": "Fix CI issue: numpy requirement for Python 3.14 on ARM64 Windows (#5977)\n\n* Fix pip install conflicts in tests/requirements.txt\n\n- Fix numpy version conflict for Python 3.14 on ARM64 by excluding\n  Python 3.14+ from the ARM64-specific numpy\u003e\u003d2.3.0 requirement\n- Add scipy requirement for Python 3.13 on Windows\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n* Revert \"Fix pip install conflicts in tests/requirements.txt\"\n\nThis reverts commit 1d63c73be4fca63d660488e6efab703f51405fc7.\n\n* Fix numpy requirement for Python 3.14 on ARM64 Windows\n\nChange numpy\u003d\u003d2.4.0 to numpy\u003e\u003d2.4.0 for Python 3.14+ to allow\npip to install numpy 2.4.1 or later versions, which are available\nfor Python 3.14 on ARM64 Windows (MSYS2) where numpy 2.4.0 is not.\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e\n\n---------\n\nCo-authored-by: Cursor \u003ccursoragent@cursor.com\u003e"
    },
    {
      "commit": "4f81a1250748008965c59f67b7ec1c10e40ce600",
      "tree": "26e9582c98e3ad075d5a56344240de11fa061f7d",
      "parents": [
        "6c836071ad7725d3f0923a3e2b6928701ebf0100"
      ],
      "author": {
        "name": "Sam Gross",
        "email": "colesbury@gmail.com",
        "time": "Thu Jan 29 02:02:08 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jan 28 23:02:08 2026 -0800"
      },
      "message": "Fix deadlock in test with free threading (#5973)\n\nImporting \"widget_module\" re-enables the GIL. In current versions of\nCPython, this requires pausing all threads attached to all interpreters.\nThe spinning on sync/num without a py::gil_scoped_release causes\noccasional deadlocks."
    }
  ],
  "next": "6c836071ad7725d3f0923a3e2b6928701ebf0100"
}
