)]}'
{
  "log": [
    {
      "commit": "d1a23cd58e5918658a713907f6d66d260d55ee39",
      "tree": "41ada934d208aeca6e29c8946e58d8fe50f34143",
      "parents": [
        "c3d875dcd795e98f4f77a518e79f9ee18adbe469"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 08 16:08:35 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 16:08:35 2026 -0400"
      },
      "message": "[ty] Add a materialization visitor (#24413)\n\n## Summary\n\nThis PR converts `ApplyTypeMappingVisitor` such that we now use separate\ncaches for...\n\n- Ordinary mapping\n- Top materialization\n- Bottom materialization\n- Materialization-equivalence recursion\n\nOn main, we reuse the same detector, which leads to unbounded recursion.\n\nCloses https://github.com/astral-sh/ty/issues/3155.\n\nCloses https://github.com/astral-sh/ty/issues/3136."
    },
    {
      "commit": "c3d875dcd795e98f4f77a518e79f9ee18adbe469",
      "tree": "ffdd4353053b16b1745649a769d388f35b471a69",
      "parents": [
        "486cdd68dba5a001d057be41c458a2ca405f4819"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 08 14:49:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 18:49:00 2026 +0000"
      },
      "message": "[ty] Normalize explicit `None` accessors in manual property construction (#24492)\n\n## Summary\n\nSetting `fset` to `None` in `property` should be considered equivalent\nto omitting it. This is fairly petty, but I think it\u0027s correct."
    },
    {
      "commit": "486cdd68dba5a001d057be41c458a2ca405f4819",
      "tree": "a22f01037de7cc8149657fcd71cf0b31b1b1a035",
      "parents": [
        "527b75a5f7c93578cf3baaa95bb484c27b6555e2"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 08 12:32:41 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 16:32:41 2026 +0000"
      },
      "message": "[ty] Treat type alias values as type-form contexts in semantic tokens (#24478)\n\n## Summary\n\nGiven:\n\n```python\nfrom typing import IO, TypeAlias\n\ndef takes_file(x: IO[str]) -\u003e None: ...\n\ntype NewStyle \u003d IO[str]\nLegacyStyle: TypeAlias \u003d IO[str]\n```\n\nPreviously, only `x: IO[str]` was visited as a type form, so the other\ntwo `IO` tokens could\u0027ve been colored like values. We now treat alias\nright-hand sides as type forms to ensure they\u0027re colored as types."
    },
    {
      "commit": "527b75a5f7c93578cf3baaa95bb484c27b6555e2",
      "tree": "c9b3a82fcefc177d740375f8ee64107fe22117e5",
      "parents": [
        "0f5f93b8bf02b8e22d93bafe2897d46647623b6c"
      ],
      "author": {
        "name": "Micha Reiser",
        "email": "micha@reiser.io",
        "time": "Wed Apr 08 17:27:58 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 18:27:58 2026 +0200"
      },
      "message": "Add E2E testing framework to ruff-server (#24490)"
    },
    {
      "commit": "0f5f93b8bf02b8e22d93bafe2897d46647623b6c",
      "tree": "768e928b48db19b772628e15e5d35ed517531b48",
      "parents": [
        "89d32a888c6e2d31d5eaea232b7224050c9ef7e7"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 08 12:24:38 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 16:24:38 2026 +0000"
      },
      "message": "[ty] Determine value vs. type syntax highlighting based on call arguments (#23949)\n\n## Summary\n\nWe now expose a method to determine whether a call argument should be\ntreated as a type form (or not), for the purposes of syntax\nhighlighting.\n\nThis is more difficult than it may sound, largely due to the existence\nof overloads and conditional bindings. For example, given the following:\n\n```python\nfrom typing import cast\nfrom typing_extensions import assert_type\n\nfunc \u003d cast if flag else assert_type\n```\n\nThe highlighting we want to use for various arguments has to taken into\naccount both the signatures of `cast` and `assert_type`, along with the\ntype of the value provided to the argument.\n\nFor example, given:\n\n```python\nf(val\u003dx, typ\u003dint)\n```\n\nBoth agree that `val\u003dx` is a value, and `typ\u003dint` is a type form.\n\nBut given:\n\n```python\nf(x, int)\n```\n\nBoth match, but disagree:\n\n- `cast(x, int)` treats the arguments as `[Type, Value]`\n- `assert_type(x, int)` treats them as `[Value, Type]`\n\nSo we treat them both as unknown.\n\nCloses https://github.com/astral-sh/ty/issues/3038."
    },
    {
      "commit": "89d32a888c6e2d31d5eaea232b7224050c9ef7e7",
      "tree": "25cb7d7af1fa62775a0412b3969e762c074dbaf8",
      "parents": [
        "0c5c701e6880f00c1799bf1a4686d95e8b4df601"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Wed Apr 08 17:57:04 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 17:57:04 2026 +0200"
      },
      "message": "Update NPM Development dependencies (#23325)\n\nCo-authored-by: renovate[bot] \u003c29139614+renovate[bot]@users.noreply.github.com\u003e\nCo-authored-by: Micha Reiser \u003cmicha@reiser.io\u003e"
    },
    {
      "commit": "0c5c701e6880f00c1799bf1a4686d95e8b4df601",
      "tree": "2cf94fcbe9f76a2a61efb23858fa3ab38cbbed8d",
      "parents": [
        "8106a4b299fa63e9f7b91b14eccbd70e7a064a9f"
      ],
      "author": {
        "name": "Shaygan Hooshyari",
        "email": "sh.hooshyari@gmail.com",
        "time": "Wed Apr 08 17:52:55 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 15:52:55 2026 +0000"
      },
      "message": "[ty] Ensure \u0027/\u0027 parameter appears before \u0027*\u0027 when rendering `Callable` types (#24497)"
    },
    {
      "commit": "8106a4b299fa63e9f7b91b14eccbd70e7a064a9f",
      "tree": "81c0d986c11fdc3bf8d03075af3426991cf3a2b4",
      "parents": [
        "ad30af4cd00b549037456ebafc803a60e4c53b37"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 08 11:45:13 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 11:45:13 2026 -0400"
      },
      "message": "[ty] Fix signature help for ParamSpec-specialized class calls (#24399)\n\n## Summary\n\nGiven `A[int,]()`, signature help was failing to combine the display\nitems with the semantics of the signature. This PR refactors such that\nwe emit structured display data for the IDE crate to consume. So\n`ty_ide` can just consume a pre-built `Vec\u003cCallSignatureParameter\u003e`\ndirectly.\n\nCloses https://github.com/astral-sh/ty/issues/3214."
    },
    {
      "commit": "ad30af4cd00b549037456ebafc803a60e4c53b37",
      "tree": "20e418c763e25f1d5c5100f5c4eb8d638cc2b1ff",
      "parents": [
        "672a5533674f4274f04e3e3cefb2224cf0f4684f"
      ],
      "author": {
        "name": "Micha Reiser",
        "email": "micha@reiser.io",
        "time": "Wed Apr 08 16:33:19 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 17:33:19 2026 +0200"
      },
      "message": "Force update insta snapshots (#24495)"
    },
    {
      "commit": "672a5533674f4274f04e3e3cefb2224cf0f4684f",
      "tree": "a33c27be55674b28b612ceb144d9ee3556e55158",
      "parents": [
        "f3f1b11dc7180e7cff33c2ba4c742911b3f0b228"
      ],
      "author": {
        "name": "Micha Reiser",
        "email": "micha@reiser.io",
        "time": "Wed Apr 08 16:33:08 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 17:33:08 2026 +0200"
      },
      "message": "Silence insta doctest warning (#24496)"
    },
    {
      "commit": "f3f1b11dc7180e7cff33c2ba4c742911b3f0b228",
      "tree": "232876a62d49271c29174b9450e864a70750326d",
      "parents": [
        "b082af34ca20e92195396a7585f4d69ed12cde36"
      ],
      "author": {
        "name": "Zanie Blue",
        "email": "contact@zanie.dev",
        "time": "Wed Apr 08 10:21:03 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 15:21:03 2026 +0000"
      },
      "message": "Create a \"deployment\" for the release-gate job (#24493)\n\nMirror of https://github.com/astral-sh/uv/pull/18920"
    },
    {
      "commit": "b082af34ca20e92195396a7585f4d69ed12cde36",
      "tree": "4d3506cc8a472b3dfc299e5db5277e5a484445ab",
      "parents": [
        "4481b6d6cc1a8670d6cffaae3748777b5e395fa3"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 08 11:07:20 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 15:07:20 2026 +0000"
      },
      "message": "[ty] Move some TypedDict methods into `typed_dict.rs` (#24494)\n\n## Summary\n\nNo functional changes."
    },
    {
      "commit": "4481b6d6cc1a8670d6cffaae3748777b5e395fa3",
      "tree": "92d25c75f88ce1db78c0a2522536d08fbabeddfb",
      "parents": [
        "ca5ac50475edbf6da8e695617528642eba9de8c9"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 08 08:38:23 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 12:38:23 2026 +0000"
      },
      "message": "[ty] Add RustDoc for some TypedDict methods (#24489)\n\n## Summary\n\n(Meant to include in https://github.com/astral-sh/ruff/pull/24480.)\n\n---------\n\nCo-authored-by: Alex Waygood \u003cAlex.Waygood@Gmail.com\u003e"
    },
    {
      "commit": "ca5ac50475edbf6da8e695617528642eba9de8c9",
      "tree": "7604cf6ab536f0ada8faeda173b8057c0e1d299b",
      "parents": [
        "6e236f764f11e7d3d6ed9b1ba0ef92500135ab99"
      ],
      "author": {
        "name": "Yilun \"Allen\" Chen",
        "email": "32376517+YilunAllenChen@users.noreply.github.com",
        "time": "Wed Apr 08 07:01:55 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 12:01:55 2026 +0000"
      },
      "message": "[ty] Symbols from `typing` and `collections` rank higher than third party re-exports (#23643)\n\n## Summary\n- adds `abc` `collections` to StdLibSpecial and rank StdLibSpecial\nhigher than third parties\n- Fixes https://github.com/astral-sh/ty/issues/2927\n\n## Test Plan\n\n1. Same symbol from stdlib vs third-party re-export:\n- Expect stdlib preferred module first (typing/abc/collections source\nabove third-party).\n2. Non-import completion ordering:\n    - Ensure unchanged relative order for locals/members/keywords.\n3. Stability test:\n- For candidates not in preferred list, ordering follows existing\nbehavior.\n4. Regression test:\n- Ensure completion item payload (insert text, additional edits/import\nedits) remains unchanged aside from order.\n\n---------\n\nCo-authored-by: Dhruv Manilawala \u003cdhruvmanila@gmail.com\u003e"
    },
    {
      "commit": "6e236f764f11e7d3d6ed9b1ba0ef92500135ab99",
      "tree": "65d302d44e75da0e0e00a78bf00385cca3c8ebcf",
      "parents": [
        "6ad36f8be239475137b5cccf5e8463adb4639418"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 08 08:01:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 08:01:31 2026 -0400"
      },
      "message": "[ty] Avoid speculative inference for TypedDict constructors (#24480)\n\n## Summary\n\nSee:\nhttps://github.com/astral-sh/ruff/pull/24422#discussion_r3048629847."
    },
    {
      "commit": "6ad36f8be239475137b5cccf5e8463adb4639418",
      "tree": "a6366457fc030dc04969d02cb5de33609dafe3bb",
      "parents": [
        "9311680c97e2ab9db027303671d2da9fa4b0de0b"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 08 07:35:35 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 11:35:35 2026 +0000"
      },
      "message": "[ty] Disallow bare ParamSpecs in Concatenate prefixes (#24474)\n\n## Summary\n\nBare `ParamSpec` is only allowed in a few specific positions. For\nexample, they\u0027re allowed in the tail of `Concatenate`, like\n`Concatenate[int, P]`, and in the first position in `Callable`, like\n`Callable[P, R]`. Previously, we weren\u0027t \"turning off\" the \"allow bare\nParamSpec\" flag in some of those positions, so if you were the first\nargument in `Callable`, bare `ParamSpec` was allowed even if it was\nsubsequently nested in an invalid position.\n\nCloses https://github.com/astral-sh/ty/issues/3194."
    },
    {
      "commit": "9311680c97e2ab9db027303671d2da9fa4b0de0b",
      "tree": "4a658176c37a5dcccb260fdd88e171e21dcd76b4",
      "parents": [
        "ac7656d728d016677e002f29fe2c436ce7ee7942"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 08 07:18:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 07:18:52 2026 -0400"
      },
      "message": "Add `charliermarsh` to PR review round robin (#24488)"
    },
    {
      "commit": "ac7656d728d016677e002f29fe2c436ce7ee7942",
      "tree": "e327ad73fb226b3697eddc0da46b88300b414662",
      "parents": [
        "b6c69c288fe9e5b63d70d1743aabdfa40523e344"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 08 07:01:20 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 07:01:20 2026 -0400"
      },
      "message": "[ty] Use field type context for TypedDict constructor values (#24422)\n\n## Summary\n\nThis PR adds logic to re-infer `TypedDict` constructor values with the\ndestination field\u0027s declared type context, which prevents us from\nrejecting the constructor in:\n\n```python\nfrom __future__ import annotations\n\nfrom typing import Any, NotRequired, TypeAlias, TypedDict\n\n\nclass Comparison(TypedDict):\n    field: str\n    op: NotRequired[str]\n    value: Any\n\nclass Logical(TypedDict):\n    op: NotRequired[str]\n    conditions: list[Filter]\n\nFilter: TypeAlias \u003d Comparison | Logical\n\nlogical \u003d Logical(conditions\u003d[Comparison(field\u003d\u0027a\u0027, value\u003d\u0027b\u0027)])\n```\n\nhttps://github.com/astral-sh/ruff/pull/23936 solves this with a broader\nrewrite of TypedDict construction. The change here is intentionally more\nnarrow.\n\nCloses https://github.com/astral-sh/ty/issues/3027."
    },
    {
      "commit": "b6c69c288fe9e5b63d70d1743aabdfa40523e344",
      "tree": "54de0e91501e94ad1c5f009a918eed5a73580b82",
      "parents": [
        "5fd492a95721a158c54d60349b54e5fe4b7cd874"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Wed Apr 08 11:53:36 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 11:53:36 2026 +0100"
      },
      "message": "[ty] Remove per-scope tracking of reachability (#24457)\n\n## Summary\n\nSame as https://github.com/astral-sh/ruff/pull/24472, but for the\n`reachability` field on `Scope`. We no longer need to track reachability\nof scopes; we can use the more generalised `is_range_reachable` method\non `SemanticIndex` and iterate up through all parent scopes.\n\n\n[Performance](https://codspeed.io/astral-sh/ruff/branches/alex/scope-memory?utm_source\u003dgithub\u0026utm_medium\u003dcheck\u0026utm_content\u003dbutton\u0026page\u003d2)\nis in the noise here -- maybe a 1% slowdown on a few benchmarks, but a\n1% speedup on one microbenchmark.\n\n## Test Plan\n\nExisting tests all pass"
    },
    {
      "commit": "5fd492a95721a158c54d60349b54e5fe4b7cd874",
      "tree": "dd41c213d574199fc5c87d78fbf2937d3bd28d9a",
      "parents": [
        "539b23e5b52e7d856e8756a9fd266d928d2a2fea"
      ],
      "author": {
        "name": "David Peter",
        "email": "sharkdp@users.noreply.github.com",
        "time": "Wed Apr 08 11:45:45 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 11:45:45 2026 +0200"
      },
      "message": "[ty] Add missing snapshot in e2e tests (#24487)\n\n## Summary\n\nAdd a missing snapshot test [now that the `insta` filters have been\nadapted](https://github.com/astral-sh/ruff/pull/24485) (not sure if this\nwas the relevant change, or maybe something before it).\n\nIt looks like this is the expected message here:\nhttps://github.com/astral-sh/ruff/pull/22040/changes/d6e1d56bf5438e4e2c4249a75ce54f91ab51b8e2#r2628873851"
    },
    {
      "commit": "539b23e5b52e7d856e8756a9fd266d928d2a2fea",
      "tree": "ebab48fd7a964309453aea2e423518a1ac7cd74a",
      "parents": [
        "162852609ad01f171ba868900d18e57236573785"
      ],
      "author": {
        "name": "Micha Reiser",
        "email": "micha@reiser.io",
        "time": "Wed Apr 08 10:36:06 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 11:36:06 2026 +0200"
      },
      "message": "[ty] Remve unnecessary `pub` and `pub(crate)` in `display.rs` (#24486)"
    },
    {
      "commit": "162852609ad01f171ba868900d18e57236573785",
      "tree": "ac3ca3f068d8b91b09952f4f0f3990c8c88fd66e",
      "parents": [
        "416ab8344b88f3490e7c6ed7d3fa48f39fccbf77"
      ],
      "author": {
        "name": "David Peter",
        "email": "sharkdp@users.noreply.github.com",
        "time": "Wed Apr 08 11:15:30 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 11:15:30 2026 +0200"
      },
      "message": "[ty] Show info hints in LSP diagnostic messages (#24328)\n\n## Summary\n\nWith this change, we now show `.info(…)` diagnostics in the IDE. These\nhints often contain useful information.\n\nThere are a few things that are not ideal about this:\n* I don\u0027t like that we repeat `info: ` several times, but that is a\npre-existing problem in the CLI as well. We could consider adding\nsupport for multiline info messages (I experimented with this in\nhttps://github.com/astral-sh/ruff/pull/24327)\n* Messages seem to be plain-text only, so URLs are not clickable\n* This is more verbose. We could consider adding a configuration setting\nto disable this.\n* Sub-diagnostics *with* annotations were already rendered before (as\n\"related information\"). With this change, we now also show those\n*without* an annotation. This can lead to an \"out of order\"\npresentation, but I\u0027m not sure if that is necessarily problematic.\n\n## Test Plan\n\n* Played with this interactively in VS Code, Zed, nvim\n* Updated snapshot tests show that we now add info hints"
    },
    {
      "commit": "416ab8344b88f3490e7c6ed7d3fa48f39fccbf77",
      "tree": "b9411f7fd9a6e5708c339fb81ede3a1ce8f3bd91",
      "parents": [
        "d3c8ddb1dbecc47996f353bb62cf41fb9aa4c52c"
      ],
      "author": {
        "name": "David Peter",
        "email": "sharkdp@users.noreply.github.com",
        "time": "Wed Apr 08 11:03:40 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 11:03:40 2026 +0200"
      },
      "message": "[ty] Remove insta filter in e2e tests (#24485)"
    },
    {
      "commit": "d3c8ddb1dbecc47996f353bb62cf41fb9aa4c52c",
      "tree": "4d0290fce63d874a8482318642566daf3d9aad3f",
      "parents": [
        "4859b00bca95c004d8adb2efe93af4bdf552e110"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Wed Apr 08 07:13:01 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 07:13:01 2026 +0100"
      },
      "message": "[ty] Remove tracking of whether a whole scope is in a `TYPE_CHECKING` block (#24472)\n\n## Summary\n\nIt isn\u0027t necessary to store this state on `Scope` anymore: we can just\niterate up through the scope\u0027s parent scopes to see if the given range\nis contained within any of the ranges those scopes recorded as being\ninside `if TYPE_CHECKING` blocks.\n\nI had intended to also remove the `reachability` field from `Scope`: I\nthink that\u0027s also possible, but it\u0027s a bit more dubious whether that\u0027s a\n_good_ change or not, so I\u0027m splitting this out into an independent\ncleanup.\n\n## Test Plan\n\nExisting tests"
    },
    {
      "commit": "4859b00bca95c004d8adb2efe93af4bdf552e110",
      "tree": "c3fb608d17e74cacbd036c9661ef823e642b52e5",
      "parents": [
        "55f667ba3924e8f44b1f4acdabfb0b5c0cfffe12"
      ],
      "author": {
        "name": "Ibraheem Ahmed",
        "email": "ibraheem@ibraheem.ca",
        "time": "Wed Apr 08 00:27:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 00:27:52 2026 -0400"
      },
      "message": "[ty] Remove unused `all_definitely_bound` attribute (#24482)\n\nThis has been dead code since\nhttps://github.com/astral-sh/ruff/pull/22971 landed."
    },
    {
      "commit": "55f667ba3924e8f44b1f4acdabfb0b5c0cfffe12",
      "tree": "7bf8bf1ce9250160561bf8774f4e362e0f53ae4e",
      "parents": [
        "22a68c56e31d0e721ad4c58ee1847b800ac75341"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Tue Apr 07 14:10:43 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 14:10:43 2026 -0400"
      },
      "message": "Convert Clippy allows to expects (#24473)"
    },
    {
      "commit": "22a68c56e31d0e721ad4c58ee1847b800ac75341",
      "tree": "242e3cded0f25db54fe6ac8ff124e77a51c5db51",
      "parents": [
        "45409a743e0f74c00d74b55cad4c99d5a291b8a8"
      ],
      "author": {
        "name": "David Peter",
        "email": "sharkdp@users.noreply.github.com",
        "time": "Tue Apr 07 19:33:33 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 19:33:33 2026 +0200"
      },
      "message": "[ty] Hide \"rule xyz is enabled …\" hints by default (#24469)\n\n## Summary\n\nHide \"rule xyz is enabled …\" hints by default, unless in `--verbose` mode\n\n## Test Plan\n\n- Updated snapshot tests\n- Tested in the CLI"
    },
    {
      "commit": "45409a743e0f74c00d74b55cad4c99d5a291b8a8",
      "tree": "832941f383370e29723178938b47a267a4524b11",
      "parents": [
        "02e5d6d90e269ca2c49b231f23b7d3c4fd579d92"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Tue Apr 07 15:52:33 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 15:52:33 2026 +0100"
      },
      "message": "[ty] Ensure nested conditional blocks inherit `TYPE_CHECKING` state from outer blocks (#24470)"
    },
    {
      "commit": "02e5d6d90e269ca2c49b231f23b7d3c4fd579d92",
      "tree": "fd3c6bff99d48229d71c0a376c2c4b3ab5b4f625",
      "parents": [
        "f4c3807e9974d00eba3827b4494dde5bc2cf5707"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Tue Apr 07 09:44:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 13:44:31 2026 +0000"
      },
      "message": "[ty] Respect non-required keys in TypedDict unpacking (#24446)\n\n## Summary\n\nCloses https://github.com/astral-sh/ty/issues/3226."
    },
    {
      "commit": "f4c3807e9974d00eba3827b4494dde5bc2cf5707",
      "tree": "e1927cec89bf18454740dc87a4156eca5ed0970f",
      "parents": [
        "3ffa53af207d2fb3f9f70b48e18de2fdc40ca08c"
      ],
      "author": {
        "name": "Zanie Blue",
        "email": "contact@zanie.dev",
        "time": "Tue Apr 07 07:20:14 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 07:20:14 2026 -0500"
      },
      "message": "Add a required checks meta-job to CI (#24374)\n\nCopied from the pattern added to uv in\nhttps://github.com/astral-sh/uv/pull/17388\n\nThis will allow the required checks for pull requests to be mutated\n\n1. Without breaking all open pull requests every time we need to change\nthem\n2. Without admin permissions to the repository\n\nAfter this has been merged for a period of time, we\u0027ll update the\nrequired checks in the repository to just be this one job"
    },
    {
      "commit": "3ffa53af207d2fb3f9f70b48e18de2fdc40ca08c",
      "tree": "fdeaaafe06fea55ab087cba5eed5fd1d304bc118",
      "parents": [
        "03675af1de1250b23a570cae39bcf10e97c92f2a"
      ],
      "author": {
        "name": "Micha Reiser",
        "email": "micha@reiser.io",
        "time": "Tue Apr 07 12:58:54 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 13:58:54 2026 +0200"
      },
      "message": "Use `dyn` dispatch internally only for `any_over` methods (#24468)"
    },
    {
      "commit": "03675af1de1250b23a570cae39bcf10e97c92f2a",
      "tree": "ec9fd58e29bdca6e546071c13903566fb4de5523",
      "parents": [
        "2ab6210d1744464ba66ecbd3f3c8ebe832aa0b08"
      ],
      "author": {
        "name": "Micha Reiser",
        "email": "micha@reiser.io",
        "time": "Tue Apr 07 12:30:49 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 13:30:49 2026 +0200"
      },
      "message": "[ty] Return all attribute definitions for goto definition (#24332)"
    },
    {
      "commit": "2ab6210d1744464ba66ecbd3f3c8ebe832aa0b08",
      "tree": "d906f1cdd50c11760cbff1a2e073ebf3dd81d1ae",
      "parents": [
        "2deaa47e5f3006e81d13567ba8f74ae930bfa080"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Tue Apr 07 09:49:15 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 09:49:15 2026 +0200"
      },
      "message": "Update dependency vite to v7.3.2 (#24461)\n\nCo-authored-by: renovate[bot] \u003c29139614+renovate[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "2deaa47e5f3006e81d13567ba8f74ae930bfa080",
      "tree": "6139fc6c002ba3b1638dedfd7d2ab3dbbbf32429",
      "parents": [
        "398e2a79c488cf2ae59512ea31e00626d7dd8833"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Mon Apr 06 22:38:43 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 22:38:43 2026 +0100"
      },
      "message": "[ty] Optimize `place_from_declarations` (#24444)"
    },
    {
      "commit": "398e2a79c488cf2ae59512ea31e00626d7dd8833",
      "tree": "f71a6dd81c39623271942051a0d257d779ff41fb",
      "parents": [
        "770cca65a1dc44241b503df7b1064a784f970499"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Mon Apr 06 16:17:03 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 20:17:03 2026 +0000"
      },
      "message": "[ty] Lazily evaluate declaration reachability in field and enum filters (#24451)\n\n## Summary\n\nSmall optimization: only determinate reachability for \"bad\"\ndeclarations, so that we do the cheap check (is it \"bad\"?) before the\nexpensive check (\"is it reachable?\").\n\nCodSpeed shows a 2% improvement on Pydantic and 1% on some other\nprojects like Pandas and SymPy."
    },
    {
      "commit": "770cca65a1dc44241b503df7b1064a784f970499",
      "tree": "ddb36e1eb33c954ea9df44d128e9cb7404ada120",
      "parents": [
        "ad8672a4db150bc6e20c348d103aef08c9db4808"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Mon Apr 06 21:05:04 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 20:05:04 2026 +0000"
      },
      "message": "[ty] Use basic blocks for determining if a node is in an `if TYPE_CHECKING` block (#24394)"
    },
    {
      "commit": "ad8672a4db150bc6e20c348d103aef08c9db4808",
      "tree": "a1c933dfb110d83f1b7150fa09f81678f1bc36a6",
      "parents": [
        "bb9c219c0de98e25ed7f0555ecf4fcbff841ade4"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Mon Apr 06 10:04:05 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 10:04:05 2026 +0100"
      },
      "message": "Update Rust crate toml to v1.1.0 (#24437)\n\nCo-authored-by: renovate[bot] \u003c29139614+renovate[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "bb9c219c0de98e25ed7f0555ecf4fcbff841ade4",
      "tree": "17ff1ff6bc30dc35ae34d469a2cd7b0511934515",
      "parents": [
        "fae6ae601951d5e6b0255f5d841d51dc8a6e6d1a"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Mon Apr 06 02:13:50 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 02:13:50 2026 +0000"
      },
      "message": "Update Rust crate tempfile to v3.27.0 (#24436)"
    },
    {
      "commit": "fae6ae601951d5e6b0255f5d841d51dc8a6e6d1a",
      "tree": "e25977c95d8b17c48ecf6fb9bca27b8e6bcb3e0e",
      "parents": [
        "290465ee63ffb2e2f9352a9f9ee4e3f66ca0d61a"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Sun Apr 05 22:07:21 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 22:07:21 2026 -0400"
      },
      "message": "Update Rust crate uuid to v1.23.0 (#24438)"
    },
    {
      "commit": "290465ee63ffb2e2f9352a9f9ee4e3f66ca0d61a",
      "tree": "0d4dab08c6227562959e04030fe107ca43659f25",
      "parents": [
        "940af9e6f80ce6ddc13cb182f77a8243e5ce8f6f"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Sun Apr 05 22:06:41 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 22:06:41 2026 -0400"
      },
      "message": "Update Rust crate rustc-hash to v2.1.2 (#24434)"
    },
    {
      "commit": "940af9e6f80ce6ddc13cb182f77a8243e5ce8f6f",
      "tree": "a606dc487adc13a1d426aa008ce78ed2eb27342e",
      "parents": [
        "6ce1905aedd791eb5602d507b79cf5af03ac810a"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Sun Apr 05 22:06:10 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 22:06:10 2026 -0400"
      },
      "message": "Update Rust crate insta to v1.47.1 (#24435)"
    },
    {
      "commit": "6ce1905aedd791eb5602d507b79cf5af03ac810a",
      "tree": "66aeb89230b8442388f668aa6395ebd2c42ff36b",
      "parents": [
        "2703ec64fda7724c58151b69517bc8d3d20ac5f7"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Sun Apr 05 22:05:31 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 22:05:31 2026 -0400"
      },
      "message": "Update dependency ruff to v0.15.9 (#24431)"
    },
    {
      "commit": "2703ec64fda7724c58151b69517bc8d3d20ac5f7",
      "tree": "8fb9dd3065984a1815f6fba86ee50d23beefa7b1",
      "parents": [
        "ba38778aa5d80a832f470aa1e67b9e25ab21aef3"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Sun Apr 05 22:05:23 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 22:05:23 2026 -0400"
      },
      "message": "Update dependency mkdocs-redirects to v1.2.3 (#24430)"
    },
    {
      "commit": "ba38778aa5d80a832f470aa1e67b9e25ab21aef3",
      "tree": "d6b79c95c0faf6ec6af06a100fa3a8b1c882c719",
      "parents": [
        "213a003bcb0b9a707a705ad599ec488533ce0bce"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Sun Apr 05 22:05:01 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 22:05:01 2026 -0400"
      },
      "message": "Update dependency tomli to v2.4.1 (#24432)"
    },
    {
      "commit": "213a003bcb0b9a707a705ad599ec488533ce0bce",
      "tree": "add57c44b36dba1dd87e39742006902b2b720d8a",
      "parents": [
        "7b7556da548e61456bf7a4dac1ff9d4a143172c7"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Sun Apr 05 22:04:48 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 22:04:48 2026 -0400"
      },
      "message": "Update prek dependencies (#24433)"
    },
    {
      "commit": "7b7556da548e61456bf7a4dac1ff9d4a143172c7",
      "tree": "61f58b57086ade754a6535bd577c78f1564b122f",
      "parents": [
        "4f7266d53457919b534b511d3f346168a1f88441"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Mon Apr 06 01:57:17 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 01:57:17 2026 +0000"
      },
      "message": "Update taiki-e/install-action action to v2.70.2 (#24439)"
    },
    {
      "commit": "4f7266d53457919b534b511d3f346168a1f88441",
      "tree": "992f4da0328c353ee592cddc1db7b4f6ab5252d7",
      "parents": [
        "55b9532e1b38435a6fd0f8fe699772ecad2f338f"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Mon Apr 06 01:50:07 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 01:50:07 2026 +0000"
      },
      "message": "Update dependency astral-sh/uv to v0.11.3 (#24429)"
    },
    {
      "commit": "55b9532e1b38435a6fd0f8fe699772ecad2f338f",
      "tree": "c7b1e6fed0be6c04336e08e73a24de0811a6636e",
      "parents": [
        "1fe1c5f32c8b49eaed0e46439871d98da5081ab9"
      ],
      "author": {
        "name": "renovate[bot]",
        "email": "29139614+renovate[bot]@users.noreply.github.com",
        "time": "Mon Apr 06 01:49:53 2026 +0000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 06 01:49:53 2026 +0000"
      },
      "message": "Update cargo-bins/cargo-binstall action to v1.17.9 (#24428)"
    },
    {
      "commit": "1fe1c5f32c8b49eaed0e46439871d98da5081ab9",
      "tree": "fa8c6e8d799cecbf312c085a2f69eaa37ca0d7d1",
      "parents": [
        "9a55bc6568caeba0c78c6f3358cd2f9475006f72"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Sun Apr 05 11:14:39 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 15:14:39 2026 +0000"
      },
      "message": "Avoid emitting multi-line f-string elements before Python 3.12 (#24377)\n\n## Summary\n\nSee:\nhttps://github.com/astral-sh/ruff/pull/24355#discussion_r3026446640.\nPrior to Python 3.12, we need to avoid emitting formatted expressions\nthat span multiple lines in non-triple quoted f-strings."
    },
    {
      "commit": "9a55bc6568caeba0c78c6f3358cd2f9475006f72",
      "tree": "c7afba4ee59357251dacecae555aee5c9e6a3d42",
      "parents": [
        "208780434ef5268928ef7180254fc95d2f45762a"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Sun Apr 05 11:09:26 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 15:09:26 2026 +0000"
      },
      "message": "Reject multi-line f-string elements before Python 3.12 (#24355)\n\n## Summary\n\nBefore Python 3.12, a replacement field in an f-string can span multiple\nlines only if the outer f-string is triple-quoted. This was relaxed in\nPython 3.12, but we weren\u0027t rejecting these as syntactically invalid on\nearlier versions.\n\nCloses https://github.com/astral-sh/ruff/issues/24348."
    },
    {
      "commit": "208780434ef5268928ef7180254fc95d2f45762a",
      "tree": "0aad3cfa7a055cfc7b113d773830354838c8f25a",
      "parents": [
        "5d879b6d897904c45a8c2616e5fb4a4377e647ce"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Sat Apr 04 21:49:52 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 01:49:52 2026 +0000"
      },
      "message": "[`flake8-self`] Make `SLF` diagnostics robust to non-self-named variables (#24281)\n\n## Summary\n\nWe allow private attribute access _within_ the implementing class (e.g.,\n`self._foo`), but historically, this was implemented by matching on\n`self`, `cls`, and `mcs`. So, e.g., if you used a self variable name\nother than `self`, we\u0027d still flag accesses.\n\nWith this PR, we now model self correctly by detecting it as the \"first\nargument to a method\", removing those false positives.\n\nFor now, however, we _also_ keep the blanket exemption for `self`,\n`cls`, and `mcs` in stable, since that\u0027s removing what are arguably\nfalse negatives and thus introducing new diagnostics.\n\nCloses https://github.com/astral-sh/ruff/issues/24275."
    },
    {
      "commit": "5d879b6d897904c45a8c2616e5fb4a4377e647ce",
      "tree": "fb1dded40fec352596ef14a1cf67d0363a378434",
      "parents": [
        "0abbde57426286e10ebd2ade06e8596db2e94775"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Sat Apr 04 21:39:14 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 04 21:39:14 2026 -0400"
      },
      "message": "[ty] Move some dynamic class code out of `builder.rs` (#24411)\n\n## Summary\n\nAddresses:\nhttps://github.com/astral-sh/ruff/pull/23144#discussion_r3035168120."
    },
    {
      "commit": "0abbde57426286e10ebd2ade06e8596db2e94775",
      "tree": "233546bf8c539a324fb24f5adb2c55804367fce6",
      "parents": [
        "62bb07772806a0ca578766531f1ffcba1f2c9c90"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Sat Apr 04 21:25:47 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 04 21:25:47 2026 -0400"
      },
      "message": "Avoid syntax error from E502 fixes in f-strings and t-strings (#24410)\n\n## Summary\n\nIt looks like this code was special-casing `TokenKind::String`, but\nmissed the non-`TokenKind::String` string-like tokens (like for\nf-strings).\n\nCloses https://github.com/astral-sh/ruff/issues/24409."
    },
    {
      "commit": "62bb07772806a0ca578766531f1ffcba1f2c9c90",
      "tree": "c466e9b959bb2bc9eff73f76020ab7be6099ef4d",
      "parents": [
        "f6ef72c291d597fc6716fd00a0ee170b2da076c9"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Sat Apr 04 21:14:00 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 04 21:14:00 2026 -0400"
      },
      "message": "[ty] Add support for `types.new_class` (#23144)\n\n## Summary\n\nGenerally straightforward given that we support `type(...)`; however, I\nthink the base class validation can be a bit looser, since\n`types.new_class` does proper metaclass resolution.\n\nCloses https://github.com/astral-sh/ty/issues/2399."
    },
    {
      "commit": "f6ef72c291d597fc6716fd00a0ee170b2da076c9",
      "tree": "9b0e3c858d06e910ea898b1fedd79822cf466d29",
      "parents": [
        "62a863cf518086135dfd2321c92fbc3823f95de8"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Sat Apr 04 20:23:42 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 05 00:23:42 2026 +0000"
      },
      "message": "[ty] Reject unsupported `environment.python-version` values in configuration files (#24402)\n\n## Summary\n\nIf a user specifies an unsupported value in\n`environment.python-version`, we need to reject it, like we do on the\nCLI."
    },
    {
      "commit": "62a863cf518086135dfd2321c92fbc3823f95de8",
      "tree": "4e59c6274a4710ef01c127b1304fefd6d78a951e",
      "parents": [
        "af9ae49e84daf09f74e654ba3e6d87fe94f6d1ca"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Sat Apr 04 20:18:33 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Apr 04 20:18:33 2026 -0400"
      },
      "message": "[ty] Respect supported lower bounds from `requires-python` (#24401)\n\n## Summary\n\nWhen resolving from `requires-python`, we now take the first supported\nversion greater than the `requires-python` minimum. This matches how we\ninterpret `requires-python` in uv (as a lower-bound), but it does have\nsome odd effects... E.g., `\u003d\u003d2.7` is treated as `\u003e\u003d2.7`, and we then\ntake `3.7` as our supported version.\n\nI want to think a bit more about the desired behavior here (in a\nsubsequent PR), but this at least gets rid of the panics.\n\nCloses https://github.com/astral-sh/ty/issues/3204."
    },
    {
      "commit": "af9ae49e84daf09f74e654ba3e6d87fe94f6d1ca",
      "tree": "0b2fde2b5202c886693549da1348cdbfa6d8ea7b",
      "parents": [
        "65b68bd554157753a81b814827496dd046387d33"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Fri Apr 03 22:59:17 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 22:59:17 2026 -0400"
      },
      "message": "[ty] Treat enum attributes with type annotations as members (#23776)\n\n## Summary\n\nSomething like `foo: int \u003d 1` inside an enum should trigger\n`[invalid-enum-member-annotation]`, but should still be considered a\nmember.\n\nSee: https://github.com/astral-sh/ruff/pull/23772."
    },
    {
      "commit": "65b68bd554157753a81b814827496dd046387d33",
      "tree": "71e45e99070e9d0bc2a77110341ea9d969122982",
      "parents": [
        "ee9084695ec4d70bc66083ac2b3cf598cc45101a"
      ],
      "author": {
        "name": "Carl Meyer",
        "email": "carl@astral.sh",
        "time": "Fri Apr 03 16:10:27 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 16:10:27 2026 -0700"
      },
      "message": "[ty] no special-casing for dataclasses.field if it\u0027s not in field_specifiers (#24397)"
    },
    {
      "commit": "ee9084695ec4d70bc66083ac2b3cf598cc45101a",
      "tree": "eb1196e9d65de079c1269346dde50fc752fb6337",
      "parents": [
        "2f839db9e4045e93de0ef6b67a62cb9fc31fe373"
      ],
      "author": {
        "name": "Carl Meyer",
        "email": "carl@astral.sh",
        "time": "Fri Apr 03 09:35:35 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 16:35:35 2026 +0000"
      },
      "message": "[ty] fix PEP 695 type aliases in with statement (#24395)"
    },
    {
      "commit": "2f839db9e4045e93de0ef6b67a62cb9fc31fe373",
      "tree": "b2a6315e0af68c8140e5250407080b9a19db53f8",
      "parents": [
        "b7561eda6a2be5f749d5831a7f26157e0f902ba9"
      ],
      "author": {
        "name": "Carl Meyer",
        "email": "carl@astral.sh",
        "time": "Fri Apr 03 09:10:34 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 09:10:34 2026 -0700"
      },
      "message": "[ty] respect `__new__` and metaclass `__call__` return types (#24357)\n\nCo-authored-by: Charlie Marsh \u003ccharlie.r.marsh@gmail.com\u003e\nCo-authored-by: Denys Zhak \u003cdenyszhak@gmail.com\u003e"
    },
    {
      "commit": "b7561eda6a2be5f749d5831a7f26157e0f902ba9",
      "tree": "3e306cc4334f133911fb1f5b76e3522537cf456e",
      "parents": [
        "2fb7c8ddd806aec98f8bba8f4c78d4a7c22f9d56"
      ],
      "author": {
        "name": "Dylan",
        "email": "dylwil3@gmail.com",
        "time": "Fri Apr 03 09:42:50 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 14:42:50 2026 +0000"
      },
      "message": "Document adding fixes in CONTRIBUTING.md (#24393)\n\nCloses #1625"
    },
    {
      "commit": "2fb7c8ddd806aec98f8bba8f4c78d4a7c22f9d56",
      "tree": "600f9a141c1f015d16315e92b63ba515a77917d2",
      "parents": [
        "23364ae6a52b47c855db63c203893325a9aab1fa"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Fri Apr 03 09:59:41 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 09:59:41 2026 -0400"
      },
      "message": "Sort formatter diagnostics in snapshots (#24375)\n\n## Summary\n\nRight now these tests are dependent on input order, so changes in the\nunderlying hash can lead to churn in the fixtures. See, e.g.:\nhttps://github.com/astral-sh/ruff/pull/24355#discussion_r3026451902."
    },
    {
      "commit": "23364ae6a52b47c855db63c203893325a9aab1fa",
      "tree": "cc8426c508779bf986bc8edd27e766cd640c3538",
      "parents": [
        "5ac54ec2a708b46ec964465ce5d09cb9b80a3dc2"
      ],
      "author": {
        "name": "Dylan",
        "email": "dylwil3@gmail.com",
        "time": "Fri Apr 03 08:34:11 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 13:34:11 2026 +0000"
      },
      "message": "[`pyupgrade`] Fix panic caused by handling of octals in `UP012` (#24390)\n\nThis fixes two errors introduced by #16058 : \n\n- An off-by-one error caused a panic when `UP012` was run on strings\nending in an octal (and could also cause the rule to trigger when it\nshould not, e.g. for `\"\\000\\N{DIGIT ONE}\"`).\n- When checking that an octal `\\abc` was not larger than `\\377`, it was\nparsed using `\"abc\".parse::\u003cu8\u003e()`. But this uses base 10. We need to\nuse `u8::from_str_radix(\"abc\",8)` instead.\n\nCloses #24389"
    },
    {
      "commit": "5ac54ec2a708b46ec964465ce5d09cb9b80a3dc2",
      "tree": "4c78dd93a1d4fc2747ecb19e2b7464bfa45c50da",
      "parents": [
        "7fdb55618994916ca3af84ce2501589848725f35"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Thu Apr 02 22:15:51 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 22:15:51 2026 -0400"
      },
      "message": "Upgrade to nix v0.31.2 (#24385)\n\n## Summary\n\nCloses https://github.com/astral-sh/ruff/issues/24384."
    },
    {
      "commit": "7fdb55618994916ca3af84ce2501589848725f35",
      "tree": "a6e2c1500a515d228408edbb58de612dfd75094d",
      "parents": [
        "1f430e68af6e627569776dfbcd03b98ac7c29eb6"
      ],
      "author": {
        "name": "Dylan",
        "email": "dylwil3@gmail.com",
        "time": "Thu Apr 02 20:14:59 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 20:14:59 2026 -0500"
      },
      "message": "Strip form feeds from indent passed to `dedent_to` (#24381)\n\nWhen adjusting \"simple\" indentation in the formation of edits, we\nattempt to dedent manually rather than deferring to LibCST. To do so we\nmust provide a desired indentation, in the form of a string. We often\ngrab this from source code by slicing the text in a range beginning at\nthe start of a line.\n\nIn Python, the start of a line may contain form feeds but these do not\ncontribute to the indentation. In this PR, we strip the provided\nindentation of its leading form feeds in order to get the correct\nindentation amount for use in `dedent_to`. This avoids the introduction\nof a syntax error in the edit\n[`adjust_indentation`](https://github.com/astral-sh/ruff/blob/1f430e68af6e627569776dfbcd03b98ac7c29eb6/crates/ruff_linter/src/fix/edits.rs#L429).\n\nNote: We could try to stay closer to the user\u0027s intent by prepending the\nform feed prefix of the provided indentation _everywhere_ in the\nresulting edit, but that seems a little unwieldy and this is a bit of an\nedge case anyway.\n\nCloses #24373"
    },
    {
      "commit": "1f430e68af6e627569776dfbcd03b98ac7c29eb6",
      "tree": "391ab99e0ff54b1828700d4852b149cb8fa84f5e",
      "parents": [
        "4b8dfd302d45435afae44c4a596de144562a5211"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Thu Apr 02 23:00:35 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 22:00:35 2026 +0000"
      },
      "message": "add recent move of the `deferred` submodule to `.git-blame-ignore-revs` (#24379)"
    },
    {
      "commit": "4b8dfd302d45435afae44c4a596de144562a5211",
      "tree": "6d27d87197cc62e87384a93921d960f7914d5462",
      "parents": [
        "c18f449803c3836a2a4ae432bec3aba04382ee39"
      ],
      "author": {
        "name": "Matthew Mckee",
        "email": "matthewmckee04@yahoo.co.uk",
        "time": "Thu Apr 02 22:06:39 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 22:06:39 2026 +0100"
      },
      "message": "[ty] Fix extra_items TypedDict tests (#24367)"
    },
    {
      "commit": "c18f449803c3836a2a4ae432bec3aba04382ee39",
      "tree": "e46c9d46a28ec55b806be5b4e225893a2ec4cf14",
      "parents": [
        "50ee3c2e70ccd8b945b1280cc1a1bf92612744db"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Thu Apr 02 21:53:10 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 21:53:10 2026 +0100"
      },
      "message": "[ty] Use `infer_type_expression` for validating PEP-613 type aliases (#24370)\n\n## Summary\n\nReplace our ad-hoc validation of type qualifiers and AST structure of\nPEP-613 type alias values with a second pass over such values after\ninference has completed. The second pass uses `infer_type_expression`,\nwhich is much better at handling all possible edge cases of illegal type\nexpressions than the ad-hoc handling we had previously.\n\nThis PR also fixes a bug where `x: Literal[-3.14]` was not detected as\nan illegal type annotation. Ironically, this was something our previous\nad-hoc validation for type aliases _did_ handle, but that\n`infer_type_expression` did not!\n\nCo-authored-by: Carl Meyer \u003ccarl@astral.sh\u003e\n\n## Test Plan\n\nmdtests extended"
    },
    {
      "commit": "50ee3c2e70ccd8b945b1280cc1a1bf92612744db",
      "tree": "584ac4d033ff755adfd9dea0723fd67b1999e77a",
      "parents": [
        "de6d6be794a1b649ba5d60af6fe956c194dc9b2a"
      ],
      "author": {
        "name": "Dylan",
        "email": "dylwil3@gmail.com",
        "time": "Thu Apr 02 15:19:26 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 15:19:26 2026 -0500"
      },
      "message": "[`flake8-simplify`] Make the fix for `collapsible-if` (`SIM102`) safe in `preview` (#24371)\n\nAs far as I can tell the fix for [collapsible-if\n(SIM102)](https://docs.astral.sh/ruff/rules/collapsible-if/#collapsible-if-sim102)\nis safe. We already avoid dropping any comments (the fix is not offered\nin that case), and are quite careful to avoid false positives (since we\nallow nothing between the two `if` headers).\n\nSo I propose making this `Safe` in `preview`."
    },
    {
      "commit": "de6d6be794a1b649ba5d60af6fe956c194dc9b2a",
      "tree": "4266bd63317dbabb9eaae006aead738fdc22fbdd",
      "parents": [
        "d80c46e8cf045386ed30be910b59be4bd3eefffe"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Thu Apr 02 16:10:46 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 22:10:46 2026 +0200"
      },
      "message": "[ty] Validate TypedDict fields when subclassing (#24338)\n\n## Summary\n\nWhen a TypedDict inherits from another class, for each field, the child\nhas to preserve the same value and the same `Required` / `NotRequired`\nclassification. We now enforce these requirements.\n\nFor example, this isn\u0027t allowed:\n```python\nfrom typing import Literal, TypedDict\n\nclass Base(TypedDict):\n    type: int\n\nclass Child(Base):\n    type: Literal[1]  # This is an error.\n\ndef mutate(x: Base) -\u003e None:\n    x[\"type\"] \u003d 2\n\nc: Child \u003d {\"type\": 1}\nmutate(c)  # `c` no longer satisfies `Child`.\n```\n\n---------\n\nCo-authored-by: David Peter \u003cmail@david-peter.de\u003e"
    },
    {
      "commit": "d80c46e8cf045386ed30be910b59be4bd3eefffe",
      "tree": "eb00a0c94956abb5dbbcebe0d63d53398de09b68",
      "parents": [
        "533da8fccdd8381d1f74f7f0213179eae16bd5a7"
      ],
      "author": {
        "name": "Jack O\u0027Connor",
        "email": "oconnor663@gmail.com",
        "time": "Thu Apr 02 12:47:10 2026 -0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 12:47:10 2026 -0700"
      },
      "message": "[ty] pass type context to sequence literals in binary operations (#24197)\n\nFixes https://github.com/astral-sh/ty/issues/3002.\n\nThis is a quick fix for this special case. A more general solution will\nbe passing type context through generic method calls, with binary\noperations like these handled via their dunder methods."
    },
    {
      "commit": "533da8fccdd8381d1f74f7f0213179eae16bd5a7",
      "tree": "8f617aa852860b7c6352f1fb86980cf4aa9f924d",
      "parents": [
        "724ccc1ae8a61e872cf58435f2c073189dc248f2"
      ],
      "author": {
        "name": "Dylan",
        "email": "dylwil3@gmail.com",
        "time": "Thu Apr 02 13:58:56 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 13:58:56 2026 -0500"
      },
      "message": "Add release environment to notify-dependents job (#24372)"
    },
    {
      "commit": "724ccc1ae8a61e872cf58435f2c073189dc248f2",
      "tree": "b3099b78531f0852fdf28dd5714f63f1e47298c5",
      "parents": [
        "96d9e0964cb87498ef15510ea7f896ba336659f9"
      ],
      "author": {
        "name": "Dylan",
        "email": "dylwil3@gmail.com",
        "time": "Thu Apr 02 12:59:00 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 12:59:00 2026 -0500"
      },
      "message": "Bump 0.15.9 (#24369)"
    },
    {
      "commit": "96d9e0964cb87498ef15510ea7f896ba336659f9",
      "tree": "ab5ec3b55796b5b6ec976cda282d38db8905688d",
      "parents": [
        "130da28d610a466721bb942e8a5e0ec47bbe3469"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Thu Apr 02 18:56:22 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 17:56:22 2026 +0000"
      },
      "message": "[ty] Move the `deferred` submodule inside `infer/builder` (#24368)"
    },
    {
      "commit": "130da28d610a466721bb942e8a5e0ec47bbe3469",
      "tree": "df919c4bb77e25514702122b1a6ebdd44a37d28b",
      "parents": [
        "a617c54b0708a8c1eb850cc3b2a5caee21137a28"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Thu Apr 02 17:31:46 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 16:31:46 2026 +0000"
      },
      "message": "[ty] Infer the `extra_items` keyword argument to class-based TypedDicts as an annotation expression (#24362)"
    },
    {
      "commit": "a617c54b0708a8c1eb850cc3b2a5caee21137a28",
      "tree": "734618b1c92603cfb2fb15ecb0ebfb366845c0bf",
      "parents": [
        "d8517087c6cd0aa4f33dcede605ff642941dd74b"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Thu Apr 02 17:26:25 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 16:26:25 2026 +0000"
      },
      "message": "[ty] Validate type qualifiers in functional TypedDict fields and the `extra_items` keyword to functional TypedDicts (#24360)"
    },
    {
      "commit": "d8517087c6cd0aa4f33dcede605ff642941dd74b",
      "tree": "8807eabe3d7f23353ee4541aaa9ed2242bed337b",
      "parents": [
        "aecb5877c6d6fe035c03aba994ec3a7b935b8f02"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Thu Apr 02 17:19:42 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 17:19:42 2026 +0100"
      },
      "message": "[ty] Improve robustness of various type-qualifier-related checks (#24251)"
    },
    {
      "commit": "aecb5877c6d6fe035c03aba994ec3a7b935b8f02",
      "tree": "4fff00c5ac8028501de29b23f445db9f08831bff",
      "parents": [
        "b88957174311030927bf564da32d05dee0eb89d9"
      ],
      "author": {
        "name": "Zanie Blue",
        "email": "contact@zanie.dev",
        "time": "Thu Apr 02 11:15:34 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 16:15:34 2026 +0000"
      },
      "message": "Only run the release-gate on workflow dispatch (#24366)"
    },
    {
      "commit": "b88957174311030927bf564da32d05dee0eb89d9",
      "tree": "d56f7a64daf5801f42e4840906dc7dca70a7155e",
      "parents": [
        "3286a62be986a8d6d04d95b3bc619f06e012fa2f"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Thu Apr 02 17:05:42 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 16:05:42 2026 +0000"
      },
      "message": "[ty] Use `infer_type_expression` for parsing parameter annotations and return-type annotations (#24353)\n\n## Summary\n\nCurrently we call `infer_annotation_expression` on return annotations\nand parameter annotations, and then after that we do some ad-hoc checks\nto make sure that the `TypeAndQualifiers` returned doesn\u0027t actually have\nany qualifiers in it. A simpler way of checking that an annotation\nexpression doesn\u0027t contain type qualifiers is by simply calling\n`infer_type_expression` rather than `infer_annotation_expression`, since\ntype qualifiers are always banned in type expressions -- they\u0027re only\nvalid in annotation expressions.\n\nA naive way of doing this would regress our error messages -- rather\nthan saying \"Type qualifiers are not valid in parameter annotations\", we\nwould end up with the vaguer and more jargon-y \"Type qualifiers are not\nvalid in type expressions\" error message. That\u0027s easily fixed, however,\nby plumbing some more context through our existing `InferenceFlags`\nbitflag. Doing this allows us to improve many of our existing error\nmessages as well.\n\n## Test Plan\n\nmdtests updated"
    },
    {
      "commit": "3286a62be986a8d6d04d95b3bc619f06e012fa2f",
      "tree": "03373a81a796de3dd6af11c19a91eafdfca6f5fe",
      "parents": [
        "5f88756ee10e3faf0e96c883c34c95fc78200536"
      ],
      "author": {
        "name": "Zanie Blue",
        "email": "contact@zanie.dev",
        "time": "Thu Apr 02 10:01:32 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 10:01:32 2026 -0500"
      },
      "message": "Add a \"release-gate\" step to the release workflow (#24365)\n\nMirrors https://github.com/astral-sh/uv/pull/18804\n\nYou can see the environment policies I\u0027ll apply following merge at\nhttps://github.com/astral-sh/github-policies/tree/main/environments\n\nAlso updates the Docker workflow to avoid using release secrets when not\npushing."
    },
    {
      "commit": "5f88756ee10e3faf0e96c883c34c95fc78200536",
      "tree": "3dc10c81dfefdbd4a8b5f1c2f87c8e0f3923ab82",
      "parents": [
        "5c59f8a46965cac3470f09972196c8620faa4626"
      ],
      "author": {
        "name": "Dylan",
        "email": "dylwil3@gmail.com",
        "time": "Thu Apr 02 09:57:28 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 14:57:28 2026 +0000"
      },
      "message": "Disallow starred expressions as values of starred expressions (#24280)\n\nPart of #19077"
    },
    {
      "commit": "5c59f8a46965cac3470f09972196c8620faa4626",
      "tree": "c3e87c5cc3772002e883d1c23959da3e2f10135b",
      "parents": [
        "34d54b6983d3a1feebc22adad4129204acf1d5ee"
      ],
      "author": {
        "name": "InSync",
        "email": "insyncwithfoo@gmail.com",
        "time": "Thu Apr 02 21:53:31 2026 +0700"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 09:53:31 2026 -0500"
      },
      "message": "[`pyupgrade`] Ignore strings with string-only escapes (`UP012`) (#16058)\n\n## Summary\n\nResolves #12753.\n\nAfter this change, `UP012` will no longer report strings containing any\nof the following:\n\n* Name escapes (`\\N{NAME}`)\n* Short (`\\u0000`) and long (`\\U00000000`) Unicode escapes\n* Octal escapes (`\\0`, `\\00`, `\\000`) where the codepoint value is\ngreater than 255 (377\u003csub\u003e8\u003c/sub\u003e)\n\n## Test Plan\n\n`cargo nextest run` and `cargo insta test`."
    },
    {
      "commit": "34d54b6983d3a1feebc22adad4129204acf1d5ee",
      "tree": "3b2930b87585bdc2d745f6efe3247a9daa95e072",
      "parents": [
        "da7b95893f390883082a8cc12ea498dae4379fcc"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Thu Apr 02 15:16:29 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 14:16:29 2026 +0000"
      },
      "message": "[ty] Improve consistency and quality of diagnostics relating to invalid type forms (#24325)"
    },
    {
      "commit": "da7b95893f390883082a8cc12ea498dae4379fcc",
      "tree": "2b131f6a4be6a2c74ac4bc997b0c14e917eb5c09",
      "parents": [
        "a0356f1a5b2c5d91f940bef195ea3f51b0ce7b7d"
      ],
      "author": {
        "name": "Redovo1",
        "email": "redovo0413@gmail.com",
        "time": "Thu Apr 02 22:00:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 14:00:31 2026 +0000"
      },
      "message": "[flake8-type-checking] Clarify import cycle wording for TC001/TC002/TC003 (#24322)\n\nCo-authored-by: red \u003cred@reddeMacBook-Pro.local\u003e"
    },
    {
      "commit": "a0356f1a5b2c5d91f940bef195ea3f51b0ce7b7d",
      "tree": "3c1d0ffeffa81f0d2ee8b7e1e567a58c4c206331",
      "parents": [
        "37f5d61595f88591b91b914aa05550644300ce19"
      ],
      "author": {
        "name": "Dylan",
        "email": "dylwil3@gmail.com",
        "time": "Thu Apr 02 08:26:18 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 08:26:18 2026 -0500"
      },
      "message": "[`flake8-errmsg`] Avoid shadowing existing `msg` in fix for `EM101` (#24363)\n\nCloses #24335\n\nAs suggested, we use the new `fresh_binding` helper from #24316\n\nNote that the issue with this fix was already brought up in the\ndiscussion in #9052 (see also #9059), where it was decided that it was\nokay because the fix was already marked as unsafe."
    },
    {
      "commit": "37f5d61595f88591b91b914aa05550644300ce19",
      "tree": "befe03e488fb55b7dafcb34dc7cc9e160b933889",
      "parents": [
        "b03dc7841c7ca51e30eca5ec9e529bb6babfbe06"
      ],
      "author": {
        "name": "Ed Cuss",
        "email": "100875124+second-ed@users.noreply.github.com",
        "time": "Thu Apr 02 13:49:38 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 14:49:38 2026 +0200"
      },
      "message": "`RUF072`: skip formfeeds on dedent (#24308)\n\nCo-authored-by: Micha Reiser \u003cmicha@reiser.io\u003e"
    },
    {
      "commit": "b03dc7841c7ca51e30eca5ec9e529bb6babfbe06",
      "tree": "44a63778b9b71853e954641d93599226dc95d4d6",
      "parents": [
        "68483b30eeb5e9327af1eb822eb92751d9b4f258"
      ],
      "author": {
        "name": "Shahar Naveh",
        "email": "50263213+ShaharNaveh@users.noreply.github.com",
        "time": "Thu Apr 02 14:29:22 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 12:29:22 2026 +0000"
      },
      "message": "Replace unmaintained `unic-ucd-category` crate with `icu_properties` (#24344)\n\nCo-authored-by: Micha Reiser \u003cmicha@reiser.io\u003e"
    },
    {
      "commit": "68483b30eeb5e9327af1eb822eb92751d9b4f258",
      "tree": "d077eb42975fb76c2d996bfe54698bcf0cfbf940",
      "parents": [
        "ef5c149f4206202200930e6e2765b0677cea044a"
      ],
      "author": {
        "name": "Micha Reiser",
        "email": "micha@reiser.io",
        "time": "Thu Apr 02 13:02:57 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 14:02:57 2026 +0200"
      },
      "message": "[ty] Replace markdown hard line breaks in snapshot tests (#24361)"
    },
    {
      "commit": "ef5c149f4206202200930e6e2765b0677cea044a",
      "tree": "570e4a6be4ca329b6af41117d7c3305e9f5cbddb",
      "parents": [
        "a53044934c4d06c23c77223a781815f3e78c2ad9"
      ],
      "author": {
        "name": "Micha Reiser",
        "email": "micha@reiser.io",
        "time": "Thu Apr 02 10:56:12 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 09:56:12 2026 +0000"
      },
      "message": "[ty] Move snapshot for code action test with trailing whitespace to external file (#24359)"
    },
    {
      "commit": "a53044934c4d06c23c77223a781815f3e78c2ad9",
      "tree": "d4d3fa95a6aa4ba77371efd916f1e3a4ff8c6d77",
      "parents": [
        "298d1cebceaf04366af7edbaaf2e6041b045f238"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Wed Apr 01 21:36:39 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 20:36:39 2026 +0000"
      },
      "message": "[ty] Remove `TypeInferenceBuilder::inferring_vararg_annotation` (#24352)"
    },
    {
      "commit": "298d1cebceaf04366af7edbaaf2e6041b045f238",
      "tree": "4255418f9c6f4c5918243af724146ae4e0ae089c",
      "parents": [
        "c66bc41ec353b1b8df2fc06810c166a47ad30660"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Wed Apr 01 20:01:20 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 20:01:20 2026 +0100"
      },
      "message": "[ty] Tighten up validation of subscripts and attributes in type expressions (#24329)"
    },
    {
      "commit": "c66bc41ec353b1b8df2fc06810c166a47ad30660",
      "tree": "e88a01eb7e7764d6321622420d4ad1c8966d4b69",
      "parents": [
        "fe833cb5184a3502e8d4a93c45c1a488f722a6e3"
      ],
      "author": {
        "name": "Douglas Creager",
        "email": "dcreager@dcreager.net",
        "time": "Wed Apr 01 13:45:21 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 13:45:21 2026 -0400"
      },
      "message": "[ty] Handle most \"deep\" mutual typevar constraints (#24079)\n\nThis is the first step in supporting\nhttps://github.com/astral-sh/ty/issues/2045. It handles all variances,\nbut some of the mdtests still have TODOs because they will also require\nupdating `SpecializationBuilder` to combine constraint sets across\nmultiple arguments in a call.\n\nFor the covariant case, we have:\n\n```py\ndef invoke[A, B](fn: Callable[[A], B], value: A) -\u003e B:\n    return fn(value)\n\ndef head[T](xs: Sequence[T]) -\u003e T: ...\ndef lift[T](x: T) -\u003e Sequence[T]: ...\n\nreveal_type(invoke(head, [1, 2, 3]))  # revealed: int\nreveal_type(invoke(lift, 1))  # revealed: Sequence[Literal[1]]\n```\n\nWith this PR, the first call is still TODO, but the second call is now\nrevealed correctly.\n\nThere are also several lower-level mdtests on the constraint set\nimplementation itself, testing that we actually detect the necessary\nimplications correctly."
    },
    {
      "commit": "fe833cb5184a3502e8d4a93c45c1a488f722a6e3",
      "tree": "8840c970e20b4b3e6b28f7172c75c564635e73ae",
      "parents": [
        "a025f9baf68f938fdde3761653da70ddeaace98b"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Wed Apr 01 18:28:24 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 18:28:24 2026 +0100"
      },
      "message": "[ty] Simplify `SpecialFormType::in_type_expression` (#24347)"
    },
    {
      "commit": "a025f9baf68f938fdde3761653da70ddeaace98b",
      "tree": "f6e347becff6aca80989aa21901e0b229d91869b",
      "parents": [
        "6ceb5ee0d503a95664dd3cdb8bbf82990ee189d0"
      ],
      "author": {
        "name": "Charlie Marsh",
        "email": "charlie.r.marsh@gmail.com",
        "time": "Wed Apr 01 12:26:59 2026 -0400"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 16:26:59 2026 +0000"
      },
      "message": "[ty] Mark loop header assignments as used (#24336)\n\n## Summary\n\nIn the linked example, we weren\u0027t looking at the usage of `best_buy`\nbecause (IIUC) it\u0027s modeled as part of the synthetic loop header, and\nthose usages were skipped.\n\nCloses https://github.com/astral-sh/ty/issues/3187."
    },
    {
      "commit": "6ceb5ee0d503a95664dd3cdb8bbf82990ee189d0",
      "tree": "9236f1fae30edc29d8882ebb793ed871d153389d",
      "parents": [
        "7fe7e95760709b8810ebde32af523d38fdf7a581"
      ],
      "author": {
        "name": "Micha Reiser",
        "email": "micha@reiser.io",
        "time": "Wed Apr 01 17:01:30 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 18:01:30 2026 +0200"
      },
      "message": "Avoid rendering fix lines with trailing whitespace after `|` (#24343)"
    },
    {
      "commit": "7fe7e95760709b8810ebde32af523d38fdf7a581",
      "tree": "246904314735296ce20b6d40550fc777eef49ed0",
      "parents": [
        "1219cf3b6c5d2d2488f13dc7626076d200a4ca0f"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Wed Apr 01 15:00:00 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 15:00:00 2026 +0100"
      },
      "message": "[ty] Various cleanups to functional `TypedDict` parsing logic (#24345)"
    },
    {
      "commit": "1219cf3b6c5d2d2488f13dc7626076d200a4ca0f",
      "tree": "1459c6e4acf1f9607adb320208b9563d5b813430",
      "parents": [
        "ab032bf77e890c6bb59ef834c07618d4ea4e960a"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Wed Apr 01 14:22:19 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 14:22:19 2026 +0100"
      },
      "message": "[ty] Minor cleanups to `infer/builder/subscript.rs` (#24346)"
    },
    {
      "commit": "ab032bf77e890c6bb59ef834c07618d4ea4e960a",
      "tree": "9bd245cc83f3794974660890a9a2a075c49fafc3",
      "parents": [
        "03404b7cdb20bf9095f28712733bd3d65ec9443a"
      ],
      "author": {
        "name": "Alex Waygood",
        "email": "Alex.Waygood@Gmail.com",
        "time": "Wed Apr 01 12:09:10 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 12:09:10 2026 +0100"
      },
      "message": "[ty] Avoid emitting cascading diagnostics when parsing invalid type expressions (#24326)\n\n## Summary\n\nIn lots of places in our type-expression parsing, we continue to call\n`self.infer_type_expression()` on sub-expressions in the AST even after\nwe\u0027ve already determined that the type expression is invalid. I think\nthat\u0027s generally a mistake; it often leads to us emitting many\ndiagnostics on a single type expression when one would really be\nsufficient. This PR switches many callsites from `infer_type_expression`\nto `infer_expression`, to avoid this phenomenon of cascading diagnostics\nin error cases.\n\n## Test Plan\n\nMdtests and snapshots updated."
    },
    {
      "commit": "03404b7cdb20bf9095f28712733bd3d65ec9443a",
      "tree": "9efd76521ed90691f89909538c8e203ede0ded3f",
      "parents": [
        "86045e28d536222521fcbbf592c0e3eae5b8c931"
      ],
      "author": {
        "name": "Shaygan Hooshyari",
        "email": "sh.hooshyari@gmail.com",
        "time": "Wed Apr 01 11:13:19 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 11:13:19 2026 +0200"
      },
      "message": "[ty] Show constructor signature on hover (#24257)\n\nCo-authored-by: Micha Reiser \u003cmicha@reiser.io\u003e"
    },
    {
      "commit": "86045e28d536222521fcbbf592c0e3eae5b8c931",
      "tree": "d04e14872b8f28aa3b555406ed509c627f0f8468",
      "parents": [
        "39c3636bc9c37db2652a0123848949a459e02988"
      ],
      "author": {
        "name": "github-actions[bot]",
        "email": "41898282+github-actions[bot]@users.noreply.github.com",
        "time": "Wed Apr 01 08:17:53 2026 +0100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 01 08:17:53 2026 +0100"
      },
      "message": "[ty] Sync vendored typeshed stubs (#24340)\n\nClose and reopen this PR to trigger CI\n\n---------\n\nCo-authored-by: typeshedbot \u003c\u003e"
    }
  ],
  "next": "39c3636bc9c37db2652a0123848949a459e02988"
}
