)]}'
{
  "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",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "391cf1071c1a7663a36c8b7152cf97e55a7119a2",
      "old_mode": 33188,
      "old_path": ".appveyor.yml",
      "new_id": "8429d5ec578ee9ecc10798d71c2ca257894bcc36",
      "new_mode": 33188,
      "new_path": ".appveyor.yml"
    },
    {
      "type": "modify",
      "old_id": "d27c87ad2bbd33a2b5b190fd1c292157b38c7b51",
      "old_mode": 33188,
      "old_path": ".github/workflows/ci.yml",
      "new_id": "eb2fcf2b6704b4fa04be80c8911e386c865fd82a",
      "new_mode": 33188,
      "new_path": ".github/workflows/ci.yml"
    },
    {
      "type": "modify",
      "old_id": "d672971eb53567d9f473726b28ac521ea806c074",
      "old_mode": 33188,
      "old_path": ".github/workflows/pip.yml",
      "new_id": "97f8cd236ad520bc7f1b70ce2ec8bb4c2fa68a75",
      "new_mode": 33188,
      "new_path": ".github/workflows/pip.yml"
    },
    {
      "type": "modify",
      "old_id": "1b402109140753f6a0ba27d7ed184cf940c3d856",
      "old_mode": 33188,
      "old_path": ".github/workflows/reusable-standard.yml",
      "new_id": "326c20170b1d727fbed2ee4027c3e91d1c5876bd",
      "new_mode": 33188,
      "new_path": ".github/workflows/reusable-standard.yml"
    },
    {
      "type": "modify",
      "old_id": "d3e09857ffa2a243f1a5146d8b2a84f1dd583db1",
      "old_mode": 33188,
      "old_path": "AGENTS.md",
      "new_id": "4108925520f8b3726b52d6915a1712dc7fa7f562",
      "new_mode": 33188,
      "new_path": "AGENTS.md"
    },
    {
      "type": "modify",
      "old_id": "26d618f93adf257efbb3972fe7af3460b8da1094",
      "old_mode": 33188,
      "old_path": "README.rst",
      "new_id": "c68f03bbf3e2b242323073b7aa54f80a93a16d52",
      "new_mode": 33188,
      "new_path": "README.rst"
    },
    {
      "type": "modify",
      "old_id": "bfbaea60ab4daf7e0fc53a7c0038398bda936909",
      "old_mode": 33188,
      "old_path": "docs/advanced/classes.rst",
      "new_id": "2954411d7bf7269f55e47035fe44b5188871facc",
      "new_mode": 33188,
      "new_path": "docs/advanced/classes.rst"
    },
    {
      "type": "modify",
      "old_id": "dc07a77b94d9c9827d39b01362f0718c0a9e9c6c",
      "old_mode": 33188,
      "old_path": "docs/advanced/deprecated.rst",
      "new_id": "c9f4a2e666a03d7b37f7789de1919f1d058444de",
      "new_mode": 33188,
      "new_path": "docs/advanced/deprecated.rst"
    },
    {
      "type": "modify",
      "old_id": "074d98850b71099bdf7c697cc8636d69e04511c6",
      "old_mode": 33188,
      "old_path": "docs/basics.rst",
      "new_id": "7f77f201fece592c9344872f7d1fb5c7aadda0f4",
      "new_mode": 33188,
      "new_path": "docs/basics.rst"
    },
    {
      "type": "modify",
      "old_id": "1838777e63958511115c40f2e20b74405dae05b2",
      "old_mode": 33188,
      "old_path": "docs/compiling.rst",
      "new_id": "a6bee86ffed86f0aef1026f967504feed116dfc0",
      "new_mode": 33188,
      "new_path": "docs/compiling.rst"
    },
    {
      "type": "modify",
      "old_id": "9ab6e332d1744bf6a5c004e721df1729084b20ef",
      "old_mode": 33188,
      "old_path": "include/pybind11/cast.h",
      "new_id": "1d857a0ed5952c51bcbd8f30309d04b8c7b588ab",
      "new_mode": 33188,
      "new_path": "include/pybind11/cast.h"
    },
    {
      "type": "modify",
      "old_id": "8b9d0b8e9ddb7774cf5580d7693b098c7af77be8",
      "old_mode": 33188,
      "old_path": "include/pybind11/detail/class.h",
      "new_id": "06a761de5402c6320a604c62e0e53b9d9b2bb1d5",
      "new_mode": 33188,
      "new_path": "include/pybind11/detail/class.h"
    },
    {
      "type": "modify",
      "old_id": "e22763c99e2f1a64555715585892fdb4742a0809",
      "old_mode": 33188,
      "old_path": "include/pybind11/detail/common.h",
      "new_id": "7f182afb2c25931fad590546226282f7dc84733c",
      "new_mode": 33188,
      "new_path": "include/pybind11/detail/common.h"
    },
    {
      "type": "modify",
      "old_id": "94d27ad17bed16c11cde98a8377042112742c631",
      "old_mode": 33188,
      "old_path": "include/pybind11/detail/function_record_pyobject.h",
      "new_id": "42b0e96be74e22afbbf81e57c4416f9e443c86d2",
      "new_mode": 33188,
      "new_path": "include/pybind11/detail/function_record_pyobject.h"
    },
    {
      "type": "modify",
      "old_id": "b6d03ca903ced34361230e4348f9d5e3ceb8f466",
      "old_mode": 33188,
      "old_path": "include/pybind11/detail/type_caster_base.h",
      "new_id": "161b9884fac3b916aa36c45eacb93e862fc021fd",
      "new_mode": 33188,
      "new_path": "include/pybind11/detail/type_caster_base.h"
    },
    {
      "type": "modify",
      "old_id": "c05887c33d714a45bfb074efe56393b288a53c4d",
      "old_mode": 33188,
      "old_path": "include/pybind11/embed.h",
      "new_id": "078f4198eb5a1ddc512cf2afe4ee5942950cf6c8",
      "new_mode": 33188,
      "new_path": "include/pybind11/embed.h"
    },
    {
      "type": "modify",
      "old_id": "c7122795ad98cbf64e637638d58e14b15c4f0d2f",
      "old_mode": 33188,
      "old_path": "include/pybind11/functional.h",
      "new_id": "c06fabe0d67741fdb192ebcee4e893f7abdc5aae",
      "new_mode": 33188,
      "new_path": "include/pybind11/functional.h"
    },
    {
      "type": "modify",
      "old_id": "e41076df1adf68b26612d18688c0bb47cb54980e",
      "old_mode": 33188,
      "old_path": "include/pybind11/pybind11.h",
      "new_id": "12559ddf3dbe396b0e40b5479c8558b68caa574a",
      "new_mode": 33188,
      "new_path": "include/pybind11/pybind11.h"
    },
    {
      "type": "modify",
      "old_id": "ff4be6a500eada72111e1cbba899429838e24211",
      "old_mode": 33188,
      "old_path": "include/pybind11/pytypes.h",
      "new_id": "13a6ebaa4d83a68d26fc850fc2e233a8fd766753",
      "new_mode": 33188,
      "new_path": "include/pybind11/pytypes.h"
    },
    {
      "type": "modify",
      "old_id": "e9d033c4b447ac91749577ad11be5b542f9e219c",
      "old_mode": 33188,
      "old_path": "pybind11/__init__.py",
      "new_id": "df5e8ee92a43ee6071d8bb19b4d1816f881bc005",
      "new_mode": 33188,
      "new_path": "pybind11/__init__.py"
    },
    {
      "type": "modify",
      "old_id": "300688bf10aadf414666373f5959aead12f884ed",
      "old_mode": 33188,
      "old_path": "pybind11/setup_helpers.py",
      "new_id": "8f42605245c73388df43bd842510240e9020e2e9",
      "new_mode": 33188,
      "new_path": "pybind11/setup_helpers.py"
    },
    {
      "type": "modify",
      "old_id": "c3395aa66094a06631d9c236bb8e035a4f06014c",
      "old_mode": 33188,
      "old_path": "pyproject.toml",
      "new_id": "caf0a8b9024184a00e122dfbdab6dc03f9797a9d",
      "new_mode": 33188,
      "new_path": "pyproject.toml"
    },
    {
      "type": "modify",
      "old_id": "0abb48c1f4a3f02274d69c2dca2c51d1061e096f",
      "old_mode": 33188,
      "old_path": "tests/extra_python_package/test_files.py",
      "new_id": "e2c18565dc34f9a81f1380b3c5d0d41848757dab",
      "new_mode": 33188,
      "new_path": "tests/extra_python_package/test_files.py"
    },
    {
      "type": "modify",
      "old_id": "1ba4026b46c304da0bfd9233cb2437b9e97f187d",
      "old_mode": 33188,
      "old_path": "tests/requirements.txt",
      "new_id": "e10fb40d2980ee00fb6bd8349a8f0d66c8958712",
      "new_mode": 33188,
      "new_path": "tests/requirements.txt"
    },
    {
      "type": "modify",
      "old_id": "ee7333918c7c5bfc905ab61f486211e3ac7e6555",
      "old_mode": 33188,
      "old_path": "tests/test_builtin_casters.py",
      "new_id": "a08ac410b65edda601da4780327e44697fe39a0c",
      "new_mode": 33188,
      "new_path": "tests/test_builtin_casters.py"
    },
    {
      "type": "modify",
      "old_id": "15516b21b0922dd8b6eaa0d0aa08205f6640d43e",
      "old_mode": 33188,
      "old_path": "tests/test_custom_type_setup.cpp",
      "new_id": "5235729e40e04d34c8603b36a5211e4108137630",
      "new_mode": 33188,
      "new_path": "tests/test_custom_type_setup.cpp"
    },
    {
      "type": "modify",
      "old_id": "5374cbceb215f0f37cc56d4067c1c138f3ae6038",
      "old_mode": 33188,
      "old_path": "tests/test_docs_advanced_cast_custom.py",
      "new_id": "63d608c446862f3c844436117096e6cf1c576e5b",
      "new_mode": 33188,
      "new_path": "tests/test_docs_advanced_cast_custom.py"
    },
    {
      "type": "modify",
      "old_id": "1ee13ba3f31f43405a76e876448a1625e860023d",
      "old_mode": 33188,
      "old_path": "tests/test_exceptions.py",
      "new_id": "c52a295b365df496ccbf44f4c34323534765575a",
      "new_mode": 33188,
      "new_path": "tests/test_exceptions.py"
    },
    {
      "type": "modify",
      "old_id": "65b27331912db66bee7a0f8adf677058cf09efbc",
      "old_mode": 33188,
      "old_path": "tests/test_multiple_interpreters.py",
      "new_id": "6ca4fd8eee1b018f046fa58627948b28863bafea",
      "new_mode": 33188,
      "new_path": "tests/test_multiple_interpreters.py"
    },
    {
      "type": "modify",
      "old_id": "6010a418eb97326eed86cb16becdd831e468573a",
      "old_mode": 33188,
      "old_path": "tests/test_with_catch/test_interpreter.cpp",
      "new_id": "e39f51c2748ee31aadfe2682f70a443f685f25ac",
      "new_mode": 33188,
      "new_path": "tests/test_with_catch/test_interpreter.cpp"
    },
    {
      "type": "modify",
      "old_id": "7351bcaa6570e44d1a5615019316d968487bbe71",
      "old_mode": 33188,
      "old_path": "tools/FindPythonLibsNew.cmake",
      "new_id": "d72e21332b74021293cd595f56389f3f2f196812",
      "new_mode": 33188,
      "new_path": "tools/FindPythonLibsNew.cmake"
    },
    {
      "type": "modify",
      "old_id": "568b0b0595dea88685cc0a7d5cc2353ca3be06d7",
      "old_mode": 33188,
      "old_path": "tools/pybind11NewTools.cmake",
      "new_id": "b0fe20768d34f384611ffef2eefdd85826a64a51",
      "new_mode": 33188,
      "new_path": "tools/pybind11NewTools.cmake"
    },
    {
      "type": "modify",
      "old_id": "a51efb39fa6d6337f43ed097a94b90832e8793ea",
      "old_mode": 33188,
      "old_path": "tools/pybind11Tools.cmake",
      "new_id": "81faee7d8bd854cb9319ac8a8f64789ccf29cc3a",
      "new_mode": 33188,
      "new_path": "tools/pybind11Tools.cmake"
    }
  ]
}
