)]}'
{
  "log": [
    {
      "commit": "30cb5a755c9c4dff7a8f04f3faacd03319bf612e",
      "tree": "ea8fc527c48241e75e3bb64e2b361e0d2ace72ce",
      "parents": [
        "5f7e4013c004324f11eac6f310d932f505272e28"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jul 20 16:18:23 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 16:18:23 2026 +0200"
      },
      "message": "Bump actions/setup-python from 6.3.0 to 7.0.0 (#11181)\n\nBumps [actions/setup-python](https://github.com/actions/setup-python) from 6.3.0 to 7.0.0.\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/v6.3.0...v7.0.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-python\n  dependency-version: 7.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "5f7e4013c004324f11eac6f310d932f505272e28",
      "tree": "3b41bdf611e5eab3e07739263874354e65c331b8",
      "parents": [
        "8ac171bcc903962d8843743de778494a9d518c34"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 08:17:38 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 08:17:38 2026 +0000"
      },
      "message": "[pre-commit.ci] pre-commit autoupdate and manual fix (#11167)\n\n\nupdates:\n- [github.com/astral-sh/ruff-pre-commit: v0.15.20 → v0.15.21](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.20...v0.15.21)\n- [github.com/PyCQA/isort: 9.0.0a3 → 9.0.0b1](https://github.com/PyCQA/isort/compare/9.0.0a3...9.0.0b1)\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/rbubley/mirrors-prettier: v3.9.4 → v3.9.5](https://github.com/rbubley/mirrors-prettier/compare/v3.9.4...v3.9.5)\n\n* Fix mypy error: `_csv._writer` renamed to `_csv.Writer` in typeshed\n\nThe mypy v2.3.0 bump ships a newer typeshed that drops the\n`_csv._writer \u003d Writer` back-compat alias (kept only for Python 3.9).\nUse the public `_csv.Writer` name instead.\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "8ac171bcc903962d8843743de778494a9d518c34",
      "tree": "4ad7f527a13cc906fb55009142a0e485b939fb01",
      "parents": [
        "c34905fd04151b663377932273a40be2b279834c"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Tue Jul 07 06:33:11 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 07 06:33:11 2026 +0200"
      },
      "message": "[pre-commit.ci] pre-commit autoupdate (#11162)\n\nupdates:\n- [github.com/rbubley/mirrors-prettier: v3.9.1 → v3.9.4](https://github.com/rbubley/mirrors-prettier/compare/v3.9.1...v3.9.4)\n- [github.com/DanielNoord/pydocstringformatter: v0.7.5 → v1.0.0](https://github.com/DanielNoord/pydocstringformatter/compare/v0.7.5...v1.0.0)\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "c34905fd04151b663377932273a40be2b279834c",
      "tree": "e95ecc797c0f0c774bdd65c8493b1f6d6fc2b714",
      "parents": [
        "9b5b337d58916911a49c3d0bd5ba40a3e5c0fabd"
      ],
      "author": {
        "name": "Adetunji Oludele Adebayo",
        "email": "cyber.adetunji@gmail.com",
        "time": "Sun Jul 05 10:34:46 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 09:34:46 2026 +0000"
      },
      "message": "Emit duplicate constructor doc warning for skipped init (#11128)\n\n\nCo-authored-by: tungyhardDevOps \u003c190939682+tungyhardDevOps@users.noreply.github.com\u003e"
    },
    {
      "commit": "9b5b337d58916911a49c3d0bd5ba40a3e5c0fabd",
      "tree": "d4a68b27d4a53920f6223b9b1d3e9ed10c3626bc",
      "parents": [
        "60edffe5babc4ae5906b2806f285c50776f53487"
      ],
      "author": {
        "name": "Hibi",
        "email": "hibin.m@gmail.com",
        "time": "Sun Jul 05 16:49:22 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 08:49:22 2026 +0200"
      },
      "message": "Fix `bad-string-format-type` false positives for `%i`, `%u` and `%a` (#11150)\n\nFix `bad-string-format-type` false positives for %i, %u and %a conversions\n\nE1307 rejected valid old-style % formatting: `%i`/`%u` applied to a float\n(both truncate like `%d`) and `%a` applied to any non-int type (`%a` is\ntype-agnostic like `%s`/`%r`). Add `a` to the always-printable early return\nand `i`/`u` to the float conversion table.\n\nCo-authored-by: Synvoya \u003c16019863+Synvoya@users.noreply.github.com\u003e"
    },
    {
      "commit": "60edffe5babc4ae5906b2806f285c50776f53487",
      "tree": "0754432c3e14b31ec07badbb61a4ab9a534e0e16",
      "parents": [
        "d7e833f05e9f936a2ca26d6e167f070e88618cc1"
      ],
      "author": {
        "name": "Hibi",
        "email": "hibin.m@gmail.com",
        "time": "Sun Jul 05 16:25:49 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 08:25:49 2026 +0200"
      },
      "message": "Fix `unnecessary-negation` missing `is not` and `not in` (#11141)\n\nreverse_op had \u0027is\u0027/\u0027in\u0027 keys but omitted their siblings \u0027is not\u0027/\u0027not in\u0027, so not (a is not b) and not (a not in b) were never flagged. Add the two inversions. Closes #11140\n\nCo-authored-by: Synvoya \u003c16019863+Synvoya@users.noreply.github.com\u003e"
    },
    {
      "commit": "d7e833f05e9f936a2ca26d6e167f070e88618cc1",
      "tree": "4fc4300654d8eeecedeec6f53b5834cd52941411",
      "parents": [
        "d654d3898abafa4472ce46a711aa972ac97a99f7"
      ],
      "author": {
        "name": "Hibi",
        "email": "hibin.m@gmail.com",
        "time": "Sun Jul 05 14:56:28 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 06:56:28 2026 +0200"
      },
      "message": "Fix `useless-parent-delegation` false positive on positional-only default (#11151)\n\n`_has_different_parameters_default_value` iterated `original.args` and\n`original.kwonlyargs` but omitted `original.posonlyargs`, so a changed default\non a positional-only parameter was not detected and the override was wrongly\nreported as useless. Include `posonlyargs` in the chain.\n\nCo-authored-by: Synvoya \u003c16019863+Synvoya@users.noreply.github.com\u003e\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "d654d3898abafa4472ce46a711aa972ac97a99f7",
      "tree": "83b4c0b91c72e32d0c64008deb09762d409085f9",
      "parents": [
        "1c2df2fba603ab6a5a9e95647a50f39a6f5c819f"
      ],
      "author": {
        "name": "Hibi",
        "email": "hibin.m@gmail.com",
        "time": "Sun Jul 05 14:20:32 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 06:20:32 2026 +0200"
      },
      "message": "Fix `literal-comparison` suggestion corrupting identifiers containing \"is\" (#11149)\n\nR0123 built its suggested replacement with a blind `str.replace` of the first\n`is` occurrence in the rendered comparison, corrupting any identifier that\ncontains the substring `is` (e.g. `axis is 5` was rendered `ax\u003d\u003d \u003d\u003d 5`).\nRebuild the suggestion from the operands and operator instead; `visit_compare`\nonly reaches this path for single-operator comparisons, so the reconstruction\nis faithful.\n\nCo-authored-by: Synvoya \u003c16019863+Synvoya@users.noreply.github.com\u003e"
    },
    {
      "commit": "1c2df2fba603ab6a5a9e95647a50f39a6f5c819f",
      "tree": "749f5389f9b548592ef3b34e2086a79637a29b36",
      "parents": [
        "554b1d1924342ce2e5b4d8f79dd62eab7cd67501"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sun Jul 05 06:15:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jul 05 06:15:13 2026 +0200"
      },
      "message": "[primer] Always install pylint from the current checkout (#11154)\n\nThe primer venv cache bakes in the pylint that was checked out when the\ncache was created (requirements_test.txt installs \u0027.[testutils,spelling]\u0027).\nIf a PR both changes the requirements (new cache key) and is then\nforce-pushed, every subsequent run restores a venv containing the old --\npossibly broken -- pylint, and \u0027Get commit string\u0027 crashes before the\nexisting \u0027pip install . --no-deps\u0027 in the run step gets a chance to fix it\n(see the pipeline failures on #11153, caused by a syntax error in a\nforce-pushed-away commit that got baked into the cache).\n\nReinstall pylint from the checkout right after restoring the venv so no\nstep ever imports a stale copy."
    },
    {
      "commit": "554b1d1924342ce2e5b4d8f79dd62eab7cd67501",
      "tree": "a9c8d7421727411c845b2d9f7ce8e8bc198ac5fe",
      "parents": [
        "c53537f66f459ed47b867c4aa48b4ac998d606bd"
      ],
      "author": {
        "name": "Daniël van Noord",
        "email": "13665637+DanielNoord@users.noreply.github.com",
        "time": "Sat Jul 04 23:17:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 23:17:33 2026 +0200"
      },
      "message": "Bump `astroid` to `4.2.0b4` (#11153)"
    },
    {
      "commit": "c53537f66f459ed47b867c4aa48b4ac998d606bd",
      "tree": "b63ed998f0680ebe7add809863ef6a3b05c48c11",
      "parents": [
        "2bfab5f2606ff62bed3af910a21371e573caee3a"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sat Jul 04 19:28:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 19:28:55 2026 +0200"
      },
      "message": "[primer] Show changed messages as diffs instead of removed+added (#10914)\n\nPair residual messages — first by (symbol, path, obj), then by exact\nsource location gated on symbol similarity — and report altered\nmessages as a single *changed* entry with a compact diff instead of a\nseparate removal + addition. The location pass catches symbol renames\n(used-before-assignment → possibly-used-before-assignment); among\neligible candidates the one closest to the original line wins so pairs\nnever cross.\n\nRendering: symbol links to the source location, location changes shown\nas backtick spans, ^ caret hints under changed characters, newlines\nescaped so multi-line messages (duplicate-code) keep the diff block\naligned. New messages are classified into fixed false positives\n(useless-suppression), astroid-error fatal errors, and the rest."
    },
    {
      "commit": "2bfab5f2606ff62bed3af910a21371e573caee3a",
      "tree": "b0b98208c437aa5060577975eddb6b303268e2d7",
      "parents": [
        "5dba785a295354c2a5c3f8e22192b1d3bbb6a620"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sat Jul 04 15:00:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 15:00:33 2026 +0200"
      },
      "message": "[mccabe] Add functional tests documenting current complexity scores (#11144)\n\nBaseline before re-implementing the checker: module-level try and\nmatch statements, exhaustiveness variants of match, same-named\nproperty accessors, and except* (Python 3.11).\n\nThe expected output encodes the current mccabe-library behavior,\nincluding its quirks: only the last definition of a name is rated\n(the deleter hides the getter and setter), an exhaustive match still\ncounts a fall-through path, and except* is not counted at all."
    },
    {
      "commit": "5dba785a295354c2a5c3f8e22192b1d3bbb6a620",
      "tree": "48522238c9db883bea4f8c427a0527e19195818a",
      "parents": [
        "e628929a7213be2cd70ac315dc92361ce83faac0"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sat Jul 04 11:32:36 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 11:32:36 2026 +0200"
      },
      "message": "[primer] Add test cases for what happens around disabled false positives (#11143)\n\nBaseline expectations (current behavior) for real primer-comment\npatterns, modeled on the output seen in #11129:\n\n- useless_suppression now mirrors a fixed false positive under a\n  ``# pylint: disable``: the disable comment emits locally-disabled on\n  both runs, the main run has the suppressed-message companion (I0020,\n  type info) and the PR run emits useless-suppression instead\n- fp_hidden_by_existing_disable: the inverse — a PR introducing a false\n  positive on an already-disabled line shows up only as a new\n  suppressed-message + removed useless-suppression\n- persistent_astroid_error: a file that crashes on both runs shows up\n  as removed + counted-as-new because the crash-report path in the\n  message differs between runs\n- symbol_renamed_and_moved: a renamed symbol that also moved lines"
    },
    {
      "commit": "e628929a7213be2cd70ac315dc92361ce83faac0",
      "tree": "b46759d41087ab1714c7c645ea120fef9b3aa874",
      "parents": [
        "5ce1ffd4bf755f4e1622a59df94f4f11a5bea259"
      ],
      "author": {
        "name": "Hibi",
        "email": "hibin.m@gmail.com",
        "time": "Sat Jul 04 17:23:36 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 07:23:36 2026 +0000"
      },
      "message": "Fix `too-many-locals` counting PEP 695 type parameters as local variables (#11138)\n\nFix too-many-locals counting PEP 695 type parameters as locals\n\nastroid places PEP 695 type-param names in node.locals, so R0914 over-counted (def f[T1..T16](x) reported 17/15 for one real local). Exclude type params from the count. Closes #11136\n\nCo-authored-by: Synvoya \u003c16019863+Synvoya@users.noreply.github.com\u003e"
    },
    {
      "commit": "5ce1ffd4bf755f4e1622a59df94f4f11a5bea259",
      "tree": "9b2cb330762ebbdb1f97882264819c020a61de6c",
      "parents": [
        "a18ca521892b71b3672dffe99bf50ec02e5d324f"
      ],
      "author": {
        "name": "Hibi",
        "email": "hibin.m@gmail.com",
        "time": "Sat Jul 04 16:58:32 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 06:58:32 2026 +0000"
      },
      "message": "Fix `nested-min-max` dropping arguments after the splatted call (#11135)\n\nFix nested-min-max dropping arguments after the splatted call\n\nThe splat rewrite built args with fixed_node.args[idx + 1 : idx], an always-empty slice (start \u003e stop), so every argument after the splatted call was discarded and the suggestion changed the result. Use [idx + 1 :]. Closes #11134\n\nCo-authored-by: Synvoya \u003c16019863+Synvoya@users.noreply.github.com\u003e"
    },
    {
      "commit": "a18ca521892b71b3672dffe99bf50ec02e5d324f",
      "tree": "9a47a33b30f2a8fd3a51fdebea1eba58e89e19c8",
      "parents": [
        "0ad31b7c817b57e2aa8a5abb568b76a438a59121"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sat Jul 04 08:48:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 08:48:43 2026 +0200"
      },
      "message": "[primer] Add comparator test cases for tricky message pairings (#11137)\n\nBaseline expectations for the current removed+added reporting:\n- a symbol rename at a location that also gains an unrelated message\n- similar-looking but unrelated symbols at the same location\n- two identical warnings that both moved lines\n- a multi-line message (duplicate-code) whose content changed"
    },
    {
      "commit": "0ad31b7c817b57e2aa8a5abb568b76a438a59121",
      "tree": "a09b8128124ab97418456542b25759c1cce3e43f",
      "parents": [
        "e91fca7d2839e260b3521b667c5fca86cfb56efa"
      ],
      "author": {
        "name": "Hibi",
        "email": "hibin.m@gmail.com",
        "time": "Sat Jul 04 15:16:16 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jul 04 07:16:16 2026 +0200"
      },
      "message": "Fix `nested-min-max` false positive when the inner call has keyword arguments (#11131)\n\n\nThe suggested replacement dropped an inner key\u003d/default\u003d keyword and changed the result (e.g. max(1, max(5, 3, key\u003dabs)) !\u003d max(1, 5, 3)). Exclude inner calls carrying keyword arguments from flattening. Closes #11130\n\nCo-authored-by: Synvoya \u003c16019863+Synvoya@users.noreply.github.com\u003e"
    },
    {
      "commit": "e91fca7d2839e260b3521b667c5fca86cfb56efa",
      "tree": "099b35880099b87f9cc2a8b0d933cd44dbc005d8",
      "parents": [
        "41eedc66ea8dc583236801a56dec120637c95507"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Tue Jun 30 08:05:24 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 08:05:24 2026 +0200"
      },
      "message": "[pre-commit.ci] pre-commit autoupdate (#11122)\n\n* [pre-commit.ci] pre-commit autoupdate\n\nupdates:\n- [github.com/astral-sh/ruff-pre-commit: v0.15.18 → v0.15.20](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.18...v0.15.20)\n- [github.com/rbubley/mirrors-prettier: v3.8.4 → v3.9.1](https://github.com/rbubley/mirrors-prettier/compare/v3.8.4...v3.9.1)\n\n* Auto-add \u0027skip news\u0027 label to pre-commit.ci PRs\n\npre-commit.ci autoupdate PRs have no news fragment, so the changelog\ncheck always fails. Label them automatically with \u0027skip news :mute:\u0027\nso the bot\u0027s PRs pass CI without manual intervention.\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "41eedc66ea8dc583236801a56dec120637c95507",
      "tree": "dd4134865aeb9f1787fcbb3615073e5dbbc6d602",
      "parents": [
        "f36be86be52a6d300f9d8e4f11d59fdaa9877aac"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 29 16:43:29 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 16:43:29 2026 +0200"
      },
      "message": "Bump actions/cache from 5.0.5 to 6.1.0 (#11120)\n\nBumps [actions/cache](https://github.com/actions/cache) from 5.0.5 to 6.1.0.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/v5.0.5...v6.1.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/cache\n  dependency-version: 6.1.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "f36be86be52a6d300f9d8e4f11d59fdaa9877aac",
      "tree": "f70069241e616b6991d1c7af76b73d6425b01300",
      "parents": [
        "3143578ce53c7bb94572ebc978def76c1e1ba649"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 29 16:42:58 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 29 16:42:58 2026 +0200"
      },
      "message": "Bump actions/setup-python from 6.2.0 to 6.3.0 (#11121)\n\nBumps [actions/setup-python](https://github.com/actions/setup-python) from 6.2.0 to 6.3.0.\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/v6.2.0...v6.3.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-python\n  dependency-version: 6.3.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "3143578ce53c7bb94572ebc978def76c1e1ba649",
      "tree": "c4578cc3d8b015c09f9cf043fb977600ae7e4890",
      "parents": [
        "55b27659641cb945c36cead45e5feed7fca53cfb"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Mon Jun 22 22:16:10 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 22:16:10 2026 +0000"
      },
      "message": "[pre-commit.ci] pre-commit autoupdate (#11113)\n\nupdates:\n- [github.com/astral-sh/ruff-pre-commit: v0.15.17 → v0.15.18](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.17...v0.15.18)\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "55b27659641cb945c36cead45e5feed7fca53cfb",
      "tree": "778ad3e08b38a0df40140110364cb357c144f0d1",
      "parents": [
        "bac7c6a034e40ca054165d3bb3c2f4d557f24beb"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 22 23:41:41 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 22 23:41:41 2026 +0200"
      },
      "message": "Bump actions/checkout from 6.0.3 to 7.0.0 (#11112)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 6.0.3 to 7.0.0.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v6.0.3...v7.0.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 7.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "bac7c6a034e40ca054165d3bb3c2f4d557f24beb",
      "tree": "4779e4177d252b5a0ba6175d4b8433f4fc0b7872",
      "parents": [
        "e390065d6eb37e6b5e1a5634c6d9507be7ec2c45"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Mon Jun 15 22:08:34 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 15 22:08:34 2026 +0000"
      },
      "message": "[pre-commit.ci] pre-commit autoupdate (#11110)\n\nupdates:\n- [github.com/astral-sh/ruff-pre-commit: v0.15.16 → v0.15.17](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.16...v0.15.17)\n- [github.com/rbubley/mirrors-prettier: v3.8.3 → v3.8.4](https://github.com/rbubley/mirrors-prettier/compare/v3.8.3...v3.8.4)\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "e390065d6eb37e6b5e1a5634c6d9507be7ec2c45",
      "tree": "ff0e0f73ca866225d6f8bfe87a36078a0500bceb",
      "parents": [
        "dbd934e820628229997506733d1e0eef7abee39d"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Mon Jun 15 22:03:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 15 22:03:07 2026 +0200"
      },
      "message": "Add AGENTS.md: prefer isinstance over getattr/hasattr in checkers (#11104)"
    },
    {
      "commit": "dbd934e820628229997506733d1e0eef7abee39d",
      "tree": "3031091eae91f88822fe6e6a40011270c54eea33",
      "parents": [
        "9dc1b477ad7ad9b32b07b6a83c2215e7d4c911fe"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 15 17:46:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 15 17:46:32 2026 +0200"
      },
      "message": "Bump sigstore/gh-action-sigstore-python from 3.3.0 to 3.4.0 (#11109)\n\nBumps [sigstore/gh-action-sigstore-python](https://github.com/sigstore/gh-action-sigstore-python) from 3.3.0 to 3.4.0.\n- [Release notes](https://github.com/sigstore/gh-action-sigstore-python/releases)\n- [Changelog](https://github.com/sigstore/gh-action-sigstore-python/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/sigstore/gh-action-sigstore-python/compare/v3.3.0...v3.4.0)\n\n---\nupdated-dependencies:\n- dependency-name: sigstore/gh-action-sigstore-python\n  dependency-version: 3.4.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "9dc1b477ad7ad9b32b07b6a83c2215e7d4c911fe",
      "tree": "5b78376f01c8a25f30471543acc0959b0f2f09eb",
      "parents": [
        "c4f8d9b94dbb8fd0844154d577779b98f8edf05a"
      ],
      "author": {
        "name": "Vincent Gao",
        "email": "gaobing1230@gmail.com",
        "time": "Sun Jun 14 21:52:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 21:52:15 2026 +0200"
      },
      "message": "Fix a crash in bad-open-mode when the mode is NotImplemented (#11100)\n\nOn Python \u003e\u003d 3.14 evaluating NotImplemented in a boolean context raises\na TypeError, so both the message-argument expression and the binary-mode\ntest in _check_open_call crashed on open(f, NotImplemented).\n\nstr(mode_arg.value) produces the same message text for every constant\nsince the message is %s-formatted, and the binary-mode test keeps its\nbehavior for all constants without the boolean context.\n\nCloses #11099"
    },
    {
      "commit": "c4f8d9b94dbb8fd0844154d577779b98f8edf05a",
      "tree": "4b10be84608a6c3cc029eb0ca757cd5f0d250688",
      "parents": [
        "2757ade252e3716ae9fee80969090c161a65fc38"
      ],
      "author": {
        "name": "Vincent Gao",
        "email": "gaobing1230@gmail.com",
        "time": "Sun Jun 14 20:28:00 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 20:28:00 2026 +0200"
      },
      "message": "Fix a crash in not--context-manager when the manager has no name (#11103)\n\nvisit_asyncwith / visit_with built the message argument from inferred.name, but an\ninferred context manager need not have a name -- e.g. async with slice(None)\ninfers to a Slice node, so pylint crashed with AttributeError instead of\nemitting not-async-context-manager. Fall back to the inferred type name\n(slice), matching how other value managers are already reported (int, ...).\n\nCloses #11102\n\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "2757ade252e3716ae9fee80969090c161a65fc38",
      "tree": "0eec8fe67bfd23660c1239d81fbe093f1401edd6",
      "parents": [
        "2f47d86123f35511587532556c009b436f71ca37",
        "50cd472b94a0c99ef4568db77fb0c3f6f9868f14"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sun Jun 14 19:40:17 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 19:40:17 2026 +0200"
      },
      "message": "Merge maintenance/4.0.x into main after 4.0.6 release (#11106)"
    },
    {
      "commit": "50cd472b94a0c99ef4568db77fb0c3f6f9868f14",
      "tree": "0eec8fe67bfd23660c1239d81fbe093f1401edd6",
      "parents": [
        "2f47d86123f35511587532556c009b436f71ca37",
        "8a396357098337ba8be714fffdf2d00947a9778c"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sun Jun 14 16:52:40 2026 +0200"
      },
      "committer": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sun Jun 14 18:11:56 2026 +0200"
      },
      "message": "Merge remote-tracking branch \u0027origin/maintenance/4.0.x\u0027 into merge-4.0.6-into-main\n"
    },
    {
      "commit": "8a396357098337ba8be714fffdf2d00947a9778c",
      "tree": "9b9bcfc5137433bb8466b1e6cb12b11a9c53be1b",
      "parents": [
        "150f23c6759d428bf75df303f12d115f103d1359"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sun Jun 14 16:38:18 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 14 16:38:18 2026 +0200"
      },
      "message": "Bump pylint to 4.0.6, update changelog (#11105)\n\n\nA mismatched astroid version regenerates functional test output that\ngets committed into the release bump, breaking CI."
    },
    {
      "commit": "2f47d86123f35511587532556c009b436f71ca37",
      "tree": "b41e3e3c9550d6bc5db82b5b6848336249bea2c3",
      "parents": [
        "a353a2f5781ee87370a1bdec066a59e257f8c0bd"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Tue Jun 09 04:59:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 04:59:43 2026 +0200"
      },
      "message": "[pre-commit.ci] pre-commit autoupdate (#11097)\n\nupdates:\n- [github.com/astral-sh/ruff-pre-commit: v0.15.15 → v0.15.16](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.15...v0.15.16)\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "150f23c6759d428bf75df303f12d115f103d1359",
      "tree": "0281b6d53d8eb9209e4d6a90386dd505273489be",
      "parents": [
        "8b6251ee1ea6bbbb857e4e217e3fde6db6a3d6b1"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Mon Jun 08 17:33:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 17:33:40 2026 +0200"
      },
      "message": "[Backport maintenance/4.0.x] Allow digits in ParamSpec and TypeVarTuple names for invalid-name check (#11095)\n\nAllow digits in ParamSpec and TypeVarTuple names for invalid-name check (#11091)\n\nThe default paramspec-rgx and typevartuple-rgx patterns rejected names\ncontaining digits (e.g. Ec2P, S3Ts), emitting a false invalid-name\n(C0103). Allow digits in the lowercase segments of both patterns,\nconsistent with the typevar fix from #11078.\n\nCloses #11090\n\n(cherry picked from commit fe87ce2456bef8828e7a26b53c147d9860fcc208)\n\nCo-authored-by: Karl Hill \u003ckarlhillx@gmail.com\u003e"
    },
    {
      "commit": "a353a2f5781ee87370a1bdec066a59e257f8c0bd",
      "tree": "78e74b570bae4710d4f27214d6b648e28c7601ef",
      "parents": [
        "fe87ce2456bef8828e7a26b53c147d9860fcc208"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Jun 08 17:32:53 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 17:32:53 2026 +0200"
      },
      "message": "Bump codecov/codecov-action from 6 to 7 (#11094)\n\nBumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6 to 7.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: codecov/codecov-action\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "fe87ce2456bef8828e7a26b53c147d9860fcc208",
      "tree": "91f73dddcf47879a133e10a2a45549f135ae9c47",
      "parents": [
        "dfaa480d0ce171b21ec358191c76777b625d02bd"
      ],
      "author": {
        "name": "Karl Hill",
        "email": "karlhillx@gmail.com",
        "time": "Mon Jun 08 09:56:03 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 15:56:03 2026 +0200"
      },
      "message": "Allow digits in ParamSpec and TypeVarTuple names for invalid-name check (#11091)\n\n\nThe default paramspec-rgx and typevartuple-rgx patterns rejected names\ncontaining digits (e.g. Ec2P, S3Ts), emitting a false invalid-name\n(C0103). Allow digits in the lowercase segments of both patterns,\nconsistent with the typevar fix from #11078.\n\nCloses #11090"
    },
    {
      "commit": "8b6251ee1ea6bbbb857e4e217e3fde6db6a3d6b1",
      "tree": "04cfbc7ca1db470e7eeaef2f9d405f84c83a381c",
      "parents": [
        "d57aadbf5f012d9b5d2907137cce8cd33478c050"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Mon Jun 08 15:07:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 15:07:03 2026 +0200"
      },
      "message": "[Backport maintenance/4.0.x] Fix crash when enum member inference fails (#11093)\n\nFix crash when enum member inference fails (#11086)\n\n(cherry picked from commit dfaa480d0ce171b21ec358191c76777b625d02bd)\n\nCo-authored-by: Karl Hill \u003ckarlhillx@gmail.com\u003e"
    },
    {
      "commit": "dfaa480d0ce171b21ec358191c76777b625d02bd",
      "tree": "2636defc12481a83125f3e0168fb652d12649131",
      "parents": [
        "16faa29d6bc6ba6533efe426038da62a81ca272b"
      ],
      "author": {
        "name": "Karl Hill",
        "email": "karlhillx@gmail.com",
        "time": "Mon Jun 08 08:25:17 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 12:25:17 2026 +0000"
      },
      "message": "Fix crash when enum member inference fails (#11086)"
    },
    {
      "commit": "d57aadbf5f012d9b5d2907137cce8cd33478c050",
      "tree": "01827ca43d3441e4ab999dd4cc7c6746ef110d89",
      "parents": [
        "d9ea8d91c431361bf3e9f478ef075ba6ea2d9d5c"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Mon Jun 08 13:31:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 13:31:03 2026 +0200"
      },
      "message": "[Backport maintenance/4.0.x] Fix `implicit-str-concat` false positive for mixed raw/non-raw strings (#11089)\n\nFix `implicit-str-concat` false positive for mixed raw/non-raw strings (#11082)\n\nimplicit-str-concat (W1404) was emitted for an implicit concatenation of a raw string with a non-raw one (e.g. r\"\\d\" \"\\n\"). Such literals cannot be merged into a single string, so the concatenation is intentional rather than a forgotten comma; skip the warning when adjacent string tokens differ in rawness.\n\nCloses #6663\n\n(cherry picked from commit 16faa29d6bc6ba6533efe426038da62a81ca272b)\n\nCo-authored-by: Tankou \u003c117810219+KoseiTanno@users.noreply.github.com\u003e"
    },
    {
      "commit": "16faa29d6bc6ba6533efe426038da62a81ca272b",
      "tree": "7cfae924c152d41524c07a5b53a4d9e13bb04a83",
      "parents": [
        "2ef1766c3923ee7753cea771959227a35e74972c"
      ],
      "author": {
        "name": "Tankou",
        "email": "117810219+KoseiTanno@users.noreply.github.com",
        "time": "Mon Jun 08 16:55:40 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 09:55:40 2026 +0200"
      },
      "message": "Fix `implicit-str-concat` false positive for mixed raw/non-raw strings (#11082)\n\n\nimplicit-str-concat (W1404) was emitted for an implicit concatenation of a raw string with a non-raw one (e.g. r\"\\d\" \"\\n\"). Such literals cannot be merged into a single string, so the concatenation is intentional rather than a forgotten comma; skip the warning when adjacent string tokens differ in rawness.\n\nCloses #6663"
    },
    {
      "commit": "d9ea8d91c431361bf3e9f478ef075ba6ea2d9d5c",
      "tree": "958f9898fffe49778aa657045a074851c876032f",
      "parents": [
        "cb1792a1b40a634963fa67e7fc43ca487e77c013"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Mon Jun 08 09:55:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 09:55:07 2026 +0200"
      },
      "message": "[Backport maintenance/4.0.x] Fix `unnecessary-comprehension` suggestion when iterating a dict (#11085)\n\nFix `unnecessary-comprehension` suggestion when iterating a dict (#11083)\n\nFor a dict comprehension that iterates a dict directly (e.g. {a: b for a, b in d}), unnecessary-comprehension suggested dict(d), which is wrong: iterating a dict yields its keys, so the comprehension unpacks each key whereas dict(d) would copy d. Suggest dict(d.keys()) instead.\n\nThe suggestion building was extracted into a helper to keep _check_unnecessary_comprehension within the branch limit.\n\nCloses #8256\n\n(cherry picked from commit 6887b7eb1dbc7c87c4f038d0c87ff45cbc651746)\n\nCo-authored-by: Tankou \u003c117810219+KoseiTanno@users.noreply.github.com\u003e"
    },
    {
      "commit": "2ef1766c3923ee7753cea771959227a35e74972c",
      "tree": "4e3e68d3c67d68551ade002c5a6b4ce5f809ff3a",
      "parents": [
        "6887b7eb1dbc7c87c4f038d0c87ff45cbc651746"
      ],
      "author": {
        "name": "Tankou",
        "email": "117810219+KoseiTanno@users.noreply.github.com",
        "time": "Mon Jun 08 04:19:33 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 21:19:33 2026 +0200"
      },
      "message": "Fix `superfluous-parens` false negative for a single literal after `in` (#11081)\n\n\nC0325 was given a blanket pass for the `in` keyword in #4948 because the parentheses around a tuple are required. The parentheses around a single string/number literal after `in` (e.g. `x in (\"foo\")`) are still superfluous, so report only those and leave tuples, double-paren generator expressions, and larger expressions untouched.\n\nCloses #9878"
    },
    {
      "commit": "6887b7eb1dbc7c87c4f038d0c87ff45cbc651746",
      "tree": "291a017fe0b9ffd502492b2915f78b04b25af4c0",
      "parents": [
        "f9ac614e6db59325aae6006be006046211a693db"
      ],
      "author": {
        "name": "Tankou",
        "email": "117810219+KoseiTanno@users.noreply.github.com",
        "time": "Mon Jun 08 04:13:34 2026 +0900"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 21:13:34 2026 +0200"
      },
      "message": "Fix `unnecessary-comprehension` suggestion when iterating a dict (#11083)\n\n\nFor a dict comprehension that iterates a dict directly (e.g. {a: b for a, b in d}), unnecessary-comprehension suggested dict(d), which is wrong: iterating a dict yields its keys, so the comprehension unpacks each key whereas dict(d) would copy d. Suggest dict(d.keys()) instead.\n\nThe suggestion building was extracted into a helper to keep _check_unnecessary_comprehension within the branch limit.\n\nCloses #8256"
    },
    {
      "commit": "cb1792a1b40a634963fa67e7fc43ca487e77c013",
      "tree": "11d2c431828a3c89756777ebb70319701cff33ee",
      "parents": [
        "ee2ab9ad992ff045c99491170380331aeefc3f20"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Sat Jun 06 13:34:54 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 13:34:54 2026 +0000"
      },
      "message": "[Backport maintenance/4.0.x] Allow digits in TypeVar names for invalid-name check (#11079)\n\nAllow digits in TypeVar names for invalid-name check (#11078)\n\nThe default `typevar-rgx` rejected TypeVar names containing digits\n(e.g. `Ec2T`), emitting a false `invalid-name` (C0103). Allow digits\nin the lowercase segments of the pattern, consistent with the\n`typealias` pattern.\n\nCloses #8499\n\n\n(cherry picked from commit f9ac614e6db59325aae6006be006046211a693db)\n\nSigned-off-by: Labib-Bin-Salam \u003cLabibsalam0@gmail.com\u003e\nCo-authored-by: Labib Bin Salam \u003c98468420+Labib-Bin-Salam@users.noreply.github.com\u003e"
    },
    {
      "commit": "f9ac614e6db59325aae6006be006046211a693db",
      "tree": "3a7b2384b700fcaa7882e4c60abbe1c4262b8c40",
      "parents": [
        "b786516f5506123686e24600c03f0db4d705a17e"
      ],
      "author": {
        "name": "Labib Bin Salam",
        "email": "98468420+Labib-Bin-Salam@users.noreply.github.com",
        "time": "Sat Jun 06 14:11:57 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 15:11:57 2026 +0200"
      },
      "message": "Allow digits in TypeVar names for invalid-name check (#11078)\n\nThe default `typevar-rgx` rejected TypeVar names containing digits\n(e.g. `Ec2T`), emitting a false `invalid-name` (C0103). Allow digits\nin the lowercase segments of the pattern, consistent with the\n`typealias` pattern.\n\nCloses #8499\n\nSigned-off-by: Labib-Bin-Salam \u003cLabibsalam0@gmail.com\u003e"
    },
    {
      "commit": "ee2ab9ad992ff045c99491170380331aeefc3f20",
      "tree": "df525f9bbd475f4c091c38446025260d2275f7a5",
      "parents": [
        "5bb5498b38e2b9a858bd88445ab8aca272421020"
      ],
      "author": {
        "name": "Akshay",
        "email": "akshaychoudhary2040@gmail.com",
        "time": "Thu Jun 04 00:56:03 2026 +0530"
      },
      "committer": {
        "name": "Daniël van Noord",
        "email": "13665637+DanielNoord@users.noreply.github.com",
        "time": "Wed Jun 03 21:50:23 2026 +0200"
      },
      "message": "Handle InferenceError in decorator return analysis\n\n(cherry picked from commit b786516f5506123686e24600c03f0db4d705a17e)\n"
    },
    {
      "commit": "b786516f5506123686e24600c03f0db4d705a17e",
      "tree": "9c57d02e237c01aab1e011dab57078e1ed398b57",
      "parents": [
        "4105dbdd49009eb1b954ca9da1bb6c16bc8b4571"
      ],
      "author": {
        "name": "Akshay",
        "email": "akshaychoudhary2040@gmail.com",
        "time": "Thu Jun 04 00:56:03 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 21:26:03 2026 +0200"
      },
      "message": "Handle InferenceError in decorator return analysis"
    },
    {
      "commit": "4105dbdd49009eb1b954ca9da1bb6c16bc8b4571",
      "tree": "c567bf7e6698e7cee2895ca4673f398a981c99f8",
      "parents": [
        "c2052d677600d8ce459c0e348939d1ec5506edce"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Tue Jun 02 23:19:28 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 23:19:28 2026 +0200"
      },
      "message": "[pre-commit.ci] pre-commit autoupdate (#11072)\n\n* [pre-commit.ci] pre-commit autoupdate\n\nupdates:\n- [github.com/astral-sh/ruff-pre-commit: v0.15.14 → v0.15.15](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.14...v0.15.15)\n- [github.com/tox-dev/pyproject-fmt: v2.21.2 → v2.23.0](https://github.com/tox-dev/pyproject-fmt/compare/v2.21.2...v2.23.0)\n\n* [pre-commit.ci] auto fixes from pre-commit.com hooks\n\nfor more information, see https://pre-commit.ci\n\n* Apply suggestions from code review\n\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e\n\n* Revert \"[pre-commit.ci] auto fixes from pre-commit.com hooks\"\n\nThis reverts commit a918347d7af64057964789934a7d1fab992fd184.\n\n* [pre-commit.ci] auto fixes from pre-commit.com hooks\n\nfor more information, see https://pre-commit.ci\n\n---------\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "5bb5498b38e2b9a858bd88445ab8aca272421020",
      "tree": "87bc536621c73c3086964744f5ca73886bb3280b",
      "parents": [
        "a9405338d195fdc4b13cc1d0c44f8a9bfc58465f"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Tue Jun 02 23:17:54 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 23:17:54 2026 +0200"
      },
      "message": "[Backport maintenance/4.0.x] Fix crash in typecheck checker when metaclass argument is a non-class (#11075)\n\nFix crash in typecheck checker when metaclass argument is a non-class (#11074)\n\n\n(cherry picked from commit c2052d677600d8ce459c0e348939d1ec5506edce)\n\nSigned-off-by: Sai Asish Y \u003csay.apm35@gmail.com\u003e\nCo-authored-by: Sai Asish Y \u003csay.apm35@gmail.com\u003e"
    },
    {
      "commit": "c2052d677600d8ce459c0e348939d1ec5506edce",
      "tree": "60d46eecd535f46a58066f304beeb66b7d1643f7",
      "parents": [
        "b0feb025638c5ff38e692bb80a9b3234e5851a04"
      ],
      "author": {
        "name": "Sai Asish Y",
        "email": "say.apm35@gmail.com",
        "time": "Tue Jun 02 13:35:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 22:35:34 2026 +0200"
      },
      "message": "Fix crash in typecheck checker when metaclass argument is a non-class (#11074)\n\nSigned-off-by: Sai Asish Y \u003csay.apm35@gmail.com\u003e"
    },
    {
      "commit": "b0feb025638c5ff38e692bb80a9b3234e5851a04",
      "tree": "5da433e3597c4a42f262b29bd28ee44d45c017a3",
      "parents": [
        "55a7316b4b1dd7f0b11818586c57e2dd22c9a272"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jun 02 20:24:48 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 20:24:48 2026 +0200"
      },
      "message": "Bump actions/checkout from 6.0.2 to 6.0.3 (#11073)"
    },
    {
      "commit": "55a7316b4b1dd7f0b11818586c57e2dd22c9a272",
      "tree": "0bba92704c409786a8db39f9585c53418edd8ec3",
      "parents": [
        "bf0b2e90e60b822d7f95a8cee04a112fca61e488"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Fri Apr 24 16:28:53 2026 +0200"
      },
      "committer": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Tue Jun 02 11:13:14 2026 +0200"
      },
      "message": "Cover previously-untested dunder methods and edge cases in symilar\n\nAdds focused tests for `LineSetStartCouple.__eq__` NotImplemented branch,\n`LineSet.__str__` / `__getitem__` / non-LineSet `__eq__`, `append_stream`\nbinary-without-encoding and UnicodeDecodeError paths, `report_similarities`\ntable building, and the `process_module` deprecation warning when\n`linter.current_name` is None.\n\nTakes symilar.py from 96% to 99% coverage. The remaining gaps are an\nunreachable defensive `except KeyError` in `remove_successive` and the\n`if __name__ \u003d\u003d \"__main__\"` guard.\n"
    },
    {
      "commit": "bf0b2e90e60b822d7f95a8cee04a112fca61e488",
      "tree": "4939c673c5406a28e28e539b61a003be01b21ca4",
      "parents": [
        "cc129f259471a29cabe2c8ee71d905dfb0e41bfa"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Fri Apr 24 16:19:04 2026 +0200"
      },
      "committer": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Tue Jun 02 11:13:14 2026 +0200"
      },
      "message": "Cover aligned-zip fallback in symilar\u0027s _find_common\n\nAdds a functional test that mocks `_HASH_BUCKET_PRODUCT_LIMIT` to zero and\nruns symilar over repeated-block content so the aligned-zip fallback path\nis always exercised. Covers the previously-untested branch flagged in the\ncodecov report on #10881.\n\nAddresses Jacob\u0027s review request for test coverage on the \"other form of\nthe algorithm\" introduced to cap quadratic behavior.\n"
    },
    {
      "commit": "cc129f259471a29cabe2c8ee71d905dfb0e41bfa",
      "tree": "0c831814276623fa50ec9e78ff5b6af4115b1ea5",
      "parents": [
        "1453abcf3b8b3c9be715f4201571cbfff92f3699"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Tue Mar 03 16:29:06 2026 +0100"
      },
      "committer": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Tue Jun 02 11:13:14 2026 +0200"
      },
      "message": "Re-enable duplicate-code checker in stdlib primer test\n\nThe duplicate-code checker was previously disabled in the stdlib primer\nbecause it was too slow. With the recent performance optimizations it\nmight completes in reasonable time, so re-enable it.\n"
    },
    {
      "commit": "1453abcf3b8b3c9be715f4201571cbfff92f3699",
      "tree": "e0537fa9d43503f20557a3a28621eb9eb8794693",
      "parents": [
        "b10aa505157b0adcd9a8eef51aea32222a71160f"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Tue Mar 03 10:15:24 2026 +0100"
      },
      "committer": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Tue Jun 02 11:13:14 2026 +0200"
      },
      "message": "Cap hash bucket Cartesian product to prevent quadratic blow-up\n\nWhen two files share a hash bucket with many indices (e.g. thousands of\nidentical data lines), itertools.product explodes quadratically (4k x 22k\n\u003d 88M pairs).  Fall back to aligned zip pairing when the product exceeds\n500 entries.  The diagonal pairs are consecutive so remove_successive\nstill coalesces them into one correct block.\n\nBenchmark on psf/black (316 files, 129k lines including pathological\nprofiling/ data files with 22k+ identical lines): hung forever -\u003e 7.2s.\n"
    },
    {
      "commit": "b10aa505157b0adcd9a8eef51aea32222a71160f",
      "tree": "3cb0bad77f19214dd40574133cdae5ebd9a9c9c5",
      "parents": [
        "285a2e4419e06ac84220fa6c4a527476f19303c8"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Tue Mar 03 09:44:44 2026 +0100"
      },
      "committer": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Tue Jun 02 11:13:14 2026 +0200"
      },
      "message": "Reuse parsed AST in stripped_lines to avoid redundant astroid.parse()\n\nprocess_module already receives the parsed nodes.Module from pylint\u0027s\nmain pass, but stripped_lines was re-parsing every file from source text.\nThread the existing AST through process_module → append_stream → LineSet\n→ stripped_lines, falling back to astroid.parse() only when no tree is\nprovided (standalone symilar CLI).\n\nThe redundant parse dominated stripped_lines cost.  Per-file savings:\n\n  file size     time saved    memory saved\n  0 lines          0.14 ms       0.03 MB\n  924 lines       65    ms       2.1  MB\n  31k lines     2764    ms     101.6  MB\n\nEnd-to-end on pylint\u0027s own codebase (179 files, ~49k SLOC):\n\n  before  median\u003d6.6s  peak RSS\u003d170 MB\n  after   median\u003d5.1s  peak RSS\u003d149 MB  (1.5x faster, -12% memory)\n"
    },
    {
      "commit": "285a2e4419e06ac84220fa6c4a527476f19303c8",
      "tree": "14c1ba2d267c8e957d74bab17c0ad357a887f064",
      "parents": [
        "dd073057ea000581f170cd1b3677c8f677b6b540"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Mon Mar 02 15:35:27 2026 +0100"
      },
      "committer": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Tue Jun 02 11:13:14 2026 +0200"
      },
      "message": "Introduce LineSetHashResult and make hash params required in _find_common\n\nReplace the raw tuple[HashToIndex_T, IndexToLines_T] with a\nLineSetHashResult NamedTuple for clarity. Since _iter_sims always\npasses pre-computed hashes from its cache, make the parameters\nrequired and remove the unused fallback branches.\n"
    },
    {
      "commit": "dd073057ea000581f170cd1b3677c8f677b6b540",
      "tree": "db758d7f41dc0f99e0a744e50d0c98369c0e96c0",
      "parents": [
        "c6ca272c8581416a7eb24beaf3fb3733ec40eb1c"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sun Mar 01 22:49:23 2026 +0100"
      },
      "committer": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Tue Jun 02 11:13:14 2026 +0200"
      },
      "message": "Speed up duplicate-code checker with rolling hash and caching\n\nThree optimizations to the symilar checker:\n\n- Rolling hash: compute the window hash incrementally (subtract the\n  leaving line hash, add the entering one) instead of re-summing all\n  k line hashes for every position.\n\n- Cache hash_lineset results per lineset in _iter_sims: each file was\n  being hashed once per pair (N-1 times) instead of once total.\n\n- Remove the LinesChunk wrapper class and use plain int dict keys,\n  so frozenset intersection and dict lookups use C-level hash/eq.\n\n~\u003d25% faster on astroid (17,5s \u003d\u003e 12,5s, 25k SLOC)\n~\u003d70% faster on django (273s \u003d\u003e 77s, 130k SLOC)\n"
    },
    {
      "commit": "a9405338d195fdc4b13cc1d0c44f8a9bfc58465f",
      "tree": "ecf754aeeef7c3b3e2a87794991ccab61d6c35b6",
      "parents": [
        "b7a873a91684e6221c46f7ca8a3e6994c1efe632"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Sun May 31 20:50:45 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 20:50:45 2026 +0000"
      },
      "message": "[Backport maintenance/4.0.x] Fix a crash in `consider-using-enumerate` for non-name loop targets (#11068)\n\nFix a crash in `consider-using-enumerate` for non-name loop targets (#11067)\n\nfix(refactoring): prevent consider-using-enumerate crash on non-name loop target\n\n`_check_consider_using_enumerate` accessed `node.target.name` unconditionally, which raised `AttributeError` when the loop target was not a plain variable (e.g. `for self.idx in range(len(x))`), where `node.target` is an `AssignAttr`/`Tuple`/`Subscript` with no `.name`.\n\nGuard with an `AssignName` check and return early. This is also the correct semantics: a non-name target cannot be rewritten using `enumerate`, so no message should be emitted.\n\nCloses #10099\n\n\n(cherry picked from commit c6ca272c8581416a7eb24beaf3fb3733ec40eb1c)\n\nCo-authored-by: Joeseph Grey \u003c212606152+StressTestor@users.noreply.github.com\u003e\nCo-authored-by: StressTestor \u003c21268152+StressTestor@users.noreply.github.com\u003e"
    },
    {
      "commit": "c6ca272c8581416a7eb24beaf3fb3733ec40eb1c",
      "tree": "8b56f229739272ee666d0376a763168e6cb0110f",
      "parents": [
        "ffe2023bfac0cd0e0830e8b158d24f1e9a18efdf"
      ],
      "author": {
        "name": "Joeseph Grey",
        "email": "212606152+StressTestor@users.noreply.github.com",
        "time": "Sun May 31 14:17:49 2026 -0600"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 20:17:49 2026 +0000"
      },
      "message": "Fix a crash in `consider-using-enumerate` for non-name loop targets (#11067)\n\nfix(refactoring): prevent consider-using-enumerate crash on non-name loop target\n\n`_check_consider_using_enumerate` accessed `node.target.name` unconditionally, which raised `AttributeError` when the loop target was not a plain variable (e.g. `for self.idx in range(len(x))`), where `node.target` is an `AssignAttr`/`Tuple`/`Subscript` with no `.name`.\n\nGuard with an `AssignName` check and return early. This is also the correct semantics: a non-name target cannot be rewritten using `enumerate`, so no message should be emitted.\n\nCloses #10099\n\nCo-authored-by: StressTestor \u003c21268152+StressTestor@users.noreply.github.com\u003e"
    },
    {
      "commit": "b7a873a91684e6221c46f7ca8a3e6994c1efe632",
      "tree": "dc40fb7bccd174aea5b8c03a46e1739dccc64c13",
      "parents": [
        "fed461f75fa3317821044ffb28083b3164c01197"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Sun May 31 18:26:11 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 18:26:11 2026 +0000"
      },
      "message": "[Backport maintenance/4.0.x] Fix crash in deprecated checker for non-string ``__import__`` argument (#11066)\n\nFix crash in deprecated checker for non-string ``__import__`` argument (#11061)\n\n\n\n(cherry picked from commit ffe2023bfac0cd0e0830e8b158d24f1e9a18efdf)\n\nSigned-off-by: Sai Asish Y \u003csay.apm35@gmail.com\u003e\nCo-authored-by: Sai Asish Y \u003csay.apm35@gmail.com\u003e\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "fed461f75fa3317821044ffb28083b3164c01197",
      "tree": "733e2891bc46c50dc7300a7ef57d3c978ffd928f",
      "parents": [
        "2841ba30c3b9801bc1052cfd26942c3fd0443621"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Sun May 31 15:08:39 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 15:08:39 2026 +0000"
      },
      "message": "[Backport maintenance/4.0.x] fix: use metaclass __call__ signature on class instantiation (#11065)\n\nfix: use metaclass __call__ signature on class instantiation (#11055)\n\nFixes a E1121 (too-many-function-args),\na E1120 (no-value-for-parameter) and probaly other false positives\nrelated to the function signature,\nthat triggers when a class uses a metaclass\nthat overrides `__call__` with a different signature.\n\nThis was caused by `_determine_callable`\nin `pylint/checkers/typecheck.py` that was not checking for the\npotential metaclass and their potential `__call__` override\nand rather solely checked `__init__` and `__new__`.\nAdding a check for it\u0027s existence and returning it\nsolved the false positives.\n\n\n(cherry picked from commit d6eb4812f4a02c24d4ab986489304048618852a8)\n\nSigned-off-by: Millefeuille \u003cmillefeuille42@proton.me\u003e\nCo-authored-by: Millefeuille \u003cmillefeuille42@proton.me\u003e"
    },
    {
      "commit": "ffe2023bfac0cd0e0830e8b158d24f1e9a18efdf",
      "tree": "dcfe239a9c95a3af53aca7fdedf125df77ae193e",
      "parents": [
        "f339d47d88f3379f39d18f1f60f4eb0b492f4e9a"
      ],
      "author": {
        "name": "Sai Asish Y",
        "email": "say.apm35@gmail.com",
        "time": "Sun May 31 07:49:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 16:49:43 2026 +0200"
      },
      "message": "Fix crash in deprecated checker for non-string ``__import__`` argument (#11061)\n\n\nSigned-off-by: Sai Asish Y \u003csay.apm35@gmail.com\u003e\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "f339d47d88f3379f39d18f1f60f4eb0b492f4e9a",
      "tree": "5b9bf87d19287cff8714230fb04bfa05f78b633c",
      "parents": [
        "d6eb4812f4a02c24d4ab986489304048618852a8"
      ],
      "author": {
        "name": "Roger Sheu",
        "email": "78449574+rogersheu@users.noreply.github.com",
        "time": "Sun May 31 07:48:43 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 16:48:43 2026 +0200"
      },
      "message": "docs: Change `--indent-string`\u0027s whitespace representation (#9904)\n\n\nCloses #8392\n\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "d6eb4812f4a02c24d4ab986489304048618852a8",
      "tree": "bbd486cc283edc9359b628636b4f13001a4e5cbc",
      "parents": [
        "ecf358ff23b35336c4e8776458578f017048e36c"
      ],
      "author": {
        "name": "Millefeuille",
        "email": "millefeuille42@proton.me",
        "time": "Sun May 31 16:47:42 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 16:47:42 2026 +0200"
      },
      "message": "fix: use metaclass __call__ signature on class instantiation (#11055)\n\nFixes a E1121 (too-many-function-args),\na E1120 (no-value-for-parameter) and probaly other false positives\nrelated to the function signature,\nthat triggers when a class uses a metaclass\nthat overrides `__call__` with a different signature.\n\nThis was caused by `_determine_callable`\nin `pylint/checkers/typecheck.py` that was not checking for the\npotential metaclass and their potential `__call__` override\nand rather solely checked `__init__` and `__new__`.\nAdding a check for it\u0027s existence and returning it\nsolved the false positives.\n\nSigned-off-by: Millefeuille \u003cmillefeuille42@proton.me\u003e"
    },
    {
      "commit": "2841ba30c3b9801bc1052cfd26942c3fd0443621",
      "tree": "242d31e203cd1913d0ae52085bd95dfe34fd32f6",
      "parents": [
        "96f10ed809e0a209132ae2db80fca87d9124012e"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Sun May 31 14:09:06 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 14:09:06 2026 +0000"
      },
      "message": "[Backport maintenance/4.0.x] Fix crash on chained TypeAlias assignment with a non-name target (#11064)\n\nFix crash on chained TypeAlias assignment with a non-name target (#11062)\n\n\n(cherry picked from commit ecf358ff23b35336c4e8776458578f017048e36c)\n\nSigned-off-by: Sai Asish Y \u003csay.apm35@gmail.com\u003e\nCo-authored-by: Sai Asish Y \u003csay.apm35@gmail.com\u003e\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "96f10ed809e0a209132ae2db80fca87d9124012e",
      "tree": "94ce64d8c75b25c887695cc5b6ba983b29d36f5c",
      "parents": [
        "1d841e55100719aa583faf21c0aff0bfeafccdea"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Sun May 31 15:21:07 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 15:21:07 2026 +0200"
      },
      "message": "[Backport maintenance/4.0.x] Fix no-member false positive on union with dynamic __getattr__ (#11063)\n\nFix no-member false positive on union with dynamic __getattr__ (#11052)\n\nWhen an attribute access target infers to several possible owners (e.g.\n``A | B``) and at least one of them defines a dynamic ``__getattr__``, the\nattribute may exist at runtime. Per the checker\u0027s documented policy -- the\naccess is considered correct as soon as a single inferred owner could have\nthe attribute -- pylint must not emit no-member.\n\nPreviously the ``has_dynamic_getattr`` guard lived inside ``_emit_no_member``\nand only caused the dynamic owner itself to be skipped, so a sibling owner\nwithout the attribute still produced a false positive. Move the check up into\n``visit_attribute`` so the whole access is skipped as soon as any inferred\nowner has a dynamic ``__getattr__``.\n\nCloses #9833\n\n(cherry picked from commit f27e3c09b8f26a0db12b55828ac16ea6ad6a9ac1)\n\nCo-authored-by: Hamza Mobeen \u003cs.hamzamobeen@gmail.com\u003e"
    },
    {
      "commit": "ecf358ff23b35336c4e8776458578f017048e36c",
      "tree": "1b66c3339076c7fdf2ba22e061b3f38b5be676ba",
      "parents": [
        "f27e3c09b8f26a0db12b55828ac16ea6ad6a9ac1"
      ],
      "author": {
        "name": "Sai Asish Y",
        "email": "say.apm35@gmail.com",
        "time": "Sun May 31 06:19:20 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 15:19:20 2026 +0200"
      },
      "message": "Fix crash on chained TypeAlias assignment with a non-name target (#11062)\n\nSigned-off-by: Sai Asish Y \u003csay.apm35@gmail.com\u003e"
    },
    {
      "commit": "f27e3c09b8f26a0db12b55828ac16ea6ad6a9ac1",
      "tree": "86b4030a455d608559ecb9665b5442a6e99be6e2",
      "parents": [
        "880b90d4afd327d92c16ffafaa2e445683186ff5"
      ],
      "author": {
        "name": "Hamza Mobeen",
        "email": "s.hamzamobeen@gmail.com",
        "time": "Sun May 31 13:07:23 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 14:07:23 2026 +0200"
      },
      "message": "Fix no-member false positive on union with dynamic __getattr__ (#11052)\n\nWhen an attribute access target infers to several possible owners (e.g.\n``A | B``) and at least one of them defines a dynamic ``__getattr__``, the\nattribute may exist at runtime. Per the checker\u0027s documented policy -- the\naccess is considered correct as soon as a single inferred owner could have\nthe attribute -- pylint must not emit no-member.\n\nPreviously the ``has_dynamic_getattr`` guard lived inside ``_emit_no_member``\nand only caused the dynamic owner itself to be skipped, so a sibling owner\nwithout the attribute still produced a false positive. Move the check up into\n``visit_attribute`` so the whole access is skipped as soon as any inferred\nowner has a dynamic ``__getattr__``.\n\nCloses #9833"
    },
    {
      "commit": "1d841e55100719aa583faf21c0aff0bfeafccdea",
      "tree": "3608e2103a1175233744c5fadfd5bb97fbf84fa7",
      "parents": [
        "44ab478b09c8075bf0cfae2acb4f0956ab563a2b"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Wed May 27 03:49:46 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 03:49:46 2026 +0000"
      },
      "message": "[Backport maintenance/4.0.x] Fix ``function-redefined`` false positive for names matching ``dummy-variables-rgx`` (#11050)\n\nFix ``function-redefined`` false positive for names matching ``dummy-variables-rgx`` (#11046)\n\nRestore the pre-4.0 behavior of skipping ``function-redefined`` when the\nfunction name matches ``dummy-variables-rgx`` (e.g. ``_``), which is the\ncommon pattern used for ``pytest-bdd`` step definitions. As a side effect,\nthe false negative addressed in #9894 is reintroduced for functions whose\nname matches that regex; users wanting to flag e.g. ``_my_func`` can tighten\n``dummy-variables-rgx`` accordingly.\n\nCloses #10665\n\n(cherry picked from commit 880b90d4afd327d92c16ffafaa2e445683186ff5)\n\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "880b90d4afd327d92c16ffafaa2e445683186ff5",
      "tree": "9fc164d23fedafa9f0750fef456ee2ac192eb2c1",
      "parents": [
        "5b17c0abeafe3e442e8278a03e807e2cfc84c8d6"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Wed May 27 05:24:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 27 05:24:19 2026 +0200"
      },
      "message": "Fix ``function-redefined`` false positive for names matching ``dummy-variables-rgx`` (#11046)\n\nRestore the pre-4.0 behavior of skipping ``function-redefined`` when the\nfunction name matches ``dummy-variables-rgx`` (e.g. ``_``), which is the\ncommon pattern used for ``pytest-bdd`` step definitions. As a side effect,\nthe false negative addressed in #9894 is reintroduced for functions whose\nname matches that regex; users wanting to flag e.g. ``_my_func`` can tighten\n``dummy-variables-rgx`` accordingly.\n\nCloses #10665"
    },
    {
      "commit": "5b17c0abeafe3e442e8278a03e807e2cfc84c8d6",
      "tree": "a8c77a9fbebc9d72a9b23cbeda836990b5ac0090",
      "parents": [
        "635ebe929cb2c9938cde117fb198110c8bb48f43"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Tue May 26 06:50:13 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 26 06:50:13 2026 +0200"
      },
      "message": "[pre-commit.ci] pre-commit autoupdate (#11049)\n\nupdates:\n- [github.com/astral-sh/ruff-pre-commit: v0.15.13 → v0.15.14](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.13...v0.15.14)\n- [github.com/psf/black-pre-commit-mirror: 26.5.0 → 26.5.1](https://github.com/psf/black-pre-commit-mirror/compare/26.5.0...26.5.1)\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "44ab478b09c8075bf0cfae2acb4f0956ab563a2b",
      "tree": "b596bcde3c0a8ec54dd0f6172592689f5500cc24",
      "parents": [
        "1f0794ea48cc32dd0dd44a0716e18b1f793af1a2"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Sun May 24 22:41:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 22:41:44 2026 +0200"
      },
      "message": "[Backport maintenance/4.0.x] Fix crash on non-constant ``TypeVar`` variance argument (#11045)\n\nFix crash on non-constant ``TypeVar`` variance argument (#11027)\n\n``_check_typevar`` read ``kw.value.value`` directly for the\n``covariant`` and ``contravariant`` keywords, assuming the argument was\nalways a constant. When it is any other expression, such as a name, the\nnode has no ``value`` attribute and the name checker crashed with an\n``AttributeError``. Guard the access with an ``isinstance`` check\nagainst ``nodes.Const``, mirroring the existing handling of the\n``name`` keyword.\n\nCloses #11022\n\n(cherry picked from commit 635ebe929cb2c9938cde117fb198110c8bb48f43)\n\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "1f0794ea48cc32dd0dd44a0716e18b1f793af1a2",
      "tree": "577ca743cad8582823065710f49eecc13db933cd",
      "parents": [
        "b0ea1ab774101252ffb36591f28a4ce18726d06c"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Sun May 24 22:41:16 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 22:41:16 2026 +0200"
      },
      "message": "[Backport maintenance/4.0.x] Fix crash when ``NotImplemented`` is used as an ``if`` test (#11042)\n\nFix crash when ``NotImplemented`` is used as an ``if`` test (#11026)\n\n``_inferred_to_define_name_raise_or_return_for_if_node`` evaluated\n``not val`` on every inferred constant test value. On Python 3.14,\n``not NotImplemented`` raises a ``TypeError`` because ``NotImplemented``\nmust not be used in a boolean context. The adjacent ``only_search_if``\nline already guarded against ``NotImplemented``, so apply the same\nguard to ``only_search_else``.\n\nCloses #11025\n\n(cherry picked from commit c8be7ea1d7a43925e789a342167c2e290e40e41d)\n\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "b0ea1ab774101252ffb36591f28a4ce18726d06c",
      "tree": "4d137bcad3e32c1154cf8c605fb7861fc16ac2a4",
      "parents": [
        "fce70f55606f1618393447274da7dffe403beecd"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Sun May 24 22:39:44 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 22:39:44 2026 +0200"
      },
      "message": "[Backport maintenance/4.0.x] Fix false positive method-hidden for bare cached_property import (#11040)\n\nFix false positive method-hidden for bare cached_property import (#11037)\n\n\n(cherry picked from commit 0b0fbe5115834bbc1378120b2d3976954c9ea11e)\n\nSigned-off-by: Emmanuel Ferdman \u003cemmanuelferdman@gmail.com\u003e\nCo-authored-by: Emmanuel Ferdman \u003cemmanuelferdman@gmail.com\u003e\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "fce70f55606f1618393447274da7dffe403beecd",
      "tree": "b8f62a03e418afb079bc551d47712a94f4c4c858",
      "parents": [
        "a29f40251217c6242f0d08886f02e5e569f7aa11"
      ],
      "author": {
        "name": "pylint-backport[bot]",
        "email": "212256041+pylint-backport[bot]@users.noreply.github.com",
        "time": "Sun May 24 20:36:05 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 20:36:05 2026 +0000"
      },
      "message": "[Backport maintenance/4.0.x] Fix crash checking a metaclass attribute chain not rooted at a name (#11036)\n\nFix crash checking a metaclass attribute chain not rooted at a name (#11031)\n\n``_check_classdef_metaclasses`` walked the ``.expr`` chain of an ``Attribute`` metaclass with ``while not isinstance(attr, nodes.Name)``, assuming the chain always terminates in a ``Name``. For a metaclass such as ``None._`` the chain bottoms out at a ``Const``, so the loop accessed ``.expr`` on a non-Attribute node and crashed with an ``AttributeError``.\n\nWalk only while the node is an ``Attribute`` and bind the name solely when the base is a ``Name``. Also guard the ``undefined-variable`` report with a non-empty name so an unresolved chain no longer reports an empty variable name.\n\nCloses https://github.com/pylint-dev/astroid/issues/3066\n\n(cherry picked from commit 0ede7d90aa6c187f330691e2fb4845e1b4e92d13)\n\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "a29f40251217c6242f0d08886f02e5e569f7aa11",
      "tree": "9e7b0a8354cd8adb9fb24155ded1d0908bc0fee0",
      "parents": [
        "f6a72aef414411ca894a64c938a734480f28b815"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sun May 24 21:58:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 21:58:43 2026 +0200"
      },
      "message": "Pin PyPy 3.11 to avoid astroid bootstrap failure (#10999) (#11044)\n\n(cherry picked from commit 25d42ce9e444595fbc48f5bf6b9615357e6ca3ff)\n\nCo-authored-by: Aleksandr Kotlyar \u003cask.kotlyar@gmail.com\u003e"
    },
    {
      "commit": "635ebe929cb2c9938cde117fb198110c8bb48f43",
      "tree": "6beeec616ee516c75b78cd38c06f8e0cd1a8bf9e",
      "parents": [
        "c8be7ea1d7a43925e789a342167c2e290e40e41d"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sun May 24 21:51:26 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 21:51:26 2026 +0200"
      },
      "message": "Fix crash on non-constant ``TypeVar`` variance argument (#11027)\n\n``_check_typevar`` read ``kw.value.value`` directly for the\n``covariant`` and ``contravariant`` keywords, assuming the argument was\nalways a constant. When it is any other expression, such as a name, the\nnode has no ``value`` attribute and the name checker crashed with an\n``AttributeError``. Guard the access with an ``isinstance`` check\nagainst ``nodes.Const``, mirroring the existing handling of the\n``name`` keyword.\n\nCloses #11022"
    },
    {
      "commit": "c8be7ea1d7a43925e789a342167c2e290e40e41d",
      "tree": "7cf154c47dde7a928bb6491abf19b2ef1a89bfa3",
      "parents": [
        "2ff604aa8d4150126677a1bc188d18c799c572f1"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sun May 24 09:27:51 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 09:27:51 2026 +0200"
      },
      "message": "Fix crash when ``NotImplemented`` is used as an ``if`` test (#11026)\n\n``_inferred_to_define_name_raise_or_return_for_if_node`` evaluated\n``not val`` on every inferred constant test value. On Python 3.14,\n``not NotImplemented`` raises a ``TypeError`` because ``NotImplemented``\nmust not be used in a boolean context. The adjacent ``only_search_if``\nline already guarded against ``NotImplemented``, so apply the same\nguard to ``only_search_else``.\n\nCloses #11025"
    },
    {
      "commit": "2ff604aa8d4150126677a1bc188d18c799c572f1",
      "tree": "f0005388ed52d4d88d24ab1bc04557bbb1c62d4a",
      "parents": [
        "0b0fbe5115834bbc1378120b2d3976954c9ea11e"
      ],
      "author": {
        "name": "Jacob Walls",
        "email": "jacobtylerwalls@gmail.com",
        "time": "Sat May 23 14:19:49 2026 -0400"
      },
      "committer": {
        "name": "Jacob Walls",
        "email": "jacobtylerwalls@gmail.com",
        "time": "Sat May 23 16:28:50 2026 -0400"
      },
      "message": "Bump default python to 3.14\n"
    },
    {
      "commit": "0b0fbe5115834bbc1378120b2d3976954c9ea11e",
      "tree": "9f792b205999912716156194fd36126efc9cd9fc",
      "parents": [
        "0ede7d90aa6c187f330691e2fb4845e1b4e92d13"
      ],
      "author": {
        "name": "Emmanuel Ferdman",
        "email": "emmanuelferdman@gmail.com",
        "time": "Sat May 23 22:47:51 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 23 21:47:51 2026 +0200"
      },
      "message": "Fix false positive method-hidden for bare cached_property import (#11037)\n\n\nSigned-off-by: Emmanuel Ferdman \u003cemmanuelferdman@gmail.com\u003e"
    },
    {
      "commit": "0ede7d90aa6c187f330691e2fb4845e1b4e92d13",
      "tree": "de036202c1413463c13fb6e6df4905c82d79f867",
      "parents": [
        "f29b4c09dbb034aaf15cef1e1c4dafe14883166b"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Fri May 22 17:21:43 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 17:21:43 2026 +0200"
      },
      "message": "Fix crash checking a metaclass attribute chain not rooted at a name (#11031)\n\n\n``_check_classdef_metaclasses`` walked the ``.expr`` chain of an ``Attribute`` metaclass with ``while not isinstance(attr, nodes.Name)``, assuming the chain always terminates in a ``Name``. For a metaclass such as ``None._`` the chain bottoms out at a ``Const``, so the loop accessed ``.expr`` on a non-Attribute node and crashed with an ``AttributeError``.\n\nWalk only while the node is an ``Attribute`` and bind the name solely when the base is a ``Name``. Also guard the ``undefined-variable`` report with a non-empty name so an unresolved chain no longer reports an empty variable name.\n\nCloses https://github.com/pylint-dev/astroid/issues/3066"
    },
    {
      "commit": "f6a72aef414411ca894a64c938a734480f28b815",
      "tree": "4c01d46b882e43f03bb0ed9067da06db7f0bdcc8",
      "parents": [
        "532aaac048fc1554f3b841abeb4d25636d0ea392"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Wed May 20 08:45:20 2026 +0200"
      },
      "committer": {
        "name": "Daniël van Noord",
        "email": "13665637+DanielNoord@users.noreply.github.com",
        "time": "Fri May 22 16:27:34 2026 +0200"
      },
      "message": "Fix crash when a name resolves to a dataclass-synthesized ``__init__``\n\n``_detect_global_scope`` compares the line numbers of two frames, but a\nnode synthesized by an astroid brain (such as the ``__init__`` generated\nfor a ``@dataclass``) has ``lineno`` set to ``None``, which raised a\n``TypeError``.\n\nCloses #11023\n\n(cherry picked from commit f29b4c09dbb034aaf15cef1e1c4dafe14883166b)\n"
    },
    {
      "commit": "f29b4c09dbb034aaf15cef1e1c4dafe14883166b",
      "tree": "39a018f5a8bb5cedd32abb560d7dd1365981bc6a",
      "parents": [
        "2188514066e051406c07664ac88a1b731e512762"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Wed May 20 08:45:20 2026 +0200"
      },
      "committer": {
        "name": "Daniël van Noord",
        "email": "13665637+DanielNoord@users.noreply.github.com",
        "time": "Fri May 22 16:22:17 2026 +0200"
      },
      "message": "Fix crash when a name resolves to a dataclass-synthesized ``__init__``\n\n``_detect_global_scope`` compares the line numbers of two frames, but a\nnode synthesized by an astroid brain (such as the ``__init__`` generated\nfor a ``@dataclass``) has ``lineno`` set to ``None``, which raised a\n``TypeError``.\n\nCloses #11023\n"
    },
    {
      "commit": "532aaac048fc1554f3b841abeb4d25636d0ea392",
      "tree": "51590d58396b02886b39b2bcb8ef06422c570cac",
      "parents": [
        "e0d8c1a5a59b423de6d2706ca49a9bd4f4719007"
      ],
      "author": {
        "name": "Puneet Dixit",
        "email": "puneetdixit4321@gmail.com",
        "time": "Fri May 22 19:18:46 2026 +0530"
      },
      "committer": {
        "name": "Daniël van Noord",
        "email": "13665637+DanielNoord@users.noreply.github.com",
        "time": "Fri May 22 16:02:43 2026 +0200"
      },
      "message": "Avoid crashing on empty len calls\n\n(cherry picked from commit 2188514066e051406c07664ac88a1b731e512762)\n"
    },
    {
      "commit": "2188514066e051406c07664ac88a1b731e512762",
      "tree": "a178b87e736079ddae59a517411e186727762218",
      "parents": [
        "b39b96fabe4f7d9e247415dfb3f85d0d298202fd"
      ],
      "author": {
        "name": "Puneet Dixit",
        "email": "puneetdixit4321@gmail.com",
        "time": "Fri May 22 19:18:46 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 15:48:46 2026 +0200"
      },
      "message": "Avoid crashing on empty len calls"
    },
    {
      "commit": "b39b96fabe4f7d9e247415dfb3f85d0d298202fd",
      "tree": "5e0b1b0de8e18cbc359131809774e67c42ae3ba4",
      "parents": [
        "734b89873616ee0407c87b7c6a1945d120ca49ee"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Wed May 20 15:41:05 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 15:41:05 2026 +0200"
      },
      "message": "[primer] Add comparator test cases for classification and rename (#11029)\n\nAdd the ``new_messages_classified`` and ``symbol_renamed`` primer\ncomparison fixtures. Their ``expected.txt`` and\n``expected_comparator.json`` capture the comparator\u0027s current output.\n\nLanding them on their own lets a follow-up change to the comparator\nshow its effect on the rendered comment as a reviewable diff rather\nthan as brand-new expected files."
    },
    {
      "commit": "734b89873616ee0407c87b7c6a1945d120ca49ee",
      "tree": "5d44e39d56acbe010131512a924d5f8c92f02c28",
      "parents": [
        "fb81a3dc69db874ad5f9168510ac239f745a284f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed May 20 00:24:06 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 00:24:06 2026 +0200"
      },
      "message": "Bump actions/create-github-app-token from 3.1.1 to 3.2.0 (#11021)\n\nBumps [actions/create-github-app-token](https://github.com/actions/create-github-app-token) from 3.1.1 to 3.2.0.\n- [Release notes](https://github.com/actions/create-github-app-token/releases)\n- [Changelog](https://github.com/actions/create-github-app-token/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/create-github-app-token/compare/1b10c78c7865c340bc4f6099eb2f838309f1e8c3...bcd2ba49218906704ab6c1aa796996da409d3eb1)\n\n---\nupdated-dependencies:\n- dependency-name: actions/create-github-app-token\n  dependency-version: 3.2.0\n  dependency-type: direct:production\n  update-type: version-update:semver-minor\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": "fb81a3dc69db874ad5f9168510ac239f745a284f",
      "tree": "8de2acb96fd61de76a69c9a042c7af575d5b5c28",
      "parents": [
        "d523e3e8999c255740fb37936155718f39bd7f4c"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Tue May 19 07:44:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 07:44:55 2026 +0200"
      },
      "message": "[pre-commit.ci] pre-commit autoupdate (#11020)\n\nupdates:\n- [github.com/astral-sh/ruff-pre-commit: v0.15.12 → v0.15.13](https://github.com/astral-sh/ruff-pre-commit/compare/v0.15.12...v0.15.13)\n- [github.com/psf/black-pre-commit-mirror: 26.3.1 → 26.5.0](https://github.com/psf/black-pre-commit-mirror/compare/26.3.1...26.5.0)\n- [github.com/pre-commit/mirrors-mypy: v2.0.0 → v2.1.0](https://github.com/pre-commit/mirrors-mypy/compare/v2.0.0...v2.1.0)\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "d523e3e8999c255740fb37936155718f39bd7f4c",
      "tree": "979337fdd7df83309f1b92627b3d561c8f34b328",
      "parents": [
        "7667457f554b92015152f76ab901f27d6593d71e"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sun May 17 11:12:39 2026 +0200"
      },
      "committer": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Mon May 18 23:18:37 2026 +0200"
      },
      "message": "Replace ``MSG_STATE_*`` int constants with ``MessageDisableScope`` enum\n\nThe three integer constants used by ``_get_message_state_scope`` /\n``handle_ignored_message`` (``MSG_STATE_SCOPE_CONFIG \u003d 0``,\n``MSG_STATE_SCOPE_MODULE \u003d 1``, ``MSG_STATE_CONFIDENCE \u003d 2``) were bare\nints with no semantic context at call sites. Replace them with a\n``MessageDisableScope`` enum exposing ``CONFIG`` / ``MODULE`` /\n``CONFIDENCE`` members.\n\n``MessageDisableScope`` is an ``IntEnum`` with the same numeric values,\nand the old ``MSG_STATE_*`` names are kept as aliases pointing at the\nenum members, so external code comparing the return value to\n``0`` / ``1`` / ``2`` keeps working.\n\nRefs #11018\n"
    },
    {
      "commit": "7667457f554b92015152f76ab901f27d6593d71e",
      "tree": "f41077d612ee5ff091975c718abaeb631181e886",
      "parents": [
        "52efad31a35fc766e9af4bd80a651d2af0eba92c"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sun May 17 11:16:00 2026 +0200"
      },
      "committer": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Mon May 18 23:18:37 2026 +0200"
      },
      "message": "Tighten ``confidence`` to non-nullable in the emit/filter pipeline\n\nThe ``confidence`` parameter is no longer nullable on any APIs except for\n``is_message_enabled`` (where ``confidence\u003dNone`` means \"don\u0027t filter by\nconfidence\"). The default became ``interfaces.UNDEFINED`` (an immutable value);\nthe behavior is unchanged unless you were passing an explicit ``None``.\n\nThis avoid a runtime check in multiple function to set the default value conditionally.\n\nRefs #11018\n"
    },
    {
      "commit": "52efad31a35fc766e9af4bd80a651d2af0eba92c",
      "tree": "3553f83ac2c77200bb20154c0942337609a3d127",
      "parents": [
        "9f08fc7bbc0f389c18a70cf1aaf71a2dc16c776f"
      ],
      "author": {
        "name": "Emmanuel Ferdman",
        "email": "emmanuelferdman@gmail.com",
        "time": "Mon May 18 23:39:32 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 20:39:32 2026 +0000"
      },
      "message": "Fix false positive E0203 for bare type annotations (#11015)\n\n\nSigned-off-by: Emmanuel Ferdman \u003cemmanuelferdman@gmail.com\u003e\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "e0d8c1a5a59b423de6d2706ca49a9bd4f4719007",
      "tree": "7ce946c7a0ab50c39a5a8dab46764c35fb69fd77",
      "parents": [
        "a53821e8f1d6faa998318a6d1605fa055312a05a"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sat May 16 18:35:10 2026 +0200"
      },
      "committer": {
        "name": "Daniël van Noord",
        "email": "13665637+DanielNoord@users.noreply.github.com",
        "time": "Mon May 18 21:39:34 2026 +0200"
      },
      "message": "Preserve an explicit ``col_offset\u003d0`` in ``add_message``\n\n``_add_one_message`` used ``if not col_offset:`` (and likewise for\n``line``/``end_lineno``/``end_col_offset``) to detect \"caller didn\u0027t\nsupply this field\". Since ``not 0`` is ``True``, an explicit zero from\nthe caller — which is a valid column index — was silently overwritten\nby the node\u0027s value.\n\nSwitch to ``X is None`` so we only fill from the node when the field\nwas actually omitted.\n\nRefs #10894\n\n(cherry picked from commit 31095a23fa20d953560cab13192a2dc972698aae)\n"
    },
    {
      "commit": "9f08fc7bbc0f389c18a70cf1aaf71a2dc16c776f",
      "tree": "f330df01b1e8f0c9414ff52433b7d15f76ef37ec",
      "parents": [
        "c0aa7e58e532558b61493d4362254d0a0cd108cc"
      ],
      "author": {
        "name": "Shane Smiskol",
        "email": "shane@smiskol.com",
        "time": "Mon May 18 12:39:06 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 21:39:06 2026 +0200"
      },
      "message": "Warn on incomplete concrete classes that inherit from abstract classes (#7955)\n\n* Warn on incomplete concrete classes that inherit from abstract classes\n\n``class_is_abstract`` previously treated a class as abstract whenever\nany of its ancestors inherited from ``abc.ABC``. That meant a concrete\nclass which only inherited from an abstract intermediate (without\nre-declaring ``abc.ABC`` or ``ABCMeta``) was silently exempted from the\n``abstract-method`` check, even when it left abstract methods\nunimplemented.\n\nThe check now only treats a class as abstract when it declares so\nitself: direct ``abc.ABC`` inheritance, ``metaclass\u003dABCMeta``, an\n``@abstractmethod`` defined on the class, or a Protocol class. Concrete\nsubclasses that skip the explicit opt-in are now flagged for the\nabstract methods they inherit and do not override.\n\nCloses #7950\n\n* Add changelog fragment for #7950 false-negative fix\n\n---------\n\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "c0aa7e58e532558b61493d4362254d0a0cd108cc",
      "tree": "5c2d22a14a5c4e02cb2b4a94a788b9afafad9cd4",
      "parents": [
        "31095a23fa20d953560cab13192a2dc972698aae"
      ],
      "author": {
        "name": "adam-grant-hendry",
        "email": "59346180+adam-grant-hendry@users.noreply.github.com",
        "time": "Mon May 18 12:35:23 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 21:35:23 2026 +0200"
      },
      "message": "fix(numpy-param-doc): allow \"default\" in params"
    },
    {
      "commit": "31095a23fa20d953560cab13192a2dc972698aae",
      "tree": "b263a571c359e369ca3c4c14e0796a7405b6abdb",
      "parents": [
        "166f071ed5c17dcc0096ab88cd81fcaaa680fd08"
      ],
      "author": {
        "name": "Pierre Sassoulas",
        "email": "pierre.sassoulas@gmail.com",
        "time": "Sat May 16 18:35:10 2026 +0200"
      },
      "committer": {
        "name": "Daniël van Noord",
        "email": "13665637+DanielNoord@users.noreply.github.com",
        "time": "Mon May 18 21:23:59 2026 +0200"
      },
      "message": "Preserve an explicit ``col_offset\u003d0`` in ``add_message``\n\n``_add_one_message`` used ``if not col_offset:`` (and likewise for\n``line``/``end_lineno``/``end_col_offset``) to detect \"caller didn\u0027t\nsupply this field\". Since ``not 0`` is ``True``, an explicit zero from\nthe caller — which is a valid column index — was silently overwritten\nby the node\u0027s value.\n\nSwitch to ``X is None`` so we only fill from the node when the field\nwas actually omitted.\n\nRefs #10894\n"
    },
    {
      "commit": "166f071ed5c17dcc0096ab88cd81fcaaa680fd08",
      "tree": "a4c63cad87d4795adc3b77f3bc2d688e1b3f4add",
      "parents": [
        "0e9a3fc57817da82dd3edd079f5f3c267e8d1b1e"
      ],
      "author": {
        "name": "MJSHANG",
        "email": "shangmengjiajiajia@gmail.com",
        "time": "Mon May 18 12:18:28 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 21:18:28 2026 +0200"
      },
      "message": "Fix false positive for inconsistent-return-statements on unbound NoReturn methods (#11014)\n\n* Fix false positive for inconsistent-return-statements on unbound NoReturn methods\n\nCalling an instance method via the class (e.g. ``MyClass.raise_method(obj)``)\nis inferred by astroid as an ``UnboundMethod`` rather than a ``BoundMethod``.\nThe refactoring checker only handled ``FunctionDef`` and ``BoundMethod`` when\ndetermining whether a call never returns, so unbound calls to ``NoReturn``-\nannotated methods were missed and ``inconsistent-return-statements`` was\nemitted even when the method never returns.\n\nInclude ``bases.UnboundMethod`` in the isinstance check and update\n``_is_function_def_never_returning`` to accept it as well. ``UnboundMethod``\nalready proxies ``qname()`` and ``returns`` to the underlying ``FunctionDef``,\nso the existing logic works without further changes.\n\nCloses #9692\n\n* Add UnboundMethod to spelling dict\n\nThe docstring added in this PR references astroid.UnboundMethod, which\nthe spelling checker flagged because boundmethod was the only related\nentry in custom_dict.txt. Add unboundmethod alongside it so the\nlowercased check in SpellingChecker._check_spelling passes."
    },
    {
      "commit": "0e9a3fc57817da82dd3edd079f5f3c267e8d1b1e",
      "tree": "8c75fb2fd8b35dd76d4e599cc74dd627316470d8",
      "parents": [
        "3d7ac126f7971119a5b19393cdba230b2c76e4ca"
      ],
      "author": {
        "name": "Prerna Utage",
        "email": "prernautage04@gmail.com",
        "time": "Mon May 18 14:40:20 2026 +0530"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 09:10:20 2026 +0000"
      },
      "message": "docs: explain conflict between C0209 and W1203 (#10680)\n\n\nCo-authored-by: Prerna Utage \u003cprerna@example.com\u003e\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "3d7ac126f7971119a5b19393cdba230b2c76e4ca",
      "tree": "5909d256b4140fb2af0bba168bdee11331b51589",
      "parents": [
        "628f3a759b5f68d55ea9416dc3cf9aad4bad0905"
      ],
      "author": {
        "name": "Hamza Mobeen",
        "email": "s.hamzamobeen@gmail.com",
        "time": "Mon May 18 09:36:38 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 10:36:38 2026 +0200"
      },
      "message": "Fix false negative dangerous-default-value for typing.NamedTuple (#3716) (#10989)\n\n\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "628f3a759b5f68d55ea9416dc3cf9aad4bad0905",
      "tree": "fd30b2f026f55a6cb307bdf7676b82c091cc9190",
      "parents": [
        "371933bfbfb3da19264f8f1add87c0c7e35dc771"
      ],
      "author": {
        "name": "Shehab Sherif",
        "email": "shehabsheriftawfik@gmail.com",
        "time": "Mon May 18 00:57:23 2026 +0300"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 17 21:57:23 2026 +0000"
      },
      "message": "Add `assertDoesNotAddMessages` to `CheckerTestCase` (#10930)\n\n\nAdd a new context manager method to CheckerTestCase that asserts\nspecific messages are NOT emitted, while allowing other messages\nto be present. This complements assertNoMessages which asserts\nthat no messages at all are emitted.\n\nAlso adds a _messages_match static helper for comparing two\nMessageTest instances field-by-field.\n\nIncludes tests covering all six scenarios outlined in the issue\nplus additional edge cases for ignore_position and multiple\nunwanted messages.\n\nCloses #9598\n\nCo-authored-by: Shehab Sherif \u003cshehabsherif0@users.noreply.github.com\u003e\nCo-authored-by: Pierre Sassoulas \u003cpierre.sassoulas@gmail.com\u003e"
    },
    {
      "commit": "371933bfbfb3da19264f8f1add87c0c7e35dc771",
      "tree": "4626b8a653834fc0f0461ec836ea855cbf707489",
      "parents": [
        "f71e04681448997528ab9e42f8bc4db7d3044195"
      ],
      "author": {
        "name": "Douglas Needham",
        "email": "cinnion@gmail.com",
        "time": "Fri May 15 15:43:45 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 15 19:43:45 2026 +0000"
      },
      "message": "Fix pylint skipping similarly named project directory (#10970)\n\nBecause _discover_files() will falsely ignore a with a name like \n`applications_api` after walking across one named `applications`, add\nthe os directory separator to the end of what is a known directory\n(because of the fact that it has a file named `__init__.py` in it).\n\nCloses #10969"
    },
    {
      "commit": "f71e04681448997528ab9e42f8bc4db7d3044195",
      "tree": "42196bb2f275ee97370fd287db0efbc08e4aafb7",
      "parents": [
        "1f6c49f545f7de7f5c37bfd0968094116adc9d46"
      ],
      "author": {
        "name": "pre-commit-ci[bot]",
        "email": "66853113+pre-commit-ci[bot]@users.noreply.github.com",
        "time": "Mon May 11 21:38:33 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 11 21:38:33 2026 +0000"
      },
      "message": "[pre-commit.ci] pre-commit autoupdate (#11010)\n\nupdates:\n- [github.com/pre-commit/mirrors-mypy: v1.20.2 → v2.0.0](https://github.com/pre-commit/mirrors-mypy/compare/v1.20.2...v2.0.0)\n- [github.com/tox-dev/pyproject-fmt: v2.21.1 → v2.21.2](https://github.com/tox-dev/pyproject-fmt/compare/v2.21.1...v2.21.2)\n\nCo-authored-by: pre-commit-ci[bot] \u003c66853113+pre-commit-ci[bot]@users.noreply.github.com\u003e"
    }
  ],
  "next": "1f6c49f545f7de7f5c37bfd0968094116adc9d46"
}
