{
  "issues": [
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2438",
      "id": 3800623797,
      "node_id": "I_kwDOOje-Bs7iiOq1",
      "number": 2438,
      "title": "A global try-except block preceding a shadowing import causes incorrect type inference (Module | Object) in local scope",
      "user": {
        "login": "nemowang2003",
        "id": 98275463,
        "node_id": "U_kgDOBduQhw",
        "avatar_url": "https://avatars.githubusercontent.com/u/98275463?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/nemowang2003",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-01-11T02:15:03Z",
      "updated_at": "2026-01-11T02:30:43Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n# Description\n\nI have found a minimal reproduction where a `try-except` block placed **before** an import causes type inference ambiguity inside a function scope.\n\nThe issue specifically occurs when the imported object shares the same name as the module it is imported from (shadowing).\n\n# Minimal Reproducible Example\n\n### File Structure:\n```text\nrepro/src/\n├── __init__.py\n└── demo.py\n```\n\n```python\n# __init__.py\n\ntry:\n    pass\nexcept Exception:\n    pass\n\nimport typing\n\nfrom .demo import demo\n\ntyping.reveal_type(demo)  # Literal[42]\n\n\ndef main() -> None:\n    typing.reveal_type(demo)  # <module 'repro.demo'> | Literal[42]\n\n# demo.py\n\ndemo = 42\n```\n\n# Investigation Notes\n\nOrder is critial. If the `try-except` block is moved **after** the import, the issue disappears.\n\n\n\n### Version\n\nty 0.0.11 (Homebrew 2026-01-09)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2438/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2437",
      "id": 3800456562,
      "node_id": "I_kwDOOje-Bs7ihl1y",
      "number": 2437,
      "title": "Struct unpack inference",
      "user": {
        "login": "sakgoyal",
        "id": 19929553,
        "node_id": "MDQ6VXNlcjE5OTI5NTUz",
        "avatar_url": "https://avatars.githubusercontent.com/u/19929553?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sakgoyal",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2026-01-10T22:44:38Z",
      "updated_at": "2026-01-10T22:44:38Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nCan the type checker support introspecting the `struct.unpack` format string to infer the return type? currently it returns `Any`, but i'd like it to return a specified type if possible (when a literal string is provided). \n\nI am trying to add types to an untyped library, but it uses a lot of struct unpacking which results in a lot of manual casts or Any's everywhere. \n\nI already wrote some python code that seems to get the type at runtime. but it's just a PoC to show that it's possible to do. \n\n```py\nimport re\nfrom typing import cast\n\ntype TypeMap = type[int | bool | str | bytes | float]\n\n_TYPE_MAP: dict[str, TypeMap] = {c: int for c in 'bBhHiIlLqQnNP'}\n_TYPE_MAP.update(dict.fromkeys('efd', float))\n_TYPE_MAP.update(dict.fromkeys('c', bytes))\n_TYPE_MAP['?'] = bool\n\ndef get_unpack_type(fmt: str):\n    core = fmt.lstrip('@=<>!')\n\n    types: list[TypeMap] = []\n    for count, tag in cast(list[tuple[str, str]], re.findall(r'(\\d*)([xcbB?hHiIlLqQnNefdspP])', core)):\n        if tag == 'x':\n            continue\n        if tag in 'sp':\n            types.append(bytes)\n        else:\n            t = _TYPE_MAP.get(tag, int)\n            n = int(count) if count else 1\n            types.extend([t] * n)\n    if len(types) == 1 and 'x' not in core:\n        return types[0]\n    return tuple[tuple(types)]\n\n\nif __name__ == '__main__':\n    test_cases = [\n        ('2xH', tuple[int]),\n        ('@i', int),\n        ('=i', int),\n        ('c3x', tuple[bytes]),\n        ('2c', tuple[bytes, bytes]),\n        ('5c', tuple[bytes, bytes, bytes, bytes, bytes]),\n        ('0s', bytes),\n        ('1s', bytes),\n        ('255s', bytes),\n        ('e', float),\n        ('2e', tuple[float, float]),\n        ('e4x', tuple[float]),\n        ('3eH', tuple[float, float, float, int]),\n        ('?x?', tuple[bool, bool]),\n        ('2?', tuple[bool, bool]),\n        ('?2xI', tuple[bool, int]),\n        ('fd4x', tuple[float, float]),\n        ('d2xH', tuple[float, int]),\n        ('2i4x2h', tuple[int, int, int, int]),\n        ('iP', tuple[int, int]),\n        ('>n2xN', tuple[int, int]),\n        ('!P4x', tuple[int]),\n    ]\n\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2437/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2436",
      "id": 3799739763,
      "node_id": "I_kwDOOje-Bs7ie21z",
      "number": 2436,
      "title": "Dict unpacking inside another dictionary ignores annotations",
      "user": {
        "login": "AndBoyS",
        "id": 40628201,
        "node_id": "MDQ6VXNlcjQwNjI4MjAx",
        "avatar_url": "https://avatars.githubusercontent.com/u/40628201?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AndBoyS",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-01-10T13:40:07Z",
      "updated_at": "2026-01-10T20:15:18Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```python\nfrom typing_extensions import reveal_type\nfrom typing import Any\n\n\nkwargs: dict[str, Any] = {\n    \"a\": \"\",\n    \"b\": 1,\n}\nreveal_type(kwargs)  # dict[str, Any]\n\nkwargs: dict[str, Any] = {\n    **{\"a\": \"\", \"b\": 1},\n}\nreveal_type(kwargs)  # dict[str | Unknown, Any | str | int]\n```\n\n### Version\n\n0.0.11",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2436/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2434",
      "id": 3799532943,
      "node_id": "I_kwDOOje-Bs7ieEWP",
      "number": 2434,
      "title": "Strings are considered as LiteralStrings",
      "user": {
        "login": "Salamandar",
        "id": 6552989,
        "node_id": "MDQ6VXNlcjY1NTI5ODk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6552989?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Salamandar",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-01-10T10:02:56Z",
      "updated_at": "2026-01-10T11:25:31Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThere are multiple issues:\n* typeshed defines str.split() and str.join() with a return type of LiteralString or list[LiteralString]\n  https://github.com/python/typeshed/issues/10887\n* `ty` considers str as LiteralString:\n\n```py\na = str()\nreveal_type(a)\npage_lines = \"\".join(some_method_returning_str()).split(\"\\n\")\nreveal_type(page_lines)\n```\ngives `Literal[\"\"]` and `list[LiteralString]`\n\nwhile `mypy` gives:\n```\nnote: Revealed type is \"builtins.str\"\nnote: Revealed type is \"builtins.list[builtins.str]\"\n```\n\nand as list is invariant, we can't pass `list[LiteralString]` to functions expecting a list[str]…\n\n### Platform\n\nLinux\n\n### Version\n\n0.0.8, 0.0.11\n\n### Python version\n\n3.13.11",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2434/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2432",
      "id": 3799123712,
      "node_id": "I_kwDOOje-Bs7icgcA",
      "number": 2432,
      "title": "Truthy checks in a boolean statement resolve to incorrect type",
      "user": {
        "login": "goodspark",
        "id": 29210237,
        "node_id": "MDQ6VXNlcjI5MjEwMjM3",
        "avatar_url": "https://avatars.githubusercontent.com/u/29210237?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/goodspark",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2026-01-10T05:01:30Z",
      "updated_at": "2026-01-10T07:31:36Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nPlayground: https://play.ty.dev/fddded41-5c96-4852-9849-bd44cdf03074\n\n```py\nfrom datetime import datetime, timedelta\nfrom dataclasses import dataclass\n\n@dataclass\nclass Obj:\n    x: datetime\n\na: Obj | None = Obj(datetime.now())\n# Since a is always truthy, the boolean statement continues and returns datetime\nb = (a and a.x - timedelta(days=1))\n# c should always be datetime here, so the diagnostic is incorrect\nc = datetime.now() + timedelta(days=1) > b\n# Operator `>` is not supported between objects of type `datetime` and `(Obj & ~AlwaysTruthy) | datetime`\n```\n\nIf `a` was just `datetime | None`, this would work fine, but this use case is meaningful as often container data types might be None (ex. a DB row lookup).\n\nTo be fair, this diagnostic is useful _if `a` was not AlwaysTruthy, such as through a function call (which is more realistic)_. However, the diagnostic message is misleading as it currently is. One could argue instead we should write code using an if or ternary expression.\n\n```py\nb = None\nif a:\n    b = a.x - timedelta(days=1)\n# or ...\nb = None if a is None else a.x - timedelta(days=1)\n```\n\nWith this change, ty will correctly infer `b` is always datetime and have no issue. And it will also correctly error with an accurate message if `a` was not AlwaysTruthy (ie. None can't be compared to datetime).\n\n---\n\nTerms used to find already-reported issues:\n- `unsupported-operation boolean`\n- `unsupported-operation and`\n- `unsupported-operation truthy`\n\n#1972 might be a match. It talks about types being constrained by values. In a way, the type of `b` does get constrained by the resulting value of evaluating the compound boolean expression. But my example is not using a direct value but instead the resulting value of an operation.\n\n### Version\n\n0.0.11",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2432/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2429",
      "id": 3798515519,
      "node_id": "I_kwDOOje-Bs7iaL8_",
      "number": 2429,
      "title": "Emit errors on invalid defaulted TypeVar constructions",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2026-01-09T22:19:00Z",
      "updated_at": "2026-01-10T22:36:52Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen a TypeVar has a default, there are some bounds/constraints that may be invalid. ty should emit an error for these cases. This is probably already part of the typing conformance suite somewhere, but I couldn't find an existing issue for it, so I figured I'd open one.\n\nFrom these links:\nhttps://typing.python.org/en/latest/spec/generics.html#bound-rules\nhttps://typing.python.org/en/latest/spec/generics.html#constraint-rules\n\nhttps://play.ty.dev/8b5084ae-3a52-439a-b28a-6aedaad52466\n```py\nfrom typing import TypeVar\n\nT1 = TypeVar(\"T1\", bound=int)\nOk = TypeVar(\"Ok\", default=T1, bound=float)     # Valid\nAlsoOk = TypeVar(\"AlsoOk\", default=T1, bound=int)   # Valid\nInvalid = TypeVar(\"Invalid\", default=T1, bound=str)  # Invalid: int is not assignable to str\n\nT2 = TypeVar(\"T2\", bound=int)\nInvalid1 = TypeVar(\"Invalid1\", float, str, default=T2)         # Invalid: upper bound int is incompatible with constraints float or str\n\nT3 = TypeVar(\"T3\", int, str)\nAlsoOk1 = TypeVar(\"AlsoOk1\", int, str, bool, default=T3)      # Valid\nAlsoInvalid = TypeVar(\"AlsoInvalid\", bool, complex, default=T3)  # Invalid: {bool, complex} is not a superset of {int, str}\n```\nCurrently none of the `Invalid` lines give an error.\n\n### Version\n\nty 0.0.11 (830cb9cc6 2026-01-09)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2429/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2428",
      "id": 3798498184,
      "node_id": "I_kwDOOje-Bs7iaHuI",
      "number": 2428,
      "title": "wrong inference of bound-method / function literals off nominal-instance / subclass-of types",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9597629813,
          "node_id": "LA_kwDOOje-Bs8AAAACPBA1dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/callables",
          "name": "callables",
          "color": "5d4406",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2026-01-09T22:12:10Z",
      "updated_at": "2026-01-09T22:13:19Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "> I think our inference of singleton function or bound-method types when accessed off nominal-instance or subclass-of types is simply wrong and needs to be fixed. The nominal-instance type `A` includes instances of `A` and all subclasses of `A`. That means it is wrong to say that `instance_of_a.method` is a singleton bound-method type, unless either `A` or `A.method` is marked as final. Similarly, `type[A]` includes subclasses of `A`, so `subclass_of_A.method` cannot be a singleton function literal type.\n> \n> Accessing methods as attributes of class-literal types can still correctly return a function literal.\n> \n> One unfortunate side effect of making the above fix is that we will lose go-to-definition on most methods. To avoid this regression, we may need to allow callable types to optionally carry a \"most precise known\" source definition (or definitions?), which is not \"part of the type\" in terms of type relations but can be used for go-to-definition. \n\n _Originally posted by @carljm in [#770](https://github.com/astral-sh/ty/issues/770#issuecomment-3382323817)_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2428/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2427",
      "id": 3798447664,
      "node_id": "I_kwDOOje-Bs7iZ7Yw",
      "number": 2427,
      "title": "Invalid solution to contravariant type variable with upper bound",
      "user": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2026-01-09T21:52:26Z",
      "updated_at": "2026-01-09T22:40:17Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For example,\n\n```py\nclass Contra[T]:\n    def append(self, x: T): ...\n\ndef f[T: int](x: Contra[T]):\n    ...\n\ndef _(x: Contra[str]):\n    f(x) # Argument to function `f` is incorrect: Argument type `str` does not satisfy upper bound `int` of type variable `T`\n```\n\nSolving `T` to `int & str = Never` would avoid the assignability error.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2427/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2426",
      "id": 3798382547,
      "node_id": "I_kwDOOje-Bs7iZrfT",
      "number": 2426,
      "title": "ty thinks `Generator[None, None, A]` and `Generator[None, None, B]` are equivalent types on Python <3.13",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "2": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        },
        "3": {
          "id": 9965825022,
          "node_id": "LA_kwDOOje-Bs8AAAACUgJr_g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/async",
          "name": "async",
          "color": "fff66d",
          "default": false,
          "description": "Issues related to checking code using async/await"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2026-01-09T21:20:22Z",
      "updated_at": "2026-01-09T21:29:21Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "```py\nfrom ty_extensions import is_equivalent_to, is_subtype_of, static_assert\nfrom typing import Generator\n\nclass A: ...\nclass B: ...\n\nstatic_assert(not is_equivalent_to(Generator[None, None, A], Generator[None, None, B]))\nstatic_assert(not is_subtype_of(Generator[None, None, A], Generator[None, None, B]))\nstatic_assert(not is_subtype_of(Generator[None, None, B], Generator[None, None, A]))\n```\n\nhttps://play.ty.dev/0cd14b68-645f-461b-896a-31f78cc10b6c\n\nThe assertions here should pass. They do pass on Python 3.13+, but fail on Python 3.12 or older.\n\nThe reason is that `Generator` is a protocol, and its third type parameter (`ReturnT_co`) is unused in its interface (as defined in typeshed) in Python earlier than 3.13.\n\nAs far as the definition given in typeshed, I think ty's conclusion here is correct. But generators are rather special, specifically in that their \"return\" value also gets wrapped into the `StopIteration` exception that ends their iteration (even on 3.12 and earlier), but this is not visible in their type system interface. Thus their `ReturnT_co` always matters (quite a lot -- this is the key mechanism by which async/await works), but typeshed's definition doesn't make that explicit.\n\nI think we will probably need to special-case this type somehow to understand that its `ReturnT_co` always matters, even on older Python versions.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2426/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2424",
      "id": 3798178105,
      "node_id": "I_kwDOOje-Bs7iY5k5",
      "number": 2424,
      "title": "Goto-definition doesn't work when accessing `type` attributes on class objects",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2026-01-09T19:52:28Z",
      "updated_at": "2026-01-09T19:52:28Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For this snippet:\n\n```py\nclass Foo: ...\n\nFoo.__dictoffset__\n```\n\nTy correctly infers that the type of the `__dictoffset__` attribute is an `int`. However, goto-definition doesn't take me to the definition of this attribute (which is found at https://github.com/astral-sh/ruff/blob/a0f2cd0ded976511b1746c56d289c0cdb2320098/crates/ty_vendored/vendor/typeshed/stdlib/builtins.pyi#L261-L262 -- all class objects are instances of `type`, so all attributes defined on `builtins.type` are available on a class object).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2424/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2421",
      "id": 3797966745,
      "node_id": "I_kwDOOje-Bs7iYF-Z",
      "number": 2421,
      "title": "Add strict-optional configuration option (or separate rule) for T | None argument mismatches",
      "user": {
        "login": "FroguelYipit",
        "id": 159819671,
        "node_id": "U_kgDOCYanlw",
        "avatar_url": "https://avatars.githubusercontent.com/u/159819671?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/FroguelYipit",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-01-09T18:39:16Z",
      "updated_at": "2026-01-09T21:32:01Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis is more of a feature request, but since I didn't see that option, I'm opening as a bug. \n\nWhen using third-party libraries with incomplete type hints, ty frequently flags `invalid-argument-type` errors when passing `T | None` to functions that accept `T`. This happens because the library's type stubs incorrectly annotate a parameter as `T` when it actually accepts `None` at runtime. \n\nExample\n```py\ndef lib_func(a: int = None) -> int:\n    return a or 1\n\na = None\nlib_func(a=a) \n```\nthen `ty` will flag the `a=a` as being wrong, despite there being no error at runtime. I understand this might be desired behavior in some cases, which is why I'm asking for a config to switch on or off. My issue is specific for this `None` that work at runtime. Ideally they'd be warnings not errors, but only current option would be to disable all invalid argument checks which is not an option. \n\n### Version\n\nty 0.0.10 (d18902cdc 2026-01-07)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2421/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2417",
      "id": 3797147881,
      "node_id": "I_kwDOOje-Bs7iU-Dp",
      "number": 2417,
      "title": "Semantic-tokens panic while typing out a `match`/`case` statement",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "2": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2026-01-09T14:28:00Z",
      "updated_at": "2026-01-09T15:04:52Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI'm getting repeated semantic-tokens panics in the server while typing out `match`/`case` statements in a Python project. I managed to create this standalone video to reproduce it:\n\nhttps://github.com/user-attachments/assets/66c7d0b3-cde8-45d2-950e-5d49a7367867\n\nThe code at the end of the video was:\n\n```py\nimport ast\n\ndef f(x: ast.AST):\n    match x:\n        case ast.Attribute(value=ast.Name(id), attr)\n```\n\nand the logs are:\n\n```\n2026-01-09 14:24:20.637830000  INFO Version: ruff/0.14.10+238 (de9f3f90e 2026-01-07)\n2026-01-09 14:24:20.656786000  INFO Defaulting to python-platform `darwin`\n2026-01-09 14:24:20.657848000  INFO Python version: Python 3.13, platform: darwin\n2026-01-09 14:24:20.664373000  INFO Indexed 1 file(s) in 0.004s\n2026-01-09 14:24:27.673639000  INFO Defaulting to python-platform `darwin`\n2026-01-09 14:24:27.674723000  INFO Python version: Python 3.13, platform: darwin\n2026-01-09 14:24:27.678103000  INFO Indexed 1 file(s) in 0.003s\n[Error - 14:24:42] Request textDocument/documentSymbol failed.\nError: name must not be falsy\n\tat bp.validate (file:///Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:112:26946)\n\tat new bp (file:///Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:112:27235)\n\tat V (/Users/alexw/.vscode/extensions/astral-sh.ty-2026.2.0-darwin-arm64/dist/extension.js:1:275579)\n\tat c (/Users/alexw/.vscode/extensions/astral-sh.ty-2026.2.0-darwin-arm64/dist/extension.js:1:18138)\n\tat t.map (/Users/alexw/.vscode/extensions/astral-sh.ty-2026.2.0-darwin-arm64/dist/extension.js:1:18224)\n\tat Object.asDocumentSymbols (/Users/alexw/.vscode/extensions/astral-sh.ty-2026.2.0-darwin-arm64/dist/extension.js:1:283635)\n\tat i (/Users/alexw/.vscode/extensions/astral-sh.ty-2026.2.0-darwin-arm64/dist/extension.js:1:347081)\n\tat runNextTicks (node:internal/process/task_queues:65:5)\n\tat process.processImmediate (node:internal/timers:453:9)\n\tat process.callbackTrampoline (node:internal/async_hooks:130:17)\n\tat async RN.provideDocumentSymbols (file:///Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:144:140602)\n[Error - 14:24:42] Request textDocument/documentSymbol failed.\nError: name must not be falsy\n\tat bp.validate (file:///Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:112:26946)\n\tat new bp (file:///Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:112:27235)\n\tat V (/Users/alexw/.vscode/extensions/astral-sh.ty-2026.2.0-darwin-arm64/dist/extension.js:1:275579)\n\tat c (/Users/alexw/.vscode/extensions/astral-sh.ty-2026.2.0-darwin-arm64/dist/extension.js:1:18138)\n\tat t.map (/Users/alexw/.vscode/extensions/astral-sh.ty-2026.2.0-darwin-arm64/dist/extension.js:1:18224)\n\tat Object.asDocumentSymbols (/Users/alexw/.vscode/extensions/astral-sh.ty-2026.2.0-darwin-arm64/dist/extension.js:1:283635)\n\tat i (/Users/alexw/.vscode/extensions/astral-sh.ty-2026.2.0-darwin-arm64/dist/extension.js:1:347081)\n\tat async RN.provideDocumentSymbols (file:///Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:144:140602)\n2026-01-09 14:25:20.141538000 ERROR An error occurred with request ID 369: request handler panicked at crates/ty_ide/src/semantic_tokens.rs:248:9:\nTokens must be added in file order: previous token ends at Some(89), new token starts at 77query stacktrace:\n\n\nrun with `RUST_BACKTRACE=1` environment variable to display a backtrace\n\n[Error - 14:25:20] Request textDocument/semanticTokens/full failed.\n  Message: request handler panicked at crates/ty_ide/src/semantic_tokens.rs:248:9:\nTokens must be added in file order: previous token ends at Some(89), new token starts at 77query stacktrace:\n\n\nrun with `RUST_BACKTRACE=1` environment variable to display a backtrace\n\n  Code: -32603 \n2026-01-09 14:25:20.562263000 ERROR An error occurred with request ID 377: request handler panicked at crates/ty_ide/src/semantic_tokens.rs:248:9:\nTokens must be added in file order: previous token ends at Some(91), new token starts at 77query stacktrace:\n\n\nrun with `RUST_BACKTRACE=1` environment variable to display a backtrace\n\n[Error - 14:25:20] Request textDocument/semanticTokens/full failed.\n  Message: request handler panicked at crates/ty_ide/src/semantic_tokens.rs:248:9:\nTokens must be added in file order: previous token ends at Some(91), new token starts at 77query stacktrace:\n\n\nrun with `RUST_BACKTRACE=1` environment variable to display a backtrace\n\n  Code: -32603 \n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2417/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2416",
      "id": 3797075761,
      "node_id": "I_kwDOOje-Bs7iUscx",
      "number": 2416,
      "title": "Emit a diagnostic on an attempt to create a \"generic enum\"",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2026-01-09T14:06:52Z",
      "updated_at": "2026-01-09T19:18:37Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This class statement fails at runtime, but ty does not detect it:\n\n```py\nfrom enum import Enum\n\nclass Foo[T](Enum):\n    X = list[T]()\n```\n\nRuntime:\n\n```pytb\n>>> from enum import Enum\n... \n... class Foo[T](Enum):\n...     X = list[T]()\n...     \nTraceback (most recent call last):\n  File \"<python-input-0>\", line 3, in <module>\n    class Foo[T](Enum):\n        X = list[T]()\n  File \"<python-input-0>\", line 3, in <generic parameters of Foo>\n    class Foo[T](Enum):\n        X = list[T]()\n  File \"/Users/alexw/.pyenv/versions/3.13.1/lib/python3.13/enum.py\", line 491, in __prepare__\n    member_type, first_enum = metacls._get_mixins_(cls, bases)\n                              ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^\n  File \"/Users/alexw/.pyenv/versions/3.13.1/lib/python3.13/enum.py\", line 956, in _get_mixins_\n    raise TypeError(\"new enumerations should be created as \"\n            \"`EnumName([mixin_type, ...] [data_type,] enum_type)`\")\nTypeError: new enumerations should be created as `EnumName([mixin_type, ...] [data_type,] enum_type)`\n```\n\nThis also fails in the same way, and again, we emit no error:\n\n```py\nfrom enum import Enum\nfrom typing import Generic, TypeVar\n\nT = TypeVar(\"T\")\n\nclass Foo(Enum, Generic[T]):\n    X = list[T]()\n```\n\nThe only way you can get a \"generic enum\" to not immediately fail is by putting `Generic[T]` _first_ in the bases list (contrary to the usual recommendation that `Generic[T]` should always be the last base class). But even if you do this, things do not work at runtime in the way you'd expect -- it's illegal to specialize such a class at runtime, because `Generic.__class_getitem__` is totally clobbered by `EnumMeta.__getitem__`:\n\n```pytb\n>> from enum import Enum\n>>> from typing import Generic, TypeVar\n>>> T = TypeVar(\"T\")\n>>> class Foo(Generic[T], Enum):\n...     X = list[T]()\n...     \n>>> Foo[int]\nTraceback (most recent call last):\n  File \"<python-input-5>\", line 1, in <module>\n    Foo[int]\n    ~~~^^^^^\n  File \"/Users/alexw/.pyenv/versions/3.13.1/lib/python3.13/enum.py\", line 789, in __getitem__\n    return cls._member_map_[name]\n           ~~~~~~~~~~~~~~~~^^^^^^\nKeyError: <class 'int'>\n```\n\nAside from whether or not it works at runtime, the concept of a generic enum just isn't very coherent on a conceptual level anyway. We currently don't permit them to exist in our internal model, and mypy/pyrefly both emit diagnostics if a user tries to create one:\n- https://mypy-play.net/?mypy=latest&python=3.12&gist=35ef91038c460dd48cd557bb8704076d\n- https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEALqcROgOZ0Q3G6UN0BxGOhiUIAYwA0dACrMYANVSUAOujDV6wgK70uPPnQCi6XWrUy6AXlnyllABQqQM5wEpz6cVFRw4dADFcXAchETFxAG0ZAF1pE103RDU6VLp8RFk1EEkQbQZoOBJyRBAAYjoAVQKoCCY6MG0vAtx0OE9MGDAG3hpUBgB9UxpsUQcMznQGNzoAWgA%2BOjgGSmT0NLpKGAZtSnWwZwA5XVHVumB8AF9nbNyyLbAoUkIGWigKCoAFUgenpYwcAQ6OJWpA2Lt%2BhBWoQ1BUAMowGB0AAWDAYxDgiAA9Fj7l0noReGwscIsZhcOI4FiQeoIODKJDWliepQ6KgAG6oaCobCwYGgukQlrrXDEYVFNRkBjI1qzdmiOBQ9Y2ZwAZkIAEYAEw3dAgS65VDiArygLQGAUNBYPBEMj6oA\n\nWe should do the same as mypy/pyrefly here.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2416/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2415",
      "id": 3797017714,
      "node_id": "I_kwDOOje-Bs7iUeRy",
      "number": 2415,
      "title": "Flaky(?) `import from` completions in the playground when there are statements below",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568562675,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rnj8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/playground",
          "name": "playground",
          "color": "1C71A4",
          "default": false,
          "description": "A playground-specific issue"
        },
        "2": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 12,
      "created_at": "2026-01-09T13:48:37Z",
      "updated_at": "2026-01-09T21:28:37Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Consider the following video. `dataclasses` is never suggested as an import at the `from datacl<CURSOR>` location, and at the location `from dataclasses import data<CURSOR>`, the `dataclass` completion suggestion keeps flickering(?) on and off, so fast that I can never actually accept it.\n\nhttps://github.com/user-attachments/assets/7532bf77-cadc-4a51-b3f4-134648e0f1c1\n\nI don't remember coming across this before -- possibly a recent regression? No idea if this is a general issue or another playground-specific issue, I'm afraid :-)\n\nCc. @BurntSushi / @MichaReiser ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2415/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2411",
      "id": 3796195200,
      "node_id": "I_kwDOOje-Bs7iRVeA",
      "number": 2411,
      "title": "Semantic highlighting in stringified annotations",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2026-01-09T09:32:00Z",
      "updated_at": "2026-01-09T14:45:39Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": null,
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2411/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2408",
      "id": 3795521550,
      "node_id": "I_kwDOOje-Bs7iOxAO",
      "number": 2408,
      "title": "False negative with bound type variable",
      "user": {
        "login": "hauntsaninja",
        "id": 12621235,
        "node_id": "MDQ6VXNlcjEyNjIxMjM1",
        "avatar_url": "https://avatars.githubusercontent.com/u/12621235?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/hauntsaninja",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "2": {
          "id": 9597629813,
          "node_id": "LA_kwDOOje-Bs8AAAACPBA1dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/callables",
          "name": "callables",
          "color": "5d4406",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2026-01-09T05:22:31Z",
      "updated_at": "2026-01-09T20:48:05Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```python\nfrom typing import *\n\nclass Base: ...\n\nBaseT = TypeVar(\"BaseT\", bound=Base)\n\ndef f(x: Callable[[], BaseT]) -> BaseT:\n    return x()\n\nclass Unrelated: ...\n\ndef make_unrelated() -> Unrelated:\n    return Unrelated()\n\nf(Unrelated)  # should error\nf(make_unrelated)  # should error\n```\n\nI have a PR https://github.com/astral-sh/ruff/pull/19946 that solves this, but is not mergeable. Filing this as a way of tracking this false negative, in case my PR never makes it\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2408/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2404",
      "id": 3793926178,
      "node_id": "I_kwDOOje-Bs7iIrgi",
      "number": 2404,
      "title": "add dedicated support for attrs",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2026-01-08T18:23:54Z",
      "updated_at": "2026-01-08T18:23:54Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": null,
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2404/reactions",
        "total_count": 5,
        "+1": 5,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2403",
      "id": 3793917841,
      "node_id": "I_kwDOOje-Bs7iIpeR",
      "number": 2403,
      "title": "add dedicated support for pydantic",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2026-01-08T18:20:39Z",
      "updated_at": "2026-01-08T18:20:39Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 7,
        "completed": 1,
        "percent_completed": 14
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": null,
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2403/reactions",
        "total_count": 30,
        "+1": 30,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2402",
      "id": 3793895482,
      "node_id": "I_kwDOOje-Bs7iIkA6",
      "number": 2402,
      "title": "Stack overflow for recursive type",
      "user": {
        "login": "chebee7i",
        "id": 326005,
        "node_id": "MDQ6VXNlcjMyNjAwNQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/326005?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/chebee7i",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2026-01-08T18:13:33Z",
      "updated_at": "2026-01-09T15:37:53Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nMight be related to https://github.com/astral-sh/ty/issues/2360?\n\n```python\nfrom collections.abc import Mapping\nfrom typing import TypeAlias\n\ntype JSONScalar = str | int | float | bool | None\ntype JSONLike = JSONScalar | tuple['JSONLike', ...] | Mapping[str, 'JSONLike']\nJSONLikeAlt: TypeAlias = JSONScalar | tuple['JSONLikeAlt', ...] | Mapping[str, 'JSONLikeAlt']\n\n# Comment this function out to remove stack overflow.\ndef _normalize_broken(x: object) -> JSONLike:\n    # Intentionally crippled for bug report.\n    if isinstance(x, (list, tuple)):\n        return tuple(_normalize_broken(v) for v in x)\n    return str(x)\n\n\ndef _normalize_works(x: object) -> JSONLikeAlt:\n    # Intentionally crippled for bug report.\n    if isinstance(x, (list, tuple)):\n        return tuple(_normalize_works(v) for v in x)\n    return str(x)\n```\n\n```\n% pixi run ty --version\nty 0.0.10\n\n\n% pixi run ty check example.py\nthread '<unknown>' (3032748) has overflowed its stack\nfatal runtime error: stack overflow, aborting\n```\nUsing `TypeAlias` somehow avoids the issue.\n\n### Version\n\nty 0.0.10",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2402/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2401",
      "id": 3793884713,
      "node_id": "I_kwDOOje-Bs7iIhYp",
      "number": 2401,
      "title": "panic for incomplete except block",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2026-01-08T18:09:38Z",
      "updated_at": "2026-01-09T03:47:55Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "> [@AlexWaygood](https://github.com/AlexWaygood) saw a similar panic while typing in an `except` block.\n> \n> Yes, I also encountered that this panic, and is consistently reproducible in an `except` block. \n> \n> Minimal reproduction:\n> ```python\n> try:\n>     print()\n> except # Trigger completion/hover here\n> ```\n> \n> Error: panicked at crates/ty_python_semantic/src/semantic_model.rs:576:1 no entry found for keyquery stacktrace\n> \n> Hope this helps! \n\n _Originally posted by @nemowang2003 in [#2317](https://github.com/astral-sh/ty/issues/2317#issuecomment-3717402403)_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2401/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2400",
      "id": 3793768176,
      "node_id": "I_kwDOOje-Bs7iIE7w",
      "number": 2400,
      "title": "Hang/OOM on generic function wrapping a method with many overloads",
      "user": {
        "login": "jelle-openai",
        "id": 194148892,
        "node_id": "U_kgDOC5J6HA",
        "avatar_url": "https://avatars.githubusercontent.com/u/194148892?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jelle-openai",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        },
        "2": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2026-01-08T17:33:46Z",
      "updated_at": "2026-01-09T11:18:38Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nGiven this file:\n\n```python\n#!/usr/bin/env python3\n# /// script\n# requires-python = \">=3.12\"\n# dependencies = [\"githubkit\"]\n# ///\nfrom typing import Callable, ParamSpec, TypeVar\n\nfrom githubkit.webhooks import parse_obj\n\n\nP = ParamSpec(\"P\")\nR = TypeVar(\"R\", covariant=True)\n\n\ndef wrap_non_retryable(fn: Callable[P, R]) -> Callable[P, R]:\n    def _wrapped(*args: P.args, **kwargs: P.kwargs) -> R:\n        raise Exception\n\n    return _wrapped\n\n\nsafe_parse_obj = wrap_non_retryable(parse_obj)\n\n```\n\n`uvx ty check tybugoom.py` takes a huge amount of memory and never finishes (well, maybe I wasn't patient enough).\n\nI haven't tried to minimize away the third-party library, but parse_obj is at https://github.com/yanyongyu/githubkit/blob/daec39c41e7cc0e13924647bb061950ba4fa1b68/githubkit/webhooks/__init__.py#L12, it's a method from a class that's bound to a local variable.\n\n### Version\n\nty 0.0.10 (d18902cdc 2026-01-07)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2400/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2399",
      "id": 3793527326,
      "node_id": "I_kwDOOje-Bs7iHKIe",
      "number": 2399,
      "title": "imprecise inference for types.new_class() with `bases`",
      "user": {
        "login": "bcmills",
        "id": 5200974,
        "node_id": "MDQ6VXNlcjUyMDA5NzQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5200974?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/bcmills",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2026-01-08T16:18:32Z",
      "updated_at": "2026-01-08T23:48:58Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nhttps://play.ty.dev/c84dda0b-ff7b-4570-9baa-42cee056d0fd:\n```py\nfrom typing import Type\nfrom types import new_class\n\nclass Foo:\n    pass\n\ndef use_new_class() -> Type[Foo]:\n    return new_class(\n        \"NewFoo\",\n        bases=(Foo,),\n    )\n```\n\n`ty` reports:\n```\nReturn type does not match returned value: expected `type[Foo]`, found `type` (invalid-return-type) [Ln 8, Col 12]\n```\n\nI think that's erroneous: because `Foo` is in the `bases` passed to `new_class`, the returned class _is_ a subclass of `Foo`, so the actual return type is `Type[Foo]`, not _just_ `type`.\n\n### Version\n\nty 0.0.9",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2399/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2398",
      "id": 3793460633,
      "node_id": "I_kwDOOje-Bs7iG52Z",
      "number": 2398,
      "title": "Please support imports from zip",
      "user": {
        "login": "mitya57",
        "id": 1381584,
        "node_id": "MDQ6VXNlcjEzODE1ODQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1381584?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mitya57",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2026-01-08T15:59:52Z",
      "updated_at": "2026-01-08T16:09:29Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nPython has a feature of importing code from ZIP files.\n\nHere is a recipe where Python can successfully import `foo` module from `foo.zip`:\n```bash\ndmitry@l3:/tmp/playground$ mkdir foo\ndmitry@l3:/tmp/playground$ echo 'a = 42' > foo/__init__.py\ndmitry@l3:/tmp/playground$ zip foo.zip foo/__init__.py\n  adding: foo/__init__.py (stored 0%)\ndmitry@l3:/tmp/playground$ rm -rf foo\ndmitry@l3:/tmp/playground$ echo -e 'import foo\\nprint(foo.a)' > main.py\ndmitry@l3:/tmp/playground$ PYTHONPATH=./foo.zip python3 ./main.py \n42\n```\n\nHowever, with the same `PYTHONPATH`, ty fails to resolve this import:\n```bash\ndmitry@l3:/tmp/playground$ PYTHONPATH=./foo.zip ty check ./main.py \nerror[unresolved-import]: Cannot resolve imported module `foo`\n --> main.py:1:8\n  |\n1 | import foo\n  |        ^^^\n2 | print(foo.a)\n  |\ninfo: Searched in the following paths during module resolution:\ninfo:   1. /tmp/playground (first-party code)\ninfo:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)\ninfo: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment\ninfo: rule `unresolved-import` is enabled by default\n\nFound 1 diagnostic\n```\n\n### Version\n\nty 0.0.10",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2398/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2391",
      "id": 3791142934,
      "node_id": "I_kwDOOje-Bs7h-EAW",
      "number": 2391,
      "title": "Feat: support `collections.abc.<Class>.register`",
      "user": {
        "login": "NickCrews",
        "id": 10820686,
        "node_id": "MDQ6VXNlcjEwODIwNjg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/10820686?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/NickCrews",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2026-01-08T04:07:59Z",
      "updated_at": "2026-01-10T18:54:43Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is related to https://github.com/astral-sh/ty/issues/2390.\n\nI am working in the ibis project, trying to fix up its typing so that [it's `Schema` class](https://github.com/ibis-project/ibis/blob/e5921c9a851afc8fd3980f6a0bbfd73720b4d5d6/ibis/expr/schema.py#L25) typechecks against a `collections.abc.Mapping[str, ibis.DataType]`. It currently does not.\n\nThe root of the issue is that the [Schema](https://github.com/ibis-project/ibis/blob/e5921c9a851afc8fd3980f6a0bbfd73720b4d5d6/ibis/expr/schema.py#L25) class inherits from the [MapSet abstract class](https://github.com/ibis-project/ibis/blob/e5921c9a851afc8fd3980f6a0bbfd73720b4d5d6/ibis/common/collections.py#L157), which itself inherits from ibis's custom [Mapping ABC](https://github.com/ibis-project/ibis/blob/e5921c9a851afc8fd3980f6a0bbfd73720b4d5d6/ibis/common/collections.py#L119), which is effectively a re-implementation of `collections.abc.Mapping`. [The reason](https://github.com/ibis-project/ibis/blob/e5921c9a851afc8fd3980f6a0bbfd73720b4d5d6/ibis/common/collections.py#L20-L23) that we re-implement collections.abc is to avoid metaclass conflicts, and for faster isinstance checks.\n\nSee how we have the [`@collections.abc.Mapping.register` decorator on our `Mapping` class](https://github.com/ibis-project/ibis/blob/e5921c9a851afc8fd3980f6a0bbfd73720b4d5d6/ibis/common/collections.py#L118-L119)? This makes it so that at runtime, isinstance checks work. BUT, it appears that ty doesn't support this registration mechanism for any `collections.abc` classes, except for Sized for some reason. See this screenshot of the ibis source code, you can see how ty doesn't seem to recognize the .register() method of any of the other classes:\n\n<img width=\"513\" height=\"607\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/8aa000ca-4a7d-4841-ba9c-34011cd82b9c\" />\n\nFor a simpler reproducer, see this file:\n\n```python\nfrom __future__ import annotations\n\nfrom collections.abc import ItemsView, Iterable, Iterator, KeysView, Mapping, ValuesView\n\n\nclass MyMapping:  # noqa: PLW1641\n    def __len__(self) -> int:\n        return 2\n\n    def __getitem__(self, key: str, /) -> int:\n        if key == \"a\":\n            return 1\n        elif key == \"b\":\n            return 2\n        else:\n            raise KeyError(key)\n\n    def __iter__(self) -> Iterator[str]:\n        yield \"a\"\n        yield \"b\"\n\n    def __contains__(self, key: object, /) -> bool:\n        return key in (\"a\", \"b\")\n\n    def __eq__(self, other: object, /) -> bool:\n        if not isinstance(other, Mapping):\n            return False\n        return dict(self.items()) == dict(other.items())\n\n    def keys(self) -> KeysView[str]:\n        return {\"a\": 1, \"b\": 2}.keys()\n\n    def values(self) -> ValuesView[int]:\n        return {\"a\": 1, \"b\": 2}.values()\n\n    def items(self) -> ItemsView[str, int]:\n        return {\"a\": 1, \"b\": 2}.items()\n\n    def get(self, key: str, default: int | None = None, /) -> int | None:\n        try:\n            return self[key]\n        except KeyError:\n            return default\n\n\nclass MappingWithInheritance(MyMapping, Mapping[str, int]):\n    pass\n\n\n@Mapping.register  # ty:ignore[unresolved-attribute]\nclass MappingRegistered(MyMapping):\n    pass\n\n\ndef takes_iterable(it: Iterable[str]):\n    return it\n\n\ndef takes_mapping(m: Mapping[str, int]):\n    return m\n\n\n# MyMapping is not recognized as a Mapping by both ty and isinstance.\n# This is expected, as https://docs.python.org/3/library/collections.abc.html states,\n# \"Some simple interfaces are directly recognizable by the presence of the required methods.\"\n# \"Complex interfaces do not support this last technique because an interface is more than just the presence of method names.\"\nm = MyMapping()\ntakes_iterable(m)\ntakes_mapping(m)  # ty:ignore[invalid-argument-type]\nassert isinstance(m, Mapping) is False\n\n# As expected, MappingWithInheritance is recognized as a Mapping\n# by both ty and isinstance.\nmi = MappingWithInheritance()\ntakes_iterable(mi)\ntakes_mapping(mi)\nassert isinstance(mi, Mapping) is True\n\n# This is the weird one.\n# The isinstance check works at runtime, but ty does not recognize it as a Mapping.\nmr = MappingRegistered()\ntakes_iterable(mr)\ntakes_mapping(mr)  # ty:ignore[invalid-argument-type]\nassert isinstance(mr, Mapping) is True\n```\n\nCan you improve ty to work with the `.register()` mechanism?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2391/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2392",
      "id": 3791607475,
      "node_id": "I_kwDOOje-Bs7h_1az",
      "number": 2392,
      "title": "Allow an option to hide inlay hints for built-in functions",
      "user": {
        "login": "justinchuby",
        "id": 11205048,
        "node_id": "MDQ6VXNlcjExMjA1MDQ4",
        "avatar_url": "https://avatars.githubusercontent.com/u/11205048?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/justinchuby",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2026-01-08T02:59:38Z",
      "updated_at": "2026-01-09T01:12:21Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When `Call Argument Names` is on, calls like `enumerate()` or `str()` will have argument names displayed, which can make the source code noisy. It would be nice to have an option to selectively disable hints for built-in functions (and perhaps user specified packages).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2392/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2384",
      "id": 3790554406,
      "node_id": "I_kwDOOje-Bs7h70Um",
      "number": 2384,
      "title": "Support installation on CI (GitHub Actions)",
      "user": {
        "login": "amotl",
        "id": 453543,
        "node_id": "MDQ6VXNlcjQ1MzU0Mw==",
        "avatar_url": "https://avatars.githubusercontent.com/u/453543?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/amotl",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2026-01-07T22:21:41Z",
      "updated_at": "2026-01-07T22:48:54Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Hi. First things first: Thanks a stack for conceiving `ty`, and a happy new year!\n\nWe'd like to invoke `ty` in a traditional CI/GHA environment where we are not using `uv` yet. As such, the package and its dependencies are installed into the global system environment, because it's ephemeral anyway. Currently, `ty` doesn't find third-party modules, and we don't know how to configure it properly, because we don't know upfront where GHA (`actions/setup-python`) locates its Python environment.\n\n- https://github.com/crate/pytest-cratedb/actions/runs/20797404169/job/59734360168\n\nMaybe you know a good trick how to make `ty` work in this environment? We tried to configure [`env.pythonLocation`](https://github.com/actions/setup-python/blob/main/docs/advanced-usage.md#environment-variables), but it didn't work.\n\n```yaml\nenv:\n  VIRTUAL_ENV: ${{ env.pythonLocation }}\n```\n\n```\nty failed\n  Cause: Failed to discover local Python environment\n  Cause: Invalid `VIRTUAL_ENV` environment variable `/opt/hostedtoolcache/Python/3.14.2/x64`: points to a broken venv with no pyvenv.cfg file\n```\n\n#### References\n- GH-2068\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2384/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2383",
      "id": 3790510654,
      "node_id": "I_kwDOOje-Bs7h7po-",
      "number": 2383,
      "title": "Overload resolution fails to match through `ThreadPoolExecutor.submit()`",
      "user": {
        "login": "bcmills",
        "id": 5200974,
        "node_id": "MDQ6VXNlcjUyMDA5NzQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5200974?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/bcmills",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        },
        "1": {
          "id": 9597629813,
          "node_id": "LA_kwDOOje-Bs8AAAACPBA1dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/callables",
          "name": "callables",
          "color": "5d4406",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2026-01-07T22:06:46Z",
      "updated_at": "2026-01-08T19:35:26Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nhttps://play.ty.dev/00383569-b7bd-4b82-addd-1d9b11b03560:\n```py\nfrom typing import overload\nimport concurrent.futures\nimport time\n\nexecutor = concurrent.futures.ThreadPoolExecutor(max_workers=1)\n\n@overload\ndef print_time(now: float | None, /) -> None: ...\n\n@overload\ndef print_time(*, now: float | None = None) -> None: ...\n\ndef print_time(now: float | None = None):\n    if now is None:\n        now = time.time()\n    print(now)\n\nprint_time(now=42)\n\nexecutor.submit(print_time, now=42)\n```\n\n`ty` correctly allows the direct call to `print_time`, but erroneously rejects the one indirected through `executor.submit()`:\n```\nArgument to bound method `submit` is incorrect: Expected `Overload[(now: int | float | None, /) -> Unknown, (*, now: int | float | None = None) -> Unknown]`, found `Literal[42]` (invalid-argument-type) [Ln 20, Col 29]\n```\n\n### Version\n\nty 0.0.9",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2383/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2382",
      "id": 3790374705,
      "node_id": "I_kwDOOje-Bs7h7Icx",
      "number": 2382,
      "title": "Erroneous `invalid-argument-type` for generic contextmanager with ParamSpec",
      "user": {
        "login": "bcmills",
        "id": 5200974,
        "node_id": "MDQ6VXNlcjUyMDA5NzQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5200974?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/bcmills",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9597629813,
          "node_id": "LA_kwDOOje-Bs8AAAACPBA1dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/callables",
          "name": "callables",
          "color": "5d4406",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2026-01-07T21:13:37Z",
      "updated_at": "2026-01-09T10:11:42Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nFor this program, `ty` produces this error:\n```\nArgument is incorrect: Expected `(**_P@_inner) -> None`, found `(**_P@outer) -> None` (invalid-argument-type) [Ln 16, Col 13]\n```\n\nSince `_P@_inner` and `_P@outer` are the _same_ `_P` in the same parameter position, they are obviously compatible. It isn't clear to me why `ty` is treating them as somehow incompatible.\n\n---\n\nhttps://play.ty.dev/f8330b63-ba0f-455e-b11b-f67c3016be21:\n```py\nimport contextlib\nfrom collections.abc import Callable, Iterator\nfrom typing import ParamSpec\n\n_P = ParamSpec(\"_P\")\n\nclass Foo:\n    @contextlib.contextmanager\n    def outer(\n        self,\n        probe: Callable[_P, None],\n        *args: _P.args,\n        **kwargs: _P.kwargs,\n    ) -> Iterator[None]:\n        with self._inner(\n            probe=probe,\n        ):\n            yield\n    \n    @contextlib.contextmanager\n    def _inner(\n        self,\n        probe: Callable[_P, None],\n        *args: _P.args,\n        **kwargs: _P.kwargs,\n    ) -> Iterator[None]:\n        probe(*args, **kwargs)\n        yield\n```\n\n### Version\n\nty 0.0.9",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2382/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2378",
      "id": 3789363653,
      "node_id": "I_kwDOOje-Bs7h3RnF",
      "number": 2378,
      "title": "panic on Tauon's codebase",
      "user": {
        "login": "C0rn3j",
        "id": 1641362,
        "node_id": "MDQ6VXNlcjE2NDEzNjI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1641362?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/C0rn3j",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568528024,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlcmA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-info",
          "name": "needs-info",
          "color": "FBCA04",
          "default": false,
          "description": "More information is needed from the issue author"
        },
        "1": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2026-01-07T16:07:15Z",
      "updated_at": "2026-01-09T15:03:12Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n`Propagating panic for cycle head that panicked in an earlier execution in that revision`\n\n~~`ty` seems to give up inside of a monolithic function that spans... a lot of lines, and a lot of the definitions are `Never` from a certain point and hovering/clicking over them spams that error.~~\n\n~~Unsure if the `Never` business is related to the panic business, I was previously already advised that the codebase is way too complex as is.~~\n\nHovering over some variables sometimes spams the error above, or it just happens when scrolling the codebase.\n\nI can't seem to reproduce this with cli `ty`, which takes its time but works, just in the combination with the VSC extension.\n\nIt's Tauon's codebase that's triggering this - https://github.com/Taiko2k/Tauon - specifically src/tauon/t_modules/t_main.py \n\n### Version\n\nty 0.0.9 (f1652f05d 2026-01-05)\n\nRepro: Open `src/tauon/t_modules/t_main.py` in VSC, and start VSC anew. It seems that the panic is not a 100% guarantee, but it happens very often.\n\n```\n2026-01-07 17:17:15.715070957  INFO Version: 0.0.9 (f1652f05d 2026-01-05)\n2026-01-07 17:17:15.809072027  INFO Defaulting to python-platform `linux`\n2026-01-07 17:17:15.819507076  INFO Python version: Python 3.10, platform: linux\n2026-01-07 17:17:15.869556006  INFO Indexed 35 file(s) in 0.004s\n2026-01-07 17:17:25.560761314  WARN Propagating panic for cycle head that panicked in an earlier execution in that revision\n2026-01-07 17:17:25.685805348  WARN Propagating panic for cycle head that panicked in an earlier execution in that revision\n...\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2378/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2377",
      "id": 3789284397,
      "node_id": "I_kwDOOje-Bs7h2-Qt",
      "number": 2377,
      "title": "Cython support",
      "user": {
        "login": "sr0lle",
        "id": 111277375,
        "node_id": "U_kgDOBqH1Pw",
        "avatar_url": "https://avatars.githubusercontent.com/u/111277375?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sr0lle",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-01-07T15:44:08Z",
      "updated_at": "2026-01-08T15:24:11Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Just like [the related issue in the ruff repo](https://github.com/astral-sh/ruff/issues/10250), I wanted to ask if you all would consider adding support for [Cython](https://github.com/cython/cython). Writing Cython is a common way for Python developers to write high performance code that compares to C speeds by typing the code properly, without the need to write in two languages like similar projects C++ & nanbind/pybind or Rust & pyo3.\n\nUnfortunately, Cython doesn't have a proper linter or language server, as far as I know, making it quite challenging to write Cython code as projects grow. Since this issue is inside the ty repo, I'd like to focus on the latter point: having a language server like ty that also offers features like auto-completions for Cython would really enhance productivity.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2377/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2374",
      "id": 3787297334,
      "node_id": "I_kwDOOje-Bs7hvZI2",
      "number": 2374,
      "title": "`isinstance(..., dict)` and top materialization result in false positive on `.get()` call",
      "user": {
        "login": "yilei",
        "id": 581947,
        "node_id": "MDQ6VXNlcjU4MTk0Nw==",
        "avatar_url": "https://avatars.githubusercontent.com/u/581947?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/yilei",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2026-01-07T04:21:12Z",
      "updated_at": "2026-01-07T18:15:14Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nGiven the following code:\n\n```python\ndef foo(body: object) -> str | None:\n    if isinstance(body, dict):\n        value = body.get(\"key\")  # reveal_type(body) shows `Top[dict[Unknown, Unknown]]`\n        if isinstance(value, str):\n            return value\n    return None\n```\n\n`ty` reports:\n\n```\nerror[invalid-argument-type]: Argument to bound method `get` is incorrect\n --> isinstance_dict_narrowing.py:3:26\n  |\n1 | def foo(body: object) -> str | None:\n2 |     if isinstance(body, dict):\n3 |         value = body.get(\"key\")\n  |                          ^^^^^ Expected `Never`, found `Literal[\"key\"]`\n4 |         if isinstance(value, str):\n5 |             return value\n  |\ninfo: Matching overload defined here\n    --> stdlib/builtins.pyi:3015:9\n     |\n3013 |     # Positional-only in dict, but not in MutableMapping\n3014 |     @overload  # type: ignore[override]\n3015 |     def get(self, key: _KT, default: None = None, /) -> _VT | None:\n     |         ^^^       -------- Parameter declared here\n3016 |         \"\"\"Return the value for key if key is in the dictionary, else default.\"\"\"\n     |\ninfo: Non-matching overloads for bound method `get`:\ninfo:   (self, key: _KT@dict, default: _VT@dict, /) -> _VT@dict\ninfo:   (self, key: _KT@dict, default: _T@get, /) -> _VT@dict | _T@get\ninfo: rule `invalid-argument-type` is enabled by default\n```\n\nAfter reading https://github.com/astral-sh/ty/issues/456 and its implementation https://github.com/astral-sh/ruff/pull/20256, this seems to be working as designed? Top materialization means we can't call the `.get` method here since there is no type for the key would satisfy all possible dicts of any key type, thus the `Never` type. The ecosystem analysis result on https://github.com/astral-sh/ruff/pull/20256 also shows a few examples like the `theme_config` variable [here](https://github.com/mkdocs/mkdocs/blob/2862536793b3c67d9d83c33e0dd6d50a791928f8/mkdocs/config/config_options.py#L827).\n\nHowever, I couldn't wrap my head around this behavior. Is there a good or pedantic example that `ty` is catching real errors? And at least, could we add better diagnostics or documentation?\n\n(I also found the relevant open issue https://github.com/astral-sh/ty/issues/1130, but it's talking specifically about `TypedDict`.)\n\n### Version\n\nty 0.0.9 (f1652f05d 2026-01-05)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2374/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2366",
      "id": 3785404149,
      "node_id": "I_kwDOOje-Bs7hoK71",
      "number": 2366,
      "title": "Add option to limit auto-import completions to direct dependencies",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 8,
      "created_at": "2026-01-06T14:47:54Z",
      "updated_at": "2026-01-06T17:15:27Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This idea was offered here: https://github.com/astral-sh/ty/issues/2254#issuecomment-3703049537\n\nIt strikes me as a decent option to have. I don't know what's conventional in the Python ecosystem, but \"I only want to import things from dependencies I've directly added and not from transitive dependencies that I don't directly depend on\" seems reasonable.\n\nThis could be viewed as both a UX improvement (you're offered fewer completions that you don't care about) and as a perf improvement (we don't need to consider exported items from non-direct dependencies).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2366/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2365",
      "id": 3785011125,
      "node_id": "I_kwDOOje-Bs7hmq-1",
      "number": 2365,
      "title": "Completions for `[item.<CURSOR> for item in xs]` fail because of how the comprehension is parsed",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "BurntSushi",
          "id": 456674,
          "node_id": "MDQ6VXNlcjQ1NjY3NA==",
          "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/BurntSushi",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2026-01-06T12:38:58Z",
      "updated_at": "2026-01-06T13:06:46Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis video shows how the type of `item` in `[item.<CURSOR> for item in xs]` is not known, and that in turn is the cause for completions not working:\n\nhttps://github.com/user-attachments/assets/0d0b1ab5-c2a7-4e80-b639-0dd358857c68\n\nThe reason for why the type of `item` is not known seems likely related to how this [invalid comprehension is parsed](https://play.ty.dev/c6d74417-84cd-482f-80fe-95716636b902):\n\n```\nModModule {\n    node_index: NodeIndex(None),\n    range: 0..43,\n    body: [\n        AnnAssign(\n            StmtAnnAssign {\n                node_index: NodeIndex(\n                    1,\n                ),\n                range: 0..20,\n                target: Name(\n                    ExprName {\n                        node_index: NodeIndex(\n                            2,\n                        ),\n                        range: 0..2,\n                        id: Name(\"xs\"),\n                        ctx: Store,\n                    },\n                ),\n                annotation: Subscript(\n                    ExprSubscript {\n                        node_index: NodeIndex(\n                            4,\n                        ),\n                        range: 4..13,\n                        value: Name(\n                            ExprName {\n                                node_index: NodeIndex(\n                                    5,\n                                ),\n                                range: 4..8,\n                                id: Name(\"list\"),\n                                ctx: Load,\n                            },\n                        ),\n                        slice: Name(\n                            ExprName {\n                                node_index: NodeIndex(\n                                    6,\n                                ),\n                                range: 9..12,\n                                id: Name(\"str\"),\n                                ctx: Load,\n                            },\n                        ),\n                        ctx: Load,\n                    },\n                ),\n                value: Some(\n                    List(\n                        ExprList {\n                            node_index: NodeIndex(\n                                7,\n                            ),\n                            range: 16..20,\n                            elts: [\n                                StringLiteral(\n                                    ExprStringLiteral {\n                                        node_index: NodeIndex(\n                                            8,\n                                        ),\n                                        range: 17..19,\n                                        value: StringLiteralValue {\n                                            inner: Single(\n                                                StringLiteral {\n                                                    range: 17..19,\n                                                    node_index: NodeIndex(\n                                                        9,\n                                                    ),\n                                                    value: \"\",\n                                                    flags: StringLiteralFlags {\n                                                        quote_style: Double,\n                                                        prefix: Empty,\n                                                        triple_quoted: false,\n                                                        unclosed: false,\n                                                    },\n                                                },\n                                            ),\n                                        },\n                                    },\n                                ),\n                            ],\n                            ctx: Load,\n                        },\n                    ),\n                ),\n                simple: true,\n            },\n        ),\n        Expr(\n            StmtExpr {\n                node_index: NodeIndex(\n                    10,\n                ),\n                range: 21..43,\n                value: List(\n                    ExprList {\n                        node_index: NodeIndex(\n                            11,\n                        ),\n                        range: 21..43,\n                        elts: [\n                            Attribute(\n                                ExprAttribute {\n                                    node_index: NodeIndex(\n                                        12,\n                                    ),\n                                    range: 22..31,\n                                    value: Name(\n                                        ExprName {\n                                            node_index: NodeIndex(\n                                                13,\n                                            ),\n                                            range: 22..26,\n                                            id: Name(\"item\"),\n                                            ctx: Load,\n                                        },\n                                    ),\n                                    attr: Identifier {\n                                        id: Name(\"for\"),\n                                        range: 28..31,\n                                        node_index: NodeIndex(\n                                            14,\n                                        ),\n                                    },\n                                    ctx: Load,\n                                },\n                            ),\n                            Compare(\n                                ExprCompare {\n                                    node_index: NodeIndex(\n                                        15,\n                                    ),\n                                    range: 32..42,\n                                    left: Name(\n                                        ExprName {\n                                            node_index: NodeIndex(\n                                                16,\n                                            ),\n                                            range: 32..36,\n                                            id: Name(\"item\"),\n                                            ctx: Load,\n                                        },\n                                    ),\n                                    ops: [\n                                        In,\n                                    ],\n                                    comparators: [\n                                        Name(\n                                            ExprName {\n                                                node_index: NodeIndex(\n                                                    17,\n                                                ),\n                                                range: 40..42,\n                                                id: Name(\"xs\"),\n                                                ctx: Load,\n                                            },\n                                        ),\n                                    ],\n                                },\n                            ),\n                        ],\n                        ctx: Load,\n                    },\n                ),\n            },\n        ),\n    ],\n}\n```\n\nSpecifically, it seems to be parsed as a list.\n\nTo fix this, I think it would be a good idea to see if we can make this specific case parse as a comprehension.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2365/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2362",
      "id": 3784698080,
      "node_id": "I_kwDOOje-Bs7hlejg",
      "number": 2362,
      "title": "Find all references in VS Code extension does not find call sites",
      "user": {
        "login": "AdemFr",
        "id": 32066272,
        "node_id": "MDQ6VXNlcjMyMDY2Mjcy",
        "avatar_url": "https://avatars.githubusercontent.com/u/32066272?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AdemFr",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2026-01-06T10:46:07Z",
      "updated_at": "2026-01-08T13:10:42Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThanks for building Ty! Super excited about the project.\nI set up ty using the cursor / vs code extension for the language server.\n\nOne of the critical use cases for type hints etc for me is finding / renaming all references of variables and attributes reliably.\n\nThis does not seem to work when searching for references based on the method argument across different files, but works when searching based on the call site or within the same file.\n\n[Playground Link](https://play.ty.dev/9a3a5978-ecf8-4bd4-8a62-bd31a091bfa9)\n\nexample_rename.py\n```py\nfrom .example_rename_2 import ExampleClass\n\nif __name__ == \"__main__\":\n    instance = ExampleClass(old_name=\"test\")  # Find all references for old_name works here\n    result = instance.method(\"world\")\n\n```\n\nexample_rename_2.py\n```py\nclass ExampleClass:\n    def __init__(self, old_name: str) -> None:    # Find all references for old_name only finds usages within file\n        self.old_name = old_name\n\n    def method(self, old_name: str) -> str:\n        return f\"Hello {old_name}\"\n```\n\n\n<img width=\"772\" height=\"182\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/e034292e-b13a-40c3-98e5-88bed5e02fe9\" />\n\n<img width=\"732\" height=\"192\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/e75a1cc1-e025-43d6-98cf-4c252eeb06ff\" />\n\n<img width=\"2554\" height=\"366\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/6b74021a-2b36-4e44-916c-d0b2d4df069a\" />\n\n\n### Expected\nI would expect the same result, no matter where I search for references from. This also breaks renaming, when triggered from the class attribute, and will not rename call sites.\n\n### Version\n\n0.0.9",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2362/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2361",
      "id": 3784555660,
      "node_id": "I_kwDOOje-Bs7hk7yM",
      "number": 2361,
      "title": "Ability to set output format with an environment variable",
      "user": {
        "login": "robertodr",
        "id": 3708689,
        "node_id": "MDQ6VXNlcjM3MDg2ODk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3708689?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/robertodr",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2026-01-06T10:05:59Z",
      "updated_at": "2026-01-06T15:40:27Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It would be useful to set the output format with an environment variable, _i.e._ `TY_OUTPUT_FORMAT`. Ruff has a similar environment variable.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2361/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2360",
      "id": 3784518766,
      "node_id": "I_kwDOOje-Bs7hkyxu",
      "number": 2360,
      "title": "Stack overflow on generic type with forward reference",
      "user": {
        "login": "lsorber",
        "id": 4543654,
        "node_id": "MDQ6VXNlcjQ1NDM2NTQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4543654?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/lsorber",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        },
        "1": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        },
        "2": {
          "id": 9807383197,
          "node_id": "LA_kwDOOje-Bs8AAAACSJDKnQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20aliases",
          "name": "type aliases",
          "color": "ebd684",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "mtshiba",
          "id": 45118249,
          "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
          "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mtshiba",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2026-01-06T09:54:35Z",
      "updated_at": "2026-01-06T19:01:34Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nTy crashes on this MRE ([ty playground](https://play.ty.dev/eb5974ff-c7ff-4f32-b690-db1a992d134e)):\n```python\nfrom collections.abc import Iterable, Mapping\nfrom typing import Any\n\ntype AnyComponent = \"Component[Any]\"  # Ty does not crash without this forward reference\ntype Nested[T] = Iterable[Nested[T]] | Mapping[Any, Nested[T]]\n\n\nclass Component[T: Iterable[Nested[AnyComponent]] | Mapping[Any, Nested[AnyComponent]]]:\n    pass\n\n\ndict[str, list[AnyComponent]]().get(\"x\", [])\n```\n\nOutput:\n```\nthread '<unknown>' (17625271) has overflowed its stack\nfatal runtime error: stack overflow, aborting\n```\n\n### Version\n\n0.0.9",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2360/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2354",
      "id": 3784085660,
      "node_id": "I_kwDOOje-Bs7hjJCc",
      "number": 2354,
      "title": "VSCode extension: Renaming doesn't work sometimes (including ignoring used line ending style)",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 11,
      "created_at": "2026-01-06T07:32:06Z",
      "updated_at": "2026-01-10T02:19:30Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHopefully this is even reproducible, since beyond the video and the logs I'm having a very hard time even describing what's happening.\n\nTo reproduce:\n1. Make a python file and open it in VSCode.\nFor example in powershell,\n   ```\n   PS D:\\python_projects\\ty_issues> echo @\"\n   x = 1\n   x = 2\n   # test\n   \"@ > main.py\n   PS D:\\python_projects\\ty_issues> code main.py\n   ```\n2. Restart the server by going to the extensions tab, pressing \"Disable\" then \"Restart Extensions\", then \"Enable\" quickly. Or sometimes using the `ty: Restart Server` command. Or sometimes on restarting VSCode. Or sometimes it doesn't happen.\n\nty is now in an extremely confused state on that open `main.py` file. For example you can now rename numbers even though that shouldn't work:\n\n<img width=\"256\" height=\"97\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/4d824c45-ecab-4855-a273-87d3954b30bf\" />\n\nAdditionally, if the End of Line sequence is set to CRLF, renaming the `x`s in the file will cause all newlines around them to start doubling, so it looks like in this state ty fails to figure out what the line ending mode is.\n\nAs for why I'm encountering this so much, currently I'm constantly switching between basedpyright and ty in VSC, so that I can compare how they both handle my code. This means I restart both language servers fairly often, and so have run into this bug a few times while trying to rename things.\n\nVideo of me triggering the cursed renaming (sorry for very scuffed quality, my computer is dying so I can't record in higher resolutions)\nhttps://youtu.be/3DVj_0Z4ND4\n\n<details>\n<summary>ty Logs</summary>\n\n```\n2026-01-05 23:16:39.412 [info] Name: ty\n2026-01-05 23:16:39.412 [info] Module: ty\n2026-01-05 23:16:39.412 [info] Python extension loading\n2026-01-05 23:16:39.412 [info] Waiting for interpreter from python extension.\n2026-01-05 23:16:39.412 [info] Python extension loaded\n2026-01-05 23:16:39.412 [info] Using interpreter: c:\\Users\\GiGaGon\\AppData\\Roaming\\uv\\python\\cpython-3.14.0-windows-x86_64-none\\python.exe\n2026-01-05 23:16:39.413 [info] Initialization options: {\n    \"logLevel\": \"trace\"\n}\n2026-01-05 23:16:39.593 [info] Falling back to bundled executable: c:\\Users\\GiGaGon\\.vscode-oss\\extensions\\astral-sh.ty-2026.0.0-win32-x64\\bundled\\libs\\bin\\ty.exe\n2026-01-05 23:16:39.599 [info] Found executable at c:\\Users\\GiGaGon\\.vscode-oss\\extensions\\astral-sh.ty-2026.0.0-win32-x64\\bundled\\libs\\bin\\ty.exe\n2026-01-05 23:16:39.600 [info] Server run command: c:\\Users\\GiGaGon\\.vscode-oss\\extensions\\astral-sh.ty-2026.0.0-win32-x64\\bundled\\libs\\bin\\ty.exe server\n2026-01-05 23:16:39.601 [info] Server: Start requested.\n2026-01-05 23:16:39.639 [info] ty server version: 0.0.9 (f1652f05d 2026-01-05)\n2026-01-05 23:17:25.941 [info] Server: Stop requested\n2026-01-05 23:17:25.945 [info] Using interpreter: c:\\Users\\GiGaGon\\AppData\\Roaming\\uv\\python\\cpython-3.14.0-windows-x86_64-none\\python.exe\n2026-01-05 23:17:25.945 [info] Initialization options: {\n    \"logLevel\": \"trace\"\n}\n2026-01-05 23:17:26.129 [info] Falling back to bundled executable: c:\\Users\\GiGaGon\\.vscode-oss\\extensions\\astral-sh.ty-2026.0.0-win32-x64\\bundled\\libs\\bin\\ty.exe\n2026-01-05 23:17:26.129 [info] Found executable at c:\\Users\\GiGaGon\\.vscode-oss\\extensions\\astral-sh.ty-2026.0.0-win32-x64\\bundled\\libs\\bin\\ty.exe\n2026-01-05 23:17:26.129 [info] Server run command: c:\\Users\\GiGaGon\\.vscode-oss\\extensions\\astral-sh.ty-2026.0.0-win32-x64\\bundled\\libs\\bin\\ty.exe server\n2026-01-05 23:17:26.130 [info] Server: Start requested.\n2026-01-05 23:17:26.158 [info] ty server version: 0.0.9 (f1652f05d 2026-01-05)\n2026-01-05 23:17:38.959 [info] Name: ty\n2026-01-05 23:17:38.959 [info] Module: ty\n2026-01-05 23:17:38.959 [info] Python extension loading\n2026-01-05 23:17:38.959 [info] Waiting for interpreter from python extension.\n2026-01-05 23:17:38.959 [info] Python extension loaded\n2026-01-05 23:17:38.959 [info] Using interpreter: c:\\Users\\GiGaGon\\AppData\\Roaming\\uv\\python\\cpython-3.14.0-windows-x86_64-none\\python.exe\n2026-01-05 23:17:38.959 [info] Initialization options: {\n    \"logLevel\": \"trace\"\n}\n2026-01-05 23:17:39.226 [info] Falling back to bundled executable: c:\\Users\\GiGaGon\\.vscode-oss\\extensions\\astral-sh.ty-2026.0.0-win32-x64\\bundled\\libs\\bin\\ty.exe\n2026-01-05 23:17:39.232 [info] Found executable at c:\\Users\\GiGaGon\\.vscode-oss\\extensions\\astral-sh.ty-2026.0.0-win32-x64\\bundled\\libs\\bin\\ty.exe\n2026-01-05 23:17:39.232 [info] Server run command: c:\\Users\\GiGaGon\\.vscode-oss\\extensions\\astral-sh.ty-2026.0.0-win32-x64\\bundled\\libs\\bin\\ty.exe server\n2026-01-05 23:17:39.233 [info] Server: Start requested.\n2026-01-05 23:17:39.270 [info] ty server version: 0.0.9 (f1652f05d 2026-01-05)\n\n```\n\n</details>\n\n<details>\n<summary>ty Language Server Logs</summary>\n\n```\n2026-01-05 23:17:39.267230400 DEBUG main ty_server::server: Initialization options: InitializationOptions {\n    log_level: Some(\n        Trace,\n    ),\n    log_file: None,\n    options: ClientOptions {\n        global: GlobalOptions {\n            diagnostic_mode: None,\n            experimental: None,\n            show_syntax_errors: None,\n        },\n        workspace: WorkspaceOptions {\n            configuration: None,\n            configuration_file: None,\n            disable_language_services: None,\n            inlay_hints: None,\n            completions: None,\n            python_extension: None,\n        },\n        unknown: {},\n    },\n}\n2026-01-05 23:17:39.268020700 DEBUG main ty_server::server: Resolved client capabilities: [\"WORKSPACE_DIAGNOSTIC_REFRESH\", \"INLAY_HINT_REFRESH\", \"PULL_DIAGNOSTICS\", \"TYPE_DEFINITION_LINK_SUPPORT\", \"DEFINITION_LINK_SUPPORT\", \"DECLARATION_LINK_SUPPORT\", \"PREFER_MARKDOWN_IN_HOVER\", \"SIGNATURE_LABEL_OFFSET_SUPPORT\", \"SIGNATURE_ACTIVE_PARAMETER_SUPPORT\", \"HIERARCHICAL_DOCUMENT_SYMBOL_SUPPORT\", \"WORK_DONE_PROGRESS\", \"FILE_WATCHER_SUPPORT\", \"RELATIVE_FILE_WATCHER_SUPPORT\", \"DIAGNOSTIC_DYNAMIC_REGISTRATION\", \"WORKSPACE_CONFIGURATION\", \"COMPLETION_ITEM_LABEL_DETAILS_SUPPORT\", \"DIAGNOSTIC_RELATED_INFORMATION\", \"PREFER_MARKDOWN_IN_COMPLETION\"]\n2026-01-05 23:17:39.268042600  INFO main ty_server::server: Version: 0.0.9 (f1652f05d 2026-01-05)\n2026-01-05 23:17:39.271374500  WARN main ty_server::server: No workspace(s) were provided during initialization. Using the current working directory from the fallback system as a default workspace: c:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\n2026-01-05 23:17:39.271577300 DEBUG ty:main ty_server::server::main_loop: Requesting workspace configuration for workspaces\n2026-01-05 23:17:39.277698300 DEBUG ty:main ty_server::session: Deferring `textDocument/didOpen` notification until all workspaces are initialized\n2026-01-05 23:17:39.279799400 DEBUG ty:main client_response{id=0 method=\"workspace/configuration\"}: ty_server::server::main_loop: Received workspace configurations, initializing workspaces\n2026-01-05 23:17:39.279866100 DEBUG ty:main ty_server::session: Initializing workspace `file:///C:/Users/GiGaGon/AppData/Local/Programs/VSCodium`: WorkspaceOptions {\n    configuration: None,\n    configuration_file: None,\n    disable_language_services: Some(\n        false,\n    ),\n    inlay_hints: Some(\n        InlayHintOptions {\n            variable_types: Some(\n                true,\n            ),\n            call_argument_names: Some(\n                true,\n            ),\n        },\n    ),\n    completions: Some(\n        CompletionOptions {\n            auto_import: Some(\n                true,\n            ),\n        },\n    ),\n    python_extension: Some(\n        PythonExtension {\n            active_environment: Some(\n                ActiveEnvironment {\n                    executable: PythonExecutable {\n                        uri: Url {\n                            scheme: \"file\",\n                            cannot_be_a_base: false,\n                            username: \"\",\n                            password: None,\n                            host: None,\n                            port: None,\n                            path: \"/c%3A/Users/GiGaGon/AppData/Roaming/uv/python/cpython-3.14.0-windows-x86_64-none/python.exe\",\n                            query: None,\n                            fragment: None,\n                        },\n                        sys_prefix: \"C:\\\\Users\\\\GiGaGon\\\\AppData\\\\Roaming\\\\uv\\\\python\\\\cpython-3.14.0-windows-x86_64-none\",\n                    },\n                    environment: None,\n                    version: Some(\n                        EnvironmentVersion {\n                            major: 3,\n                            minor: 14,\n                            patch: 0,\n                            sys_version: \"3.14.0 (main, Oct 28 2025, 12:05:23) [MSC v.1944 64 bit (AMD64)]\",\n                        },\n                    ),\n                },\n            ),\n        },\n    ),\n}\n2026-01-05 23:17:39.279925600 DEBUG ty:main ty_server::session::options: Using the Python environment selected in your editor in case the configuration doesn't specify a Python environment: C:\\Users\\GiGaGon\\AppData\\Roaming\\uv\\python\\cpython-3.14.0-windows-x86_64-none\n2026-01-05 23:17:39.279934300 DEBUG ty:main ty_server::session::options: Using the Python version selected in your editor: 3.14 in case the configuration doesn't specify a Python version\n2026-01-05 23:17:39.280010800 DEBUG ty:main ty_project::metadata: Searching for a project in 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium'\n2026-01-05 23:17:39.280496300 DEBUG ty:main ty_project::metadata: The ancestor directories contain no `pyproject.toml`. Falling back to a virtual project.\n2026-01-05 23:17:39.280515700 DEBUG ty:main ty_project::metadata::configuration_file: Searching for a user-level configuration at `C:\\Users\\GiGaGon\\AppData\\Roaming\\ty\\ty.toml`\n2026-01-05 23:17:39.282059400  INFO ty:main ty_project::metadata::options: Defaulting to python-platform `win32`\n2026-01-05 23:17:39.282389300 DEBUG ty:main ty_python_semantic::site_packages: Attempting to parse virtual environment metadata at 'C:\\Users\\GiGaGon\\AppData\\Roaming\\uv\\python\\cpython-3.14.0-windows-x86_64-none\\pyvenv.cfg'\n2026-01-05 23:17:39.282458000 DEBUG ty:main ty_python_semantic::site_packages: Searching for site-packages directory in sys.prefix C:\\Users\\GiGaGon\\AppData\\Roaming\\uv\\python\\cpython-3.14.0-windows-x86_64-none\n2026-01-05 23:17:39.282528500 DEBUG ty:main ty_python_semantic::site_packages: Resolved site-packages directories for this environment are: [\"C:\\\\Users\\\\GiGaGon\\\\AppData\\\\Roaming\\\\uv\\\\python\\\\cpython-3.14.0-windows-x86_64-none\\\\Lib\\\\site-packages\"]\n2026-01-05 23:17:39.282545700 DEBUG ty:main ty_python_semantic::site_packages: Searching for real stdlib directory in sys.prefix C:\\Users\\GiGaGon\\AppData\\Roaming\\uv\\python\\cpython-3.14.0-windows-x86_64-none\n2026-01-05 23:17:39.282617400 DEBUG ty:main ty_python_semantic::site_packages: Resolved real stdlib directory for this environment is: \"C:\\\\Users\\\\GiGaGon\\\\AppData\\\\Roaming\\\\uv\\\\python\\\\cpython-3.14.0-windows-x86_64-none\\\\Lib\"\n2026-01-05 23:17:39.282738500 DEBUG ty:main ty_project::metadata::options: Including `.` in `environment.root`\n2026-01-05 23:17:39.282805500 DEBUG ty:main ty_module_resolver::resolve: Adding first-party search path `C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium`\n2026-01-05 23:17:39.282880400 DEBUG ty:main ty_module_resolver::resolve: Using vendored stdlib\n2026-01-05 23:17:39.283307100 DEBUG ty:main ty_module_resolver::resolve: Adding site-packages search path `C:\\Users\\GiGaGon\\AppData\\Roaming\\uv\\python\\cpython-3.14.0-windows-x86_64-none\\Lib\\site-packages`\n2026-01-05 23:17:39.283393700  INFO ty:main ty_project::metadata::options: Python version: Python 3.14, platform: win32\n2026-01-05 23:17:39.283426700 DEBUG ty:main ruff_db::files::file_root: Adding new file root 'C:\\Users\\GiGaGon\\AppData\\Roaming\\uv\\python\\cpython-3.14.0-windows-x86_64-none\\Lib\\site-packages' of kind LibrarySearchPath\n2026-01-05 23:17:39.283679600 DEBUG ty:main ruff_db::files::file_root: Adding new file root 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium' of kind Project\n2026-01-05 23:17:39.283717900 DEBUG ty:main ty_server::session: Registering diagnostic capability with OpenFilesOnly diagnostic mode\n2026-01-05 23:17:39.283743100 DEBUG ty:main ty_module_resolver::resolve: Resolving dynamic module resolution paths\n2026-01-05 23:17:39.283899700 DEBUG ty:main ty_server::server::main_loop: Processing deferred notification `textDocument/didOpen`\n2026-01-05 23:17:39.283965900 DEBUG ty:main notification{method=\"textDocument/didOpen\"}: ty_project: Opening file `d:\\python_projects\\ty_issues\\main.py`\n2026-01-05 23:17:39.283975000 DEBUG ty:main notification{method=\"textDocument/didOpen\"}: ty_project: Take open project files\n2026-01-05 23:17:39.284009300 DEBUG ty:main notification{method=\"textDocument/didOpen\"}:set_open_files{open_files={file(Id(1000))}}: ty_project: Set open project files (count: 1)\n2026-01-05 23:17:39.287123100 DEBUG ty:main client_response{id=1 method=\"client/registerCapability\"}: ty_server::session: Registered dynamic capabilities\n2026-01-05 23:17:39.291365600 DEBUG ThreadId(28) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\node_modules' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.294695400 DEBUG ThreadId(36) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\references-view\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.294918500 DEBUG ThreadId(30) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\git\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.295245100 DEBUG ThreadId(38) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\json-language-features\\server\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.295839700 DEBUG ThreadId(35) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\php-language-features\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.296037500 DEBUG ThreadId(37) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\gulp\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.296376900 DEBUG ThreadId(38) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\json-language-features\\client\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.296495200 DEBUG ThreadId(29) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\css-language-features\\server\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.297011100 DEBUG ThreadId(37) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\grunt\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.297138200 DEBUG ThreadId(28) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\typescript-language-features\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.297768400 DEBUG ThreadId(27) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\terminal-suggest\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.298085800 DEBUG ThreadId(33) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\microsoft-authentication\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.298122300 DEBUG ThreadId(29) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\css-language-features\\client\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.298128900 DEBUG ThreadId(30) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\extension-editing\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.298807200 DEBUG ThreadId(33) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\mermaid-chat-features\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.299528000 DEBUG ThreadId(34) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\node_modules' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.299777400 DEBUG ThreadId(37) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\github-authentication\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.300142900 DEBUG ThreadId(28) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\tunnel-forwarding\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.300180300 DEBUG ThreadId(36) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\github\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.300439100 DEBUG ThreadId(27) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\simple-browser\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.300584800 DEBUG ThreadId(33) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\merge-conflict\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.300642700 DEBUG ThreadId(37) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\jake\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.300720700 DEBUG ThreadId(35) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\npm\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.301123800 DEBUG ThreadId(30) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\emmet\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.301188300 DEBUG ThreadId(38) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\search-result\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.301542100 DEBUG ThreadId(34) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\git-base\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.302063700 DEBUG ThreadId(36) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\html-language-features\\server\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.302640700 DEBUG ThreadId(34) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\html-language-features\\client\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.302853900 DEBUG ThreadId(37) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\ipynb\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.303067200 DEBUG ThreadId(33) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\media-preview\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.303951300 DEBUG ThreadId(37) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\configuration-editing\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.304123800 DEBUG ThreadId(27) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\debug-server-ready\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.304706900 DEBUG ThreadId(32) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\markdown-math\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.304800400 DEBUG ThreadId(38) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\debug-auto-launch\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.305104500 DEBUG ThreadId(31) ty_project::walk: Skipping directory 'C:\\Users\\GiGaGon\\AppData\\Local\\Programs\\VSCodium\\resources\\app\\extensions\\markdown-language-features\\dist' because it is excluded by a default or `src.exclude` pattern\n2026-01-05 23:17:39.309983700  INFO ty:worker:1 request{id=1 method=\"textDocument/diagnostic\"}:check_file{file=File(System(\"d:\\\\python_projects\\\\ty_issues\\\\main.py\"))}:Project::index_files{project=VSCodium}: ty_project: Indexed 0 file(s) in 0.022s\n2026-01-05 23:17:39.310043400 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/diagnostic\" response.id=1 duration=22.56ms\n2026-01-05 23:17:39.515928100 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/diagnostic\" response.id=2 duration=93.00µs\n2026-01-05 23:17:39.591973400 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/codeAction\" response.id=3 duration=106.10µs\n2026-01-05 23:17:39.592193500 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/documentSymbol\" response.id=4 duration=152.00µs\n2026-01-05 23:17:39.626765800 DEBUG ty:worker:1 request{id=5 method=\"textDocument/inlayHint\"}: ty_server::server::api::requests::inlay_hints: Inlay hint request returned 0 hints in 21.8µs\n2026-01-05 23:17:39.626866600 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/inlayHint\" response.id=5 duration=172.60µs\n2026-01-05 23:17:39.654108400 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/semanticTokens/full\" response.id=6 duration=12.41ms\n2026-01-05 23:17:39.693326000 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/documentHighlight\" response.id=7 duration=6.14ms\n2026-01-05 23:17:39.843376500 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/codeAction\" response.id=8 duration=61.60µs\n2026-01-05 23:17:39.886118100 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/documentSymbol\" response.id=9 duration=107.50µs\n2026-01-05 23:17:40.296745200 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/documentSymbol\" response.id=10 duration=87.50µs\n2026-01-05 23:17:40.297068800 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/codeAction\" response.id=11 duration=36.80µs\n2026-01-05 23:17:40.600412000 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/documentSymbol\" response.id=12 duration=93.30µs\n2026-01-05 23:17:48.833777300 DEBUG     ty:main notification{method=\"textDocument/didChange\"}:apply_changes: ruff_db::files: Updating the revision of `d:\\python_projects\\ty_issues\\main.py`\n2026-01-05 23:17:48.834079800 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/diagnostic\" response.id=13 duration=61.30µs\n2026-01-05 23:17:48.860370200 DEBUG ty:worker:0 request{id=14 method=\"textDocument/inlayHint\"}: ty_server::server::api::requests::inlay_hints: Inlay hint request returned 0 hints in 43.4µs\n2026-01-05 23:17:48.860411000 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/inlayHint\" response.id=14 duration=126.30µs\n2026-01-05 23:17:49.140538400 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/semanticTokens/full\" response.id=15 duration=200.00µs\n2026-01-05 23:17:49.200734000 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/documentSymbol\" response.id=16 duration=102.60µs\n2026-01-05 23:17:49.425629200 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/documentSymbol\" response.id=17 duration=72.60µs\n2026-01-05 23:17:49.637815900 DEBUG ty:worker:0 request{id=18 method=\"textDocument/inlayHint\"}: ty_server::server::api::requests::inlay_hints: Inlay hint request returned 0 hints in 11.7µs\n2026-01-05 23:17:49.637853100 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/inlayHint\" response.id=18 duration=93.30µs\n2026-01-05 23:20:03.271658500 DEBUG     ty:main ty_server::server::main_loop: method=\"textDocument/diagnostic\" response.id=19 duration=101.10µs\n```\n\n</details>\n\n<details>\n<summary>ty Language Server Trace Logs</summary>\n\n```\n[Trace - 11:17:39 PM] Sending request 'initialize - (0)'.\nParams: {\n    \"processId\": 130868,\n    \"clientInfo\": {\n        \"name\": \"VSCodium\",\n        \"version\": \"1.107.1\"\n    },\n    \"locale\": \"en\",\n    \"rootPath\": null,\n    \"rootUri\": null,\n    \"capabilities\": {\n        \"workspace\": {\n            \"applyEdit\": true,\n            \"workspaceEdit\": {\n                \"documentChanges\": true,\n                \"resourceOperations\": [\n                    \"create\",\n                    \"rename\",\n                    \"delete\"\n                ],\n                \"failureHandling\": \"textOnlyTransactional\",\n                \"normalizesLineEndings\": true,\n                \"changeAnnotationSupport\": {\n                    \"groupsOnLabel\": true\n                }\n            },\n            \"configuration\": true,\n            \"didChangeWatchedFiles\": {\n                \"dynamicRegistration\": true,\n                \"relativePatternSupport\": true\n            },\n            \"symbol\": {\n                \"dynamicRegistration\": true,\n                \"symbolKind\": {\n                    \"valueSet\": [\n                        1,\n                        2,\n                        3,\n                        4,\n                        5,\n                        6,\n                        7,\n                        8,\n                        9,\n                        10,\n                        11,\n                        12,\n                        13,\n                        14,\n                        15,\n                        16,\n                        17,\n                        18,\n                        19,\n                        20,\n                        21,\n                        22,\n                        23,\n                        24,\n                        25,\n                        26\n                    ]\n                },\n                \"tagSupport\": {\n                    \"valueSet\": [\n                        1\n                    ]\n                },\n                \"resolveSupport\": {\n                    \"properties\": [\n                        \"location.range\"\n                    ]\n                }\n            },\n            \"codeLens\": {\n                \"refreshSupport\": true\n            },\n            \"executeCommand\": {\n                \"dynamicRegistration\": true\n            },\n            \"didChangeConfiguration\": {\n                \"dynamicRegistration\": true\n            },\n            \"workspaceFolders\": true,\n            \"foldingRange\": {\n                \"refreshSupport\": true\n            },\n            \"semanticTokens\": {\n                \"refreshSupport\": true\n            },\n            \"fileOperations\": {\n                \"dynamicRegistration\": true,\n                \"didCreate\": true,\n                \"didRename\": true,\n                \"didDelete\": true,\n                \"willCreate\": true,\n                \"willRename\": true,\n                \"willDelete\": true\n            },\n            \"inlineValue\": {\n                \"refreshSupport\": true\n            },\n            \"inlayHint\": {\n                \"refreshSupport\": true\n            },\n            \"diagnostics\": {\n                \"refreshSupport\": true\n            }\n        },\n        \"textDocument\": {\n            \"publishDiagnostics\": {\n                \"relatedInformation\": true,\n                \"versionSupport\": false,\n                \"tagSupport\": {\n                    \"valueSet\": [\n                        1,\n                        2\n                    ]\n                },\n                \"codeDescriptionSupport\": true,\n                \"dataSupport\": true\n            },\n            \"synchronization\": {\n                \"dynamicRegistration\": true,\n                \"willSave\": true,\n                \"willSaveWaitUntil\": true,\n                \"didSave\": true\n            },\n            \"completion\": {\n                \"dynamicRegistration\": true,\n                \"contextSupport\": true,\n                \"completionItem\": {\n                    \"snippetSupport\": true,\n                    \"commitCharactersSupport\": true,\n                    \"documentationFormat\": [\n                        \"markdown\",\n                        \"plaintext\"\n                    ],\n                    \"deprecatedSupport\": true,\n                    \"preselectSupport\": true,\n                    \"tagSupport\": {\n                        \"valueSet\": [\n                            1\n                        ]\n                    },\n                    \"insertReplaceSupport\": true,\n                    \"resolveSupport\": {\n                        \"properties\": [\n                            \"documentation\",\n                            \"detail\",\n                            \"additionalTextEdits\"\n                        ]\n                    },\n                    \"insertTextModeSupport\": {\n                        \"valueSet\": [\n                            1,\n                            2\n                        ]\n                    },\n                    \"labelDetailsSupport\": true\n                },\n                \"insertTextMode\": 2,\n                \"completionItemKind\": {\n                    \"valueSet\": [\n                        1,\n                        2,\n                        3,\n                        4,\n                        5,\n                        6,\n                        7,\n                        8,\n                        9,\n                        10,\n                        11,\n                        12,\n                        13,\n                        14,\n                        15,\n                        16,\n                        17,\n                        18,\n                        19,\n                        20,\n                        21,\n                        22,\n                        23,\n                        24,\n                        25\n                    ]\n                },\n                \"completionList\": {\n                    \"itemDefaults\": [\n                        \"commitCharacters\",\n                        \"editRange\",\n                        \"insertTextFormat\",\n                        \"insertTextMode\",\n                        \"data\"\n                    ]\n                }\n            },\n            \"hover\": {\n                \"dynamicRegistration\": true,\n                \"contentFormat\": [\n                    \"markdown\",\n                    \"plaintext\"\n                ]\n            },\n            \"signatureHelp\": {\n                \"dynamicRegistration\": true,\n                \"signatureInformation\": {\n                    \"documentationFormat\": [\n                        \"markdown\",\n                        \"plaintext\"\n                    ],\n                    \"parameterInformation\": {\n                        \"labelOffsetSupport\": true\n                    },\n                    \"activeParameterSupport\": true\n                },\n                \"contextSupport\": true\n            },\n            \"definition\": {\n                \"dynamicRegistration\": true,\n                \"linkSupport\": true\n            },\n            \"references\": {\n                \"dynamicRegistration\": true\n            },\n            \"documentHighlight\": {\n                \"dynamicRegistration\": true\n            },\n            \"documentSymbol\": {\n                \"dynamicRegistration\": true,\n                \"symbolKind\": {\n                    \"valueSet\": [\n                        1,\n                        2,\n                        3,\n                        4,\n                        5,\n                        6,\n                        7,\n                        8,\n                        9,\n                        10,\n                        11,\n                        12,\n                        13,\n                        14,\n                        15,\n                        16,\n                        17,\n                        18,\n                        19,\n                        20,\n                        21,\n                        22,\n                        23,\n                        24,\n                        25,\n                        26\n                    ]\n                },\n                \"hierarchicalDocumentSymbolSupport\": true,\n                \"tagSupport\": {\n                    \"valueSet\": [\n                        1\n                    ]\n                },\n                \"labelSupport\": true\n            },\n            \"codeAction\": {\n                \"dynamicRegistration\": true,\n                \"isPreferredSupport\": true,\n                \"disabledSupport\": true,\n                \"dataSupport\": true,\n                \"resolveSupport\": {\n                    \"properties\": [\n                        \"edit\"\n                    ]\n                },\n                \"codeActionLiteralSupport\": {\n                    \"codeActionKind\": {\n                        \"valueSet\": [\n                            \"\",\n                            \"quickfix\",\n                            \"refactor\",\n                            \"refactor.extract\",\n                            \"refactor.inline\",\n                            \"refactor.rewrite\",\n                            \"source\",\n                            \"source.organizeImports\"\n                        ]\n                    }\n                },\n                \"honorsChangeAnnotations\": true\n            },\n            \"codeLens\": {\n                \"dynamicRegistration\": true\n            },\n            \"formatting\": {\n                \"dynamicRegistration\": true\n            },\n            \"rangeFormatting\": {\n                \"dynamicRegistration\": true,\n                \"rangesSupport\": true\n            },\n            \"onTypeFormatting\": {\n                \"dynamicRegistration\": true\n            },\n            \"rename\": {\n                \"dynamicRegistration\": true,\n                \"prepareSupport\": true,\n                \"prepareSupportDefaultBehavior\": 1,\n                \"honorsChangeAnnotations\": true\n            },\n            \"documentLink\": {\n                \"dynamicRegistration\": true,\n                \"tooltipSupport\": true\n            },\n            \"typeDefinition\": {\n                \"dynamicRegistration\": true,\n                \"linkSupport\": true\n            },\n            \"implementation\": {\n                \"dynamicRegistration\": true,\n                \"linkSupport\": true\n            },\n            \"colorProvider\": {\n                \"dynamicRegistration\": true\n            },\n            \"foldingRange\": {\n                \"dynamicRegistration\": true,\n                \"rangeLimit\": 5000,\n                \"lineFoldingOnly\": true,\n                \"foldingRangeKind\": {\n                    \"valueSet\": [\n                        \"comment\",\n                        \"imports\",\n                        \"region\"\n                    ]\n                },\n                \"foldingRange\": {\n                    \"collapsedText\": false\n                }\n            },\n            \"declaration\": {\n                \"dynamicRegistration\": true,\n                \"linkSupport\": true\n            },\n            \"selectionRange\": {\n                \"dynamicRegistration\": true\n            },\n            \"callHierarchy\": {\n                \"dynamicRegistration\": true\n            },\n            \"semanticTokens\": {\n                \"dynamicRegistration\": true,\n                \"tokenTypes\": [\n                    \"namespace\",\n                    \"type\",\n                    \"class\",\n                    \"enum\",\n                    \"interface\",\n                    \"struct\",\n                    \"typeParameter\",\n                    \"parameter\",\n                    \"variable\",\n                    \"property\",\n                    \"enumMember\",\n                    \"event\",\n                    \"function\",\n                    \"method\",\n                    \"macro\",\n                    \"keyword\",\n                    \"modifier\",\n                    \"comment\",\n                    \"string\",\n                    \"number\",\n                    \"regexp\",\n                    \"operator\",\n                    \"decorator\"\n                ],\n                \"tokenModifiers\": [\n                    \"declaration\",\n                    \"definition\",\n                    \"readonly\",\n                    \"static\",\n                    \"deprecated\",\n                    \"abstract\",\n                    \"async\",\n                    \"modification\",\n                    \"documentation\",\n                    \"defaultLibrary\"\n                ],\n                \"formats\": [\n                    \"relative\"\n                ],\n                \"requests\": {\n                    \"range\": true,\n                    \"full\": {\n                        \"delta\": true\n                    }\n                },\n                \"multilineTokenSupport\": false,\n                \"overlappingTokenSupport\": false,\n                \"serverCancelSupport\": true,\n                \"augmentsSyntaxTokens\": true\n            },\n            \"linkedEditingRange\": {\n                \"dynamicRegistration\": true\n            },\n            \"typeHierarchy\": {\n                \"dynamicRegistration\": true\n            },\n            \"inlineValue\": {\n                \"dynamicRegistration\": true\n            },\n            \"inlayHint\": {\n                \"dynamicRegistration\": true,\n                \"resolveSupport\": {\n                    \"properties\": [\n                        \"tooltip\",\n                        \"textEdits\",\n                        \"label.tooltip\",\n                        \"label.location\",\n                        \"label.command\"\n                    ]\n                }\n            },\n            \"diagnostic\": {\n                \"dynamicRegistration\": true,\n                \"relatedDocumentSupport\": false\n            }\n        },\n        \"window\": {\n            \"showMessage\": {\n                \"messageActionItem\": {\n                    \"additionalPropertiesSupport\": true\n                }\n            },\n            \"showDocument\": {\n                \"support\": true\n            },\n            \"workDoneProgress\": true\n        },\n        \"general\": {\n            \"staleRequestSupport\": {\n                \"cancel\": true,\n                \"retryOnContentModified\": [\n                    \"textDocument/semanticTokens/full\",\n                    \"textDocument/semanticTokens/range\",\n                    \"textDocument/semanticTokens/full/delta\"\n                ]\n            },\n            \"regularExpressions\": {\n                \"engine\": \"ECMAScript\",\n                \"version\": \"ES2020\"\n            },\n            \"markdown\": {\n                \"parser\": \"marked\",\n                \"version\": \"1.1.0\"\n            },\n            \"positionEncodings\": [\n                \"utf-16\"\n            ]\n        },\n        \"notebookDocument\": {\n            \"synchronization\": {\n                \"dynamicRegistration\": true,\n                \"executionSummarySupport\": true\n            }\n        }\n    },\n    \"initializationOptions\": {\n        \"logLevel\": \"trace\"\n    },\n    \"trace\": \"verbose\",\n    \"workspaceFolders\": null\n}\n\n\n[Trace - 11:17:39 PM] Received response 'initialize - (0)' in 9ms.\nResult: {\n    \"capabilities\": {\n        \"codeActionProvider\": {\n            \"codeActionKinds\": [\n                \"quickfix\"\n            ]\n        },\n        \"completionProvider\": {\n            \"triggerCharacters\": [\n                \".\"\n            ]\n        },\n        \"declarationProvider\": true,\n        \"definitionProvider\": true,\n        \"documentHighlightProvider\": true,\n        \"documentSymbolProvider\": true,\n        \"executeCommandProvider\": {\n            \"commands\": [\n                \"ty.printDebugInformation\"\n            ],\n            \"workDoneProgress\": false\n        },\n        \"hoverProvider\": true,\n        \"inlayHintProvider\": {},\n        \"notebookDocumentSync\": {\n            \"notebookSelector\": [\n                {\n                    \"cells\": [\n                        {\n                            \"language\": \"python\"\n                        }\n                    ]\n                }\n            ],\n            \"save\": false\n        },\n        \"positionEncoding\": \"utf-16\",\n        \"referencesProvider\": true,\n        \"renameProvider\": {\n            \"prepareProvider\": true\n        },\n        \"selectionRangeProvider\": true,\n        \"semanticTokensProvider\": {\n            \"full\": true,\n            \"legend\": {\n                \"tokenModifiers\": [\n                    \"definition\",\n                    \"readonly\",\n                    \"async\",\n                    \"documentation\"\n                ],\n                \"tokenTypes\": [\n                    \"namespace\",\n                    \"class\",\n                    \"parameter\",\n                    \"selfParameter\",\n                    \"clsParameter\",\n                    \"variable\",\n                    \"property\",\n                    \"function\",\n                    \"method\",\n                    \"keyword\",\n                    \"string\",\n                    \"number\",\n                    \"decorator\",\n                    \"builtinConstant\",\n                    \"typeParameter\"\n                ]\n            },\n            \"range\": true\n        },\n        \"signatureHelpProvider\": {\n            \"retriggerCharacters\": [\n                \")\"\n            ],\n            \"triggerCharacters\": [\n                \"(\",\n                \",\"\n            ]\n        },\n        \"textDocumentSync\": {\n            \"change\": 2,\n            \"openClose\": true\n        },\n        \"typeDefinitionProvider\": true,\n        \"workspaceSymbolProvider\": true\n    },\n    \"serverInfo\": {\n        \"name\": \"ty\",\n        \"version\": \"0.0.9 (f1652f05d 2026-01-05)\"\n    }\n}\n\n\n[Trace - 11:17:39 PM] Sending notification 'initialized'.\nParams: {}\n\n\n[Trace - 11:17:39 PM] Sending notification 'textDocument/didOpen'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\",\n        \"languageId\": \"python\",\n        \"version\": 5,\n        \"text\": \"a = 1\\r\\n\\r\\na = 1\"\n    }\n}\n\n\n[Trace - 11:17:39 PM] Received request 'workspace/configuration - (0)'.\nParams: {\n    \"items\": [\n        {\n            \"scopeUri\": \"file:///C:/Users/GiGaGon/AppData/Local/Programs/VSCodium\",\n            \"section\": \"ty\"\n        }\n    ]\n}\n\n\n[Trace - 11:17:39 PM] Sending response 'workspace/configuration - (0)'. Processing request took 1ms\nResult: [\n    {\n        \"configuration\": null,\n        \"configurationFile\": null,\n        \"disableLanguageServices\": false,\n        \"diagnosticMode\": \"openFilesOnly\",\n        \"showSyntaxErrors\": true,\n        \"inlayHints\": {\n            \"variableTypes\": true,\n            \"callArgumentNames\": true\n        },\n        \"completions\": {\n            \"autoImport\": true\n        },\n        \"pythonExtension\": {\n            \"activeEnvironment\": {\n                \"version\": {\n                    \"major\": 3,\n                    \"minor\": 14,\n                    \"patch\": 0,\n                    \"sysVersion\": \"3.14.0 (main, Oct 28 2025, 12:05:23) [MSC v.1944 64 bit (AMD64)]\"\n                },\n                \"environment\": null,\n                \"executable\": {\n                    \"uri\": \"file:///c%3A/Users/GiGaGon/AppData/Roaming/uv/python/cpython-3.14.0-windows-x86_64-none/python.exe\",\n                    \"sysPrefix\": \"C:\\\\Users\\\\GiGaGon\\\\AppData\\\\Roaming\\\\uv\\\\python\\\\cpython-3.14.0-windows-x86_64-none\"\n                }\n            }\n        }\n    }\n]\n\n\n[Trace - 11:17:39 PM] Received request 'client/registerCapability - (1)'.\nParams: {\n    \"registrations\": [\n        {\n            \"id\": \"ty/textDocument/diagnostic\",\n            \"method\": \"textDocument/diagnostic\",\n            \"registerOptions\": {\n                \"documentSelector\": null,\n                \"identifier\": \"ty\",\n                \"interFileDependencies\": true,\n                \"workDoneProgress\": false,\n                \"workspaceDiagnostics\": false\n            }\n        },\n        {\n            \"id\": \"ty/workspace/didChangeWatchedFiles\",\n            \"method\": \"workspace/didChangeWatchedFiles\",\n            \"registerOptions\": {\n                \"watchers\": [\n                    {\n                        \"globPattern\": {\n                            \"baseUri\": \"file:///C:/Users/GiGaGon/AppData/Local/Programs/VSCodium\",\n                            \"pattern\": \"**\"\n                        },\n                        \"kind\": 7\n                    },\n                    {\n                        \"globPattern\": {\n                            \"baseUri\": \"file:///C:/Users/GiGaGon/AppData/Roaming/uv/python/cpython-3.14.0-windows-x86_64-none/Lib/site-packages\",\n                            \"pattern\": \"**\"\n                        },\n                        \"kind\": 7\n                    }\n                ]\n            }\n        }\n    ]\n}\n\n\n[Trace - 11:17:39 PM] Sending response 'client/registerCapability - (1)'. Processing request took 2ms\nNo result returned.\n\n\n[Trace - 11:17:39 PM] Sending request 'textDocument/diagnostic - (1)'.\nParams: {\n    \"identifier\": \"ty\",\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:17:39 PM] Received response 'textDocument/diagnostic - (1)' in 24ms.\nResult: {\n    \"items\": [],\n    \"kind\": \"full\"\n}\n\n\n[Trace - 11:17:39 PM] Sending request 'textDocument/diagnostic - (2)'.\nParams: {\n    \"identifier\": \"ty\",\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:17:39 PM] Received response 'textDocument/diagnostic - (2)' in 1ms.\nResult: {\n    \"items\": [],\n    \"kind\": \"full\"\n}\n\n\n[Trace - 11:17:39 PM] Sending request 'textDocument/codeAction - (3)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    },\n    \"range\": {\n        \"start\": {\n            \"line\": 0,\n            \"character\": 0\n        },\n        \"end\": {\n            \"line\": 0,\n            \"character\": 0\n        }\n    },\n    \"context\": {\n        \"diagnostics\": [],\n        \"triggerKind\": 2\n    }\n}\n\n\n[Trace - 11:17:39 PM] Sending request 'textDocument/documentSymbol - (4)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:17:39 PM] Received response 'textDocument/codeAction - (3)' in 10ms.\nNo result returned.\n\n\n[Trace - 11:17:39 PM] Received response 'textDocument/documentSymbol - (4)' in 7ms.\nResult: [\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"a\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        }\n    },\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"a\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 2\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 2\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 2\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 2\n            }\n        }\n    }\n]\n\n\n[Trace - 11:17:39 PM] Sending request 'textDocument/inlayHint - (5)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    },\n    \"range\": {\n        \"start\": {\n            \"line\": 0,\n            \"character\": 0\n        },\n        \"end\": {\n            \"line\": 2,\n            \"character\": 5\n        }\n    }\n}\n\n\n[Trace - 11:17:39 PM] Received response 'textDocument/inlayHint - (5)' in 2ms.\nResult: []\n\n\n[Trace - 11:17:39 PM] Sending request 'textDocument/semanticTokens/full - (6)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:17:39 PM] Received response 'textDocument/semanticTokens/full - (6)' in 15ms.\nResult: {\n    \"data\": [\n        0,\n        0,\n        1,\n        5,\n        1,\n        0,\n        4,\n        1,\n        11,\n        0,\n        2,\n        0,\n        1,\n        5,\n        1,\n        0,\n        4,\n        1,\n        11,\n        0\n    ]\n}\n\n\n[Trace - 11:17:39 PM] Sending request 'textDocument/documentHighlight - (7)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    },\n    \"position\": {\n        \"line\": 0,\n        \"character\": 1\n    }\n}\n\n\n[Trace - 11:17:39 PM] Received response 'textDocument/documentHighlight - (7)' in 9ms.\nResult: [\n    {\n        \"kind\": 3,\n        \"range\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        }\n    },\n    {\n        \"kind\": 3,\n        \"range\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 2\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 2\n            }\n        }\n    }\n]\n\n\n[Trace - 11:17:39 PM] Sending request 'textDocument/codeAction - (8)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    },\n    \"range\": {\n        \"start\": {\n            \"line\": 0,\n            \"character\": 1\n        },\n        \"end\": {\n            \"line\": 0,\n            \"character\": 1\n        }\n    },\n    \"context\": {\n        \"diagnostics\": [],\n        \"triggerKind\": 2\n    }\n}\n\n\n[Trace - 11:17:39 PM] Received response 'textDocument/codeAction - (8)' in 0ms.\nNo result returned.\n\n\n[Trace - 11:17:39 PM] Sending request 'textDocument/documentSymbol - (9)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:17:39 PM] Received response 'textDocument/documentSymbol - (9)' in 1ms.\nResult: [\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"a\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        }\n    },\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"a\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 2\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 2\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 2\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 2\n            }\n        }\n    }\n]\n\n\n[Trace - 11:17:40 PM] Sending request 'textDocument/documentSymbol - (10)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:17:40 PM] Sending request 'textDocument/codeAction - (11)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    },\n    \"range\": {\n        \"start\": {\n            \"line\": 0,\n            \"character\": 1\n        },\n        \"end\": {\n            \"line\": 0,\n            \"character\": 1\n        }\n    },\n    \"context\": {\n        \"diagnostics\": [],\n        \"triggerKind\": 2\n    }\n}\n\n\n[Trace - 11:17:40 PM] Received response 'textDocument/documentSymbol - (10)' in 2ms.\nResult: [\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"a\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        }\n    },\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"a\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 2\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 2\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 2\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 2\n            }\n        }\n    }\n]\n\n\n[Trace - 11:17:40 PM] Received response 'textDocument/codeAction - (11)' in 1ms.\nNo result returned.\n\n\n[Trace - 11:17:40 PM] Sending request 'textDocument/documentSymbol - (12)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:17:40 PM] Received response 'textDocument/documentSymbol - (12)' in 0ms.\nResult: [\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"a\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        }\n    },\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"a\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 2\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 2\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 2\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 2\n            }\n        }\n    }\n]\n\n\n[Trace - 11:17:48 PM] Sending notification 'textDocument/didChange'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\",\n        \"version\": 6\n    },\n    \"contentChanges\": [\n        {\n            \"range\": {\n                \"start\": {\n                    \"line\": 2,\n                    \"character\": 0\n                },\n                \"end\": {\n                    \"line\": 2,\n                    \"character\": 1\n                }\n            },\n            \"rangeLength\": 1,\n            \"text\": \"b\"\n        },\n        {\n            \"range\": {\n                \"start\": {\n                    \"line\": 1,\n                    \"character\": 0\n                },\n                \"end\": {\n                    \"line\": 1,\n                    \"character\": 0\n                }\n            },\n            \"rangeLength\": 0,\n            \"text\": \"\\r\\n\"\n        },\n        {\n            \"range\": {\n                \"start\": {\n                    \"line\": 0,\n                    \"character\": 5\n                },\n                \"end\": {\n                    \"line\": 0,\n                    \"character\": 5\n                }\n            },\n            \"rangeLength\": 0,\n            \"text\": \"\\r\\n\"\n        },\n        {\n            \"range\": {\n                \"start\": {\n                    \"line\": 0,\n                    \"character\": 0\n                },\n                \"end\": {\n                    \"line\": 0,\n                    \"character\": 1\n                }\n            },\n            \"rangeLength\": 1,\n            \"text\": \"b\"\n        }\n    ]\n}\n\n\n[Trace - 11:17:48 PM] Sending request 'textDocument/diagnostic - (13)'.\nParams: {\n    \"identifier\": \"ty\",\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:17:48 PM] Received response 'textDocument/diagnostic - (13)' in 1ms.\nResult: {\n    \"items\": [],\n    \"kind\": \"full\"\n}\n\n\n[Trace - 11:17:48 PM] Sending request 'textDocument/inlayHint - (14)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    },\n    \"range\": {\n        \"start\": {\n            \"line\": 0,\n            \"character\": 0\n        },\n        \"end\": {\n            \"line\": 4,\n            \"character\": 5\n        }\n    }\n}\n\n\n[Trace - 11:17:48 PM] Received response 'textDocument/inlayHint - (14)' in 0ms.\nResult: []\n\n\n[Trace - 11:17:49 PM] Sending request 'textDocument/semanticTokens/full - (15)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:17:49 PM] Received response 'textDocument/semanticTokens/full - (15)' in 0ms.\nResult: {\n    \"data\": [\n        0,\n        0,\n        1,\n        5,\n        1,\n        0,\n        4,\n        1,\n        11,\n        0,\n        4,\n        0,\n        1,\n        5,\n        1,\n        0,\n        4,\n        1,\n        11,\n        0\n    ]\n}\n\n\n[Trace - 11:17:49 PM] Sending request 'textDocument/documentSymbol - (16)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:17:49 PM] Received response 'textDocument/documentSymbol - (16)' in 1ms.\nResult: [\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"b\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        }\n    },\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"b\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 4\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 4\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 4\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 4\n            }\n        }\n    }\n]\n\n\n[Trace - 11:17:49 PM] Sending request 'textDocument/documentSymbol - (17)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:17:49 PM] Received response 'textDocument/documentSymbol - (17)' in 0ms.\nResult: [\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"b\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 0\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 0\n            }\n        }\n    },\n    {\n        \"children\": [],\n        \"kind\": 13,\n        \"name\": \"b\",\n        \"range\": {\n            \"end\": {\n                \"character\": 5,\n                \"line\": 4\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 4\n            }\n        },\n        \"selectionRange\": {\n            \"end\": {\n                \"character\": 1,\n                \"line\": 4\n            },\n            \"start\": {\n                \"character\": 0,\n                \"line\": 4\n            }\n        }\n    }\n]\n\n\n[Trace - 11:17:49 PM] Sending request 'textDocument/inlayHint - (18)'.\nParams: {\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    },\n    \"range\": {\n        \"start\": {\n            \"line\": 0,\n            \"character\": 0\n        },\n        \"end\": {\n            \"line\": 4,\n            \"character\": 5\n        }\n    }\n}\n\n\n[Trace - 11:17:49 PM] Received response 'textDocument/inlayHint - (18)' in 1ms.\nResult: []\n\n\n[Trace - 11:20:03 PM] Sending request 'textDocument/diagnostic - (19)'.\nParams: {\n    \"identifier\": \"ty\",\n    \"textDocument\": {\n        \"uri\": \"file:///d%3A/python_projects/ty_issues/main.py\"\n    }\n}\n\n\n[Trace - 11:20:03 PM] Received response 'textDocument/diagnostic - (19)' in 1ms.\nResult: {\n    \"items\": [],\n    \"kind\": \"full\"\n}\n```\n\n</details>\n\n### Version\n\nty 0.0.9 VSCode Version 2026.0.0",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2354/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2351",
      "id": 3782294307,
      "node_id": "I_kwDOOje-Bs7hcTsj",
      "number": 2351,
      "title": "How to correctly type generic await_if_awaitable",
      "user": {
        "login": "ThomasPinna",
        "id": 6748737,
        "node_id": "MDQ6VXNlcjY3NDg3Mzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6748737?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ThomasPinna",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2026-01-05T17:30:21Z",
      "updated_at": "2026-01-06T09:48:25Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nIn my code, I sometimes support both sync and async callbacks. For this, I typically use a util \"await_if_awaitable\". I would like to correctly type it with ty (but I have no clue how)\n\nthis is the source code\n\n```python\nasync def await_if_awaitable[T](\n    func: Callable[[], Awaitable[T]] | Callable[[], T]\n) -> T:\n    maybe_awaitable: Awaitable[T] | T = func()\n    if isinstance(maybe_awaitable, Awaitable):\n        return await maybe_awaitable\n    return maybe_awaitable\n\n```\n\nIn the `if` statement, `ty` correctly deduces that maybe_awaitable could be `Awaitable[T]` or `T & Awaitable[object]` (I first thought I encountered a bug). However, after trying many things it feels like an unsolvable issue in this correct mode (there is no way I can ensure whether something complies to `T`, right?)\n\n[playground link](https://play.ty.dev/ee0151ae-cfec-4482-9d6d-340774078bb0)\n\n\n### Version\n\n4712503c6",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2351/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2345",
      "id": 3781845446,
      "node_id": "I_kwDOOje-Bs7hamHG",
      "number": 2345,
      "title": "ty is unable to infer the type of sqlalchemy hybrid properties",
      "user": {
        "login": "iyad-f",
        "id": 128908811,
        "node_id": "U_kgDOB67-Cw",
        "avatar_url": "https://avatars.githubusercontent.com/u/128908811?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/iyad-f",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2026-01-05T15:12:59Z",
      "updated_at": "2026-01-05T23:06:01Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nmcve\n```py\nfrom sqlalchemy.ext.hybrid import hybrid_property\nfrom sqlalchemy.orm import DeclarativeBase\n\n\nclass Base(DeclarativeBase): ...\n\n\nclass Model(Base):\n    @hybrid_property\n    def foo(self) -> bool:\n        return True\n\n\nx = Model()\nx.foo  # type inferred by ty = Unkown, expected type = bool\n```\n\n### Version\n\n0.0.8",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2345/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2344",
      "id": 3781822139,
      "node_id": "I_kwDOOje-Bs7haga7",
      "number": 2344,
      "title": "Incorrect type inference for asynccontextmanager's yielding Self",
      "user": {
        "login": "iyad-f",
        "id": 128908811,
        "node_id": "U_kgDOB67-Cw",
        "avatar_url": "https://avatars.githubusercontent.com/u/128908811?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/iyad-f",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 9597629813,
          "node_id": "LA_kwDOOje-Bs8AAAACPBA1dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/callables",
          "name": "callables",
          "color": "5d4406",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2026-01-05T15:05:37Z",
      "updated_at": "2026-01-09T16:42:43Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nasync context managers which yield Self are being inferred as yielding None\n\nmcve\n```py\nfrom collections.abc import AsyncIterator\nfrom contextlib import asynccontextmanager\nfrom typing import Self\n\n\nclass Foo:\n    @classmethod\n    @asynccontextmanager\n    async def new(cls) -> AsyncIterator[Self]:\n        yield cls()\n\n\nasync def test() -> None:\n    async with Foo.new() as foo:  # type inferred by ty = None, expected type = Foo\n        ...\n```\nIt inferes correctly if the type yielded by the asynccontextmanager is not self, so for example if the new asyncocntextmanger  would yield int or str it inferes that correctly \n\n### Version\n\n0.0.8",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2344/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2341",
      "id": 3781281067,
      "node_id": "I_kwDOOje-Bs7hYcUr",
      "number": 2341,
      "title": "(property tests) ABCMeta and `type[type]` can fail `all_fully_static_type_pairs_are_subtype_of_their_union` invariant",
      "user": {
        "login": "github-actions[bot]",
        "id": 41898282,
        "node_id": "MDM6Qm90NDE4OTgyODI=",
        "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/github-actions%5Bbot%5D",
        "type": "Bot",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2026-01-05T12:12:50Z",
      "updated_at": "2026-01-06T00:58:57Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Run listed here: https://github.com/astral-sh/ty/actions/runs/20714754042",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2341/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2336",
      "id": 3780487790,
      "node_id": "I_kwDOOje-Bs7hVapu",
      "number": 2336,
      "title": "decorator that uses paramspec breaks generics on decorated function",
      "user": {
        "login": "DetachHead",
        "id": 57028336,
        "node_id": "MDQ6VXNlcjU3MDI4MzM2",
        "avatar_url": "https://avatars.githubusercontent.com/u/57028336?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/DetachHead",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 9597629813,
          "node_id": "LA_kwDOOje-Bs8AAAACPBA1dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/callables",
          "name": "callables",
          "color": "5d4406",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2026-01-05T07:38:32Z",
      "updated_at": "2026-01-07T09:58:09Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nfrom collections.abc import Callable\n\ndef fn[**P, T](value: Callable[P, T]) ->  Callable[P, T]:\n    return value\n\n@fn  # errors go away when this decorator is removed\ndef foo[T](value: T) -> T:\n    return value\n\na: int = foo(1) # errors\n```\n```\nObject of type `T@foo` is not assignable to `int` (invalid-assignment) [Ln 10, Col 10]\nArgument is incorrect: Expected `T@foo`, found `Literal[1]` (invalid-argument-type) [Ln 10, Col 14]\n```\nhttps://play.ty.dev/a7e1e83f-6c64-4c50-bf7d-fc7e32fccee8\n\n### Version\n\nty 0.0.8 (aa7559db8 2025-12-29)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2336/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2324",
      "id": 3779813534,
      "node_id": "I_kwDOOje-Bs7hS2Ce",
      "number": 2324,
      "title": "[panic] Interaction between the `__call__` method, decoraters, callable annotations, and self referential return types on 3.14",
      "user": {
        "login": "eliasbenb",
        "id": 54410649,
        "node_id": "MDQ6VXNlcjU0NDEwNjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/54410649?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/eliasbenb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568522560,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlHQA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/great-writeup",
          "name": "great-writeup",
          "color": "c2e0c6",
          "default": false,
          "description": "A wonderful example of a quality contribution"
        },
        "1": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2026-01-05T00:29:10Z",
      "updated_at": "2026-01-09T13:44:47Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "A panic occurs when a class's `__call__` method is annotated to return a union containing multiple `Callable` types and the class's own type, and that method is used as a decorator. The issue appears to be specific to `__call__`; equivalent annotations on other methods do not reproduce the problem.\n\nAlthough this may be related to #256, the interaction here seems pretty unique from my (inexperienced) perspective.\n\n**Context:**\n\nI encountered this issue while using the [`limiter`](https://github.com/alexdelorenzo/limiter) package, specifically when instantiating and calling the [`Limiter` class](https://github.com/alexdelorenzo/limiter/blob/bb46cd45341907b63779b1d33188f96c92b57769/limiter/limiter.py#L94-L101) as a decorator.\n\nAfter reducing the problem, I was able to reproduce the panic with a minimal example that does not depend on `limiter` itself.\n\n**Minimal Reproduction:**\n\nPlayground link: [https://play.ty.dev/a96aa4cb-45b9-469c-b846-0e113939d774](https://play.ty.dev/a96aa4cb-45b9-469c-b846-0e113939d774)\n\n```py\nfrom collections.abc import Callable\n\n\nclass SomeWrapper:\n    # Must return the union of at least two callables\n    # Must return self type in the union\n    # Must be a class method or instance method, but not a static method (of course)\n    # Must be the __call__ method (I tried `some_func`, `__some_func__`, `__enter__`, etc., no other method triggers the issue)\n    def __call__(self, fn) -> Callable | Callable[[int], int] | SomeWrapper:\n        raise NotImplementedError\n\n\n@SomeWrapper().__call__  # Instantiate and call\ndef some_fn():\n    raise NotImplementedError\n```\n\nFrom testing and reduction, all of the following appear to be required:\n\n1. The method must be named `__call__`: other method names I tested (`some_func`, `__enter__`, `__some_func__`, etc.) do not trigger the issue.\n2. The method must be an instance or class method: static methods do not reproduce the behavior.\n3. The return annotation must be a `Union` that includes: at least two `Callable` types, and the enclosing class type (self).\n4. The method must be used as a decorator (`@SomeWrapper().__call__`)\n\nRemoving any one of these conditions prevented the panic during my testing.\n\n**Observations:**\n\nEven though I'm no expert (or ameteur :p) on the internals of ty, the `__call__` method being a requirement seems interesting/unexpected here - I'd look into that first (in conjunction with the decorator usage requirement).\n\n**Logs:**\n\n<details>\n  <summary>Panic trace (ran against above snippet)</summary>\n\n  ```\n  $ RUST_BACKTRACE=1 ty check ./test.py \n  error[panic]: Panicked at /root/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/ce80691/src/function/execute.rs:321:21 when checking `/workspaces/anibridge/test.py`: `BoundMethodType < 'db >::into_callable_type_(Id(a801)): execute: too many cycle iterations`\n  info: This indicates a bug in ty.\n  info: If you could open an issue at https://github.com/astral-sh/ty/issues/new?title=%5Bpanic%5D, we'd be very appreciative!\n  info: Platform: linux x86_64\n  info: Version: 0.0.8\n  info: Args: [\"ty\", \"check\", \"./test.py\"]\n  info: Backtrace:\n     0: <unknown>\n     1: <unknown>\n     2: <unknown>\n     3: <unknown>\n     4: <unknown>\n     5: <unknown>\n     6: <unknown>\n     7: <unknown>\n     8: <unknown>\n     9: <unknown>\n    10: <unknown>\n    11: <unknown>\n    12: <unknown>\n    13: <unknown>\n    14: <unknown>\n    15: <unknown>\n    16: <unknown>\n    17: <unknown>\n    18: <unknown>\n    19: <unknown>\n    20: <unknown>\n    21: <unknown>\n    22: <unknown>\n    23: <unknown>\n    24: <unknown>\n    25: <unknown>\n    26: <unknown>\n    27: <unknown>\n    28: <unknown>\n    29: <unknown>\n    30: <unknown>\n    31: <unknown>\n    32: <unknown>\n    33: <unknown>\n    34: <unknown>\n    35: <unknown>\n    36: <unknown>\n    37: <unknown>\n    38: <unknown>\n    39: <unknown>\n    40: <unknown>\n    41: <unknown>\n    42: <unknown>\n    43: <unknown>\n    44: <unknown>\n    45: <unknown>\n    46: <unknown>\n    47: <unknown>\n    48: <unknown>\n    49: <unknown>\n    50: <unknown>\n    51: <unknown>\n    52: clone\n  \n  info: query stacktrace:\n     0: is_redundant_with_impl(Id(a004))\n               at crates/ty_python_semantic/src/types.rs:2035\n     1: infer_deferred_types(Id(1403))\n               at crates/ty_python_semantic/src/types/infer.rs:145\n     2: FunctionType < 'db >::signature_(Id(4404))\n               at crates/ty_python_semantic/src/types/function.rs:839\n     3: infer_definition_types(Id(1405))\n               at crates/ty_python_semantic/src/types/infer.rs:103\n     4: infer_scope_types(Id(1000))\n               at crates/ty_python_semantic/src/types/infer.rs:69\n     5: check_file_impl(Id(c00))\n               at crates/ty_project/src/lib.rs:548\n  \n  \n  Found 1 diagnostic\n  WARN A fatal error occurred while checking some files. Not all project files were analyzed. See the diagnostics list above for details.\n  ```\n\n</details>",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2324/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2323",
      "id": 3779670538,
      "node_id": "I_kwDOOje-Bs7hSTIK",
      "number": 2323,
      "title": "Generic protocol methods cannot soundly be implemented by a non-generic method",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2026-01-04T21:36:58Z",
      "updated_at": "2026-01-04T22:11:54Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "> I've come across an interesting case: how is `Self` handled when used in a protocol? Based on the logic, the code below should trigger a type error, but surprisingly, neither `mypy` nor `pyright` or `ty` flag it. What’s the reasoning behind this?\n> \n> ```python\n> from __future__ import annotations\n> \n> from typing import Protocol, Self\n> \n> \n> class Semigroup(Protocol):\n>     def op(\n>         self: Self,\n>         other: Self,\n>     ) -> Self: ...\n> \n> \n> class IntSum:\n>     def __init__(self, value: int):\n>         self.value = value\n> \n>     def op(self, other: IntSum) -> IntSum:\n>         return IntSum(\n>             self.value + other.value,\n>         )\n> \n> \n> class StringConcat:\n>     def __init__(self, value: str):\n>         self.value = value\n> \n>     def op(self, other: StringConcat) -> StringConcat:\n>         return StringConcat(\n>             self.value + other.value,\n>         )\n> \n> \n> def combine_semi[T: Semigroup](\n>     a: T,\n>     b: T,\n> ) -> T:\n>     return a.op(b)\n> \n> \n> x = combine_semi(\n>     IntSum(1),\n>     StringConcat(\"hello\"),\n> )\n> ``` \n\n _Originally posted by @kamalfarahani in [#2255](https://github.com/astral-sh/ty/issues/2255#issuecomment-3703527962)_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2323/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2321",
      "id": 3779599842,
      "node_id": "I_kwDOOje-Bs7hSB3i",
      "number": 2321,
      "title": "improve diagnostic for `typing.cast` to TypeVar in parameter default",
      "user": {
        "login": "JasonGrace2282",
        "id": 110117391,
        "node_id": "U_kgDOBpBCDw",
        "avatar_url": "https://avatars.githubusercontent.com/u/110117391?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/JasonGrace2282",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-01-04T20:09:01Z",
      "updated_at": "2026-01-04T22:34:56Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe following [playground](https://play.ty.dev/d1ed0fb4-3fb8-4c82-ba65-bac5cc7e5be7) gives a diagnostic of\n```\nDefault value of type `TypeVar` is not assignable to annotated parameter type `D@foo`\n```\nfor the following code:\n```py\nfrom typing import TypeVar, cast\nD = TypeVar('D')\n\ndef foo(x: D = cast(D, None)) -> D:\n    return x\n```\n\nI'm not quite sure if this should be allowed, or if this usage of `cast` should give off an error, but it would be nice if there was either a correct inference or a better error message!\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2321/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2317",
      "id": 3778291075,
      "node_id": "I_kwDOOje-Bs7hNCWD",
      "number": 2317,
      "title": "panic: `no entry found for key` with fuzzed slice expression",
      "user": {
        "login": "correctmost",
        "id": 134317971,
        "node_id": "U_kgDOCAGHkw",
        "avatar_url": "https://avatars.githubusercontent.com/u/134317971?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/correctmost",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2026-01-03T17:21:34Z",
      "updated_at": "2026-01-08T18:10:04Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nty crashes when checking this fuzzed code:\n\n```python\narr[::[x for *b in y for (b: _\n```\n\n```\nerror[panic]: Panicked at crates/ty_python_semantic/src/semantic_index/ast_ids.rs:35:22 when checking `/home/user/a.py`: `no entry found for key`\n```\n\n### Version\n\nty 0.0.8",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2317/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2314",
      "id": 3777930936,
      "node_id": "I_kwDOOje-Bs7hLqa4",
      "number": 2314,
      "title": "False positive [invalid-assignment] on assigning to union with bounded typevar",
      "user": {
        "login": "randolf-scholz",
        "id": 39696536,
        "node_id": "MDQ6VXNlcjM5Njk2NTM2",
        "avatar_url": "https://avatars.githubusercontent.com/u/39696536?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/randolf-scholz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Hugo-Polloli",
        "id": 26504147,
        "node_id": "MDQ6VXNlcjI2NTA0MTQ3",
        "avatar_url": "https://avatars.githubusercontent.com/u/26504147?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Hugo-Polloli",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Hugo-Polloli",
          "id": 26504147,
          "node_id": "MDQ6VXNlcjI2NTA0MTQ3",
          "avatar_url": "https://avatars.githubusercontent.com/u/26504147?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Hugo-Polloli",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2026-01-03T10:20:16Z",
      "updated_at": "2026-01-05T22:35:34Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nhttps://play.ty.dev/b3098a7e-d5ce-480f-be95-3f4cd7a6d224\n\n```python\ndef upcast(arg: int) -> int:\n    return arg\n\ndef test[X: int](items: list[X]) -> list[X]:\n    _a: list[int] = list(items)           # ✅️\n    _b: list[int] = [*items]              # ✅️\n    _c: list[int] = [x for x in items]    # ✅️\n\n    _1: list[str] | list[int] = list(items)         # ❌️\n    _2: list[int] | list[str] = list(items)         # ❌️\n    _3: list[str] | list[int] = [*items]            # ✅️\n    _4: list[int] | list[str] = [*items]            # ✅️\n    _5: list[str] | list[int] = [x for x in items]  # ✅️\n    _6: list[int] | list[str] = [x for x in items]  # ✅️\n    _7: list[str] | list[int] = [upcast(x) for x in items]  # ✅️\n    _8: list[int] | list[str] = [upcast(x) for x in items]  # ✅️\n    return items\n```\n\nThis reports\n\n> Object of type `list[X@test]` is not assignable to `list[str] | list[int]\n\nBut at the same time, it reports `list` is `[T] (Iterable[T]) -> list[T]`.\n\nSo in `_1` and `_2` we have joint constraints:\n\n- `X <: T` (`list[X]` must be assignable to `Iterable[T]`), \n- `X <: int` upper bound\n- `T = int` or `T=str` (`list[T] <: list[int] | list[str]`)\n\nSo, this has the unique solution `T=int`, but `ty` seems to incorrectly select `T=X`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2314/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2312",
      "id": 3777458594,
      "node_id": "I_kwDOOje-Bs7hJ3Gi",
      "number": 2312,
      "title": "unsupported-bool-conversion should detect __bool__ methods that return NoReturn",
      "user": {
        "login": "eric-distyl-ai",
        "id": 193850650,
        "node_id": "U_kgDOC43tGg",
        "avatar_url": "https://avatars.githubusercontent.com/u/193850650?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/eric-distyl-ai",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2026-01-02T23:52:41Z",
      "updated_at": "2026-01-04T21:33:42Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Summary\n\nThe `unsupported-bool-conversion` rule currently only detects `__bool__ = None` (non-callable), but does not flag objects whose `__bool__` method returns `NoReturn` (unconditionally raises).\n\nPyright catches this under `reportGeneralTypeIssues`, and it represents a real runtime issue - calling `bool()` on such objects will raise `TypeError` (or similar).\n\n## Example\n\n```python\nclass MyClass:\n    def __bool__(self):\n        raise TypeError(\"not allowed\")\n\nx = MyClass()\nif x:  # ← Should be flagged: __bool__ raises TypeError at runtime\n    pass\n```\n\n**ty 0.0.8 result:** `All checks passed!`\n\n**pyright result:**\n```\nerror: Invalid conditional operand of type \"MyClass\"\n  Method __bool__ for type \"MyClass\" returns type \"NoReturn\" rather than \"bool\" (reportGeneralTypeIssues)\n```\n\n## Real-World Impact\n\nThis affects common libraries:\n\n### SQLAlchemy (Column.__bool__)\n```python\nfrom sqlalchemy import Column, DateTime\nfrom sqlalchemy.orm import DeclarativeBase\n\nclass Base(DeclarativeBase):\n    pass\n\nclass MyModel(Base):\n    __tablename__ = \"my_table\"\n    created_at = Column(DateTime, nullable=True)\n\n    def to_api(self):\n        # This pattern is flagged by pyright but not by ty\n        return {\n            \"createdAt\": self.created_at.isoformat() if self.created_at else None\n        }\n```\n\nNote: The SQLAlchemy case is actually a false positive because the descriptor protocol returns the actual datetime at runtime, not the Column. But the check is still valuable for cases where `__bool__` truly raises.\n\n### Pandas (Series.__bool__)\n```python\nimport pandas as pd\n\nseries = pd.Series([1, 2, 3])\nif series:  # Raises ValueError at runtime: \"The truth value of a Series is ambiguous\"\n    pass\n```\n\n## Suggested Behavior\n\nExtend `unsupported-bool-conversion` to also flag when:\n1. `__bool__` is inferred to return `NoReturn`\n2. `__bool__` unconditionally raises an exception\n\nThis would catch real bugs where objects are used in boolean context but cannot be safely converted to bool.\n\n## Related\n\n- [Type system feature overview #1889](https://github.com/astral-sh/ty/issues/1889) - NoReturn/Never function propagation is complete, but this specific interaction isn't covered\n- The [unsupported-bool-conversion docs](https://docs.astral.sh/ty/reference/rules/#unsupported-bool-conversion) only mention `__bool__ = None`\n\n## Environment\n\n- ty version: 0.0.8\n- Comparison: pyright 1.1.403",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2312/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2309",
      "id": 3777236173,
      "node_id": "I_kwDOOje-Bs7hJAzN",
      "number": 2309,
      "title": "`inconsistent-mro`: add autofix that moves `Generic[]` to the end of the bases list, if doing so would fix the violation",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9026616990,
          "node_id": "LA_kwDOOje-Bs8AAAACGgc-ng",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fixes",
          "name": "fixes",
          "color": "aaaaaa",
          "default": false,
          "description": null
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2026-01-02T20:55:08Z",
      "updated_at": "2026-01-02T20:55:08Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The first of these causes ty to issue an `inconsistent-mro` violation; the second one does not:\n\n```py\nfrom typing import Generic, TypeVar\n\nK = TypeVar(\"K\")\nV = TypeVar(\"V\")\n\nclass Foo(Generic[K, V], dict): ...\nclass Bar(dict, Generic[K, V]): ...\n```\n\nAnd issues involving `Generic[]` are probably some of the most common causes of `inconsistent-mro` violations in user code. We should offer an autofix that moves the `Generic[]` element to the end of the bases list, if doing so would fix the `inconsistent-mro` violation.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2309/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2308",
      "id": 3777232590,
      "node_id": "I_kwDOOje-Bs7hI_7O",
      "number": 2308,
      "title": "Consider more precise return type for dynamic overload calls, if all overload returns share some component",
      "user": {
        "login": "Drizzelkun",
        "id": 120327010,
        "node_id": "U_kgDOBywLYg",
        "avatar_url": "https://avatars.githubusercontent.com/u/120327010?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Drizzelkun",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2026-01-02T20:52:12Z",
      "updated_at": "2026-01-05T17:07:14Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nWhen calling `plt.subplots` (possibly any overloaded function) with dynamic kwargs ty is unable to infer the type of `fig` even though all overloaded function calls return a 2-item tuple where the first item is always Figure. So no matter what kwargs could possibly provide, the first unpacked item must always be Figure.\n\nI assume this is already tracked somewhere so I'm hesitant to create a bug report but I couldn't find a specific matching issue.\n\n<img width=\"1014\" height=\"390\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/98448e31-527c-47e2-80b1-4587c68a40f4\" />\n\n### Version\n\nty 0.0.8 (aa7559db8 2025-12-29",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2308/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2307",
      "id": 3777109572,
      "node_id": "I_kwDOOje-Bs7hIh5E",
      "number": 2307,
      "title": "Feature: Auto Format F-strings",
      "user": {
        "login": "AndBoyS",
        "id": 40628201,
        "node_id": "MDQ6VXNlcjQwNjI4MjAx",
        "avatar_url": "https://avatars.githubusercontent.com/u/40628201?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AndBoyS",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2026-01-02T19:42:17Z",
      "updated_at": "2026-01-06T11:02:20Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Add an option to LSP: prefix string with f if `{` is typed inside a string (like in https://github.com/DetachHead/basedpyright/issues/280)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2307/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2306",
      "id": 3777008091,
      "node_id": "I_kwDOOje-Bs7hIJHb",
      "number": 2306,
      "title": "No validation for --python-platform",
      "user": {
        "login": "Jeremiah-England",
        "id": 34973839,
        "node_id": "MDQ6VXNlcjM0OTczODM5",
        "avatar_url": "https://avatars.githubusercontent.com/u/34973839?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Jeremiah-England",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2026-01-02T18:51:02Z",
      "updated_at": "2026-01-03T17:20:21Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI tried testing a coworker's issue with `--python-platform windows` and was at first confused why nothing changed. I really needed to use `--python-platform win32`.\n\nI think the command should probably fail for invalid platforms, or at least log a warning. \n\n### Version\n\nty 0.0.8",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2306/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2304",
      "id": 3776836076,
      "node_id": "I_kwDOOje-Bs7hHfHs",
      "number": 2304,
      "title": "Report condition checks with no overlap",
      "user": {
        "login": "CoderJoshDK",
        "id": 74162303,
        "node_id": "MDQ6VXNlcjc0MTYyMzAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/74162303?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/CoderJoshDK",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8760037609,
          "node_id": "LA_kwDOOje-Bs8AAAACCiOQ6Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/lint",
          "name": "lint",
          "color": "a3b2aa",
          "default": false,
          "description": "Label for features that we would implement as lint rules, not core type checker features"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2026-01-02T17:30:44Z",
      "updated_at": "2026-01-06T01:17:07Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "ty does not emit a warning or error when doing a logical comparison where there is no overlap\n\nhttps://play.ty.dev/beedfd79-499c-443f-a083-4c874e4b5350\n```py\nfoo: str = \"bar\"\n\nif foo is not None:\n    a = \"hit\"\n    print(\"hit\")\n\nif foo is None:\n    a = \"miss\"\n    print(\"miss\")\n\nreveal_type(a)\n```\n\nbasedpyright does provide `1. Condition will always evaluate to True since the types \"Literal['bar']\" and \"None\" have no overlap [reportUnnecessaryComparison]`\n\nmypy does not report anything and same with pyright\n\nAnother interesting quirk from the playground is that ty knows that the second condition check is unreachable and will then report a as\n`1. Revealed type: `Literal[\"hit\"]` [revealed-type]`\nBut funny enough, basedpyright reports it as `1. Type of \"a\" is \"Literal['miss', 'hit']\"`\n\n---\n\nEmitting a warning when there is no overlap between checks feels like an amazing rule to have! \n\nChain that brought this issue on https://github.com/rotki/rotki/pull/11269/ and https://discord.com/channels/1039017663004942429/1279201882337705994/1456681723470418123",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2304/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2300",
      "id": 3775623939,
      "node_id": "I_kwDOOje-Bs7hC3MD",
      "number": 2300,
      "title": "Using the walrus operator together with callable causes TypeIs to be ignored.",
      "user": {
        "login": "phi-friday",
        "id": 19867547,
        "node_id": "MDQ6VXNlcjE5ODY3NTQ3",
        "avatar_url": "https://avatars.githubusercontent.com/u/19867547?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/phi-friday",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        },
        "1": {
          "id": 9597629813,
          "node_id": "LA_kwDOOje-Bs8AAAACPBA1dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/callables",
          "name": "callables",
          "color": "5d4406",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2026-01-02T05:31:13Z",
      "updated_at": "2026-01-06T01:18:04Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nhttps://play.ty.dev/c4b6196b-5a1c-4f2e-a61c-09b50d38fbc0\n```python\nfrom typing import Any, reveal_type\nfrom collections.abc import Callable\n\nclass Test:\n    func: Callable[..., Any]\n\nfoo = Test()\nfirst = getattr(foo, \"func\", None)\nif callable(first):\n    reveal_type(first)\nif callable(second:=getattr(foo, \"func\", None)):\n    reveal_type(second)\n```\n```\nRevealed type: `Any & Top[(...) -> object]` (revealed-type) [Ln 10, Col 17]\nRevealed type: `Any | None` (revealed-type) [Ln 12, Col 17]\n```\n\nEven if the ty can't fully infer the type of func, it should still be able to determine whether it is a callable object or not.\n\nIf this problem is caused by #626, please close it as a duplicate.\n\n### Version\n\nplayground 26230b1ed",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2300/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2298",
      "id": 3775303167,
      "node_id": "I_kwDOOje-Bs7hBo3_",
      "number": 2298,
      "title": "Initial optimization pass at auto-import symbol extraction",
      "user": {
        "login": "liketoeatcheese",
        "id": 88610355,
        "node_id": "MDQ6VXNlcjg4NjEwMzU1",
        "avatar_url": "https://avatars.githubusercontent.com/u/88610355?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/liketoeatcheese",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "BurntSushi",
          "id": 456674,
          "node_id": "MDQ6VXNlcjQ1NjY3NA==",
          "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/BurntSushi",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2026-01-01T22:28:10Z",
      "updated_at": "2026-01-09T15:14:27Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHi team,\n\nIs there a feature to separate the extra path for the lsp autocompletion and the extra apth for lsp analysis?\n\nAssuming the stub is abnormally large. Like currently I'm using it for unreal which has the stub that's 28MB large, it feels obvious with the slow response time (roughly 4-5 seconds). So I split the classes inside this stub into smaller chunks and was thinking to specify different paths like how vscode support for it. But realized later on that the option is not available in the config. Am I missing something or is this not supported? And if not, will it ever be?\n\n<img width=\"789\" height=\"267\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/43dff21c-caf3-4add-8279-90020b3b0f34\" />\n\n<img width=\"1233\" height=\"635\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/af4dc1ab-9474-4776-bb4b-1439180be156\" />\n\n\nHere's my toml file currently:\n```toml\n[environment]\nextra-paths = [\n    \"{{UnrealProjectPath}}/Intermediate/PythonStub\"\n]\n```\n\nProposing something like this:\n```toml\n[environment]\nanalysis-extra-paths = [\n    \"{{UnrealProjectPath}}/Intermediate/PythonStub\"\n]\nautocomplete-extra-paths = [\n    \"{{UnrealProjectPath}}/Intermediate/PythonStub/splittedstub\"\n]\n```\n\n### Version\n\nty 0.0.8",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2298/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2295",
      "id": 3773822968,
      "node_id": "I_kwDOOje-Bs7g7_f4",
      "number": 2295,
      "title": "Add inlay hint for generic type in generic constructor calls",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-31T22:11:49Z",
      "updated_at": "2026-01-06T00:26:10Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen writing highly generic-centric code, one of my favorite features from basedpyright that I'd like to see in ty is inlay hints for constructors, specifically for situations where there is no other good place for showing the type of that generic, ie in the middle of a chain of calls.\n\n<img width=\"430\" height=\"180\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/9bc2fb49-08e2-4bf2-9fa1-5f65d3f1803d\" />\n\nCurrently ty doesn't have that `[int]` inlay hint on the `HasGeneric` constructor call\nhttps://play.ty.dev/d2ef7feb-51a9-47ba-b349-8c0c15196854\n\n<img width=\"340\" height=\"181\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/e5b408fa-0032-4d9e-8a84-cbd60dc02f7b\" />\n\nCode for easy copy/pasting:\n```py\nclass HasGeneric[T]:\n    def __init__(self, x: T):\n        self._x: T = x\n\ndef uses_generic[T](item: HasGeneric[T]): ...\n\nmy_item = 1\n\nuses_generic(HasGeneric(my_item))\n```\n\n(At least personally I would also really like it if there was an additional `[int]` inlay hint on the `uses_generic` call, but that is probably too far since it's currently invalid syntax.)\n\n### Version\n\nplayground 758926eec",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2295/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2288",
      "id": 3772128921,
      "node_id": "I_kwDOOje-Bs7g1h6Z",
      "number": 2288,
      "title": "Respect signature of metaclass's `__call__`",
      "user": {
        "login": "taminomara",
        "id": 81165235,
        "node_id": "MDQ6VXNlcjgxMTY1MjM1",
        "avatar_url": "https://avatars.githubusercontent.com/u/81165235?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/taminomara",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-31T06:48:36Z",
      "updated_at": "2026-01-08T18:12:16Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Another feature request similar to #281: respect signature of `__call__` defined on a metaclass.\n\n```python\nclass Meta(type):\n    def __call__(cls, arg: int) -> str: ...\n\nclass T(metaclass=Meta):\n    pass\n\n# Inferred type: `T`, should be `str`.\nt = T()  # Should report missing argument `arg`.\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2288/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2287",
      "id": 3772117249,
      "node_id": "I_kwDOOje-Bs7g1fEB",
      "number": 2287,
      "title": "Improve diagnostic message clarity when passing a class type instead of an instance",
      "user": {
        "login": "kkpattern",
        "id": 897336,
        "node_id": "MDQ6VXNlcjg5NzMzNg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/897336?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/kkpattern",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-12-31T06:40:08Z",
      "updated_at": "2026-01-05T16:51:39Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "\nWhen passing a class object (e.g., `Foo`) to a function that expects an instance of that class (e.g., `a: Foo`), the current error message can be visually confusing.\n\nThe distinction between `Expected Foo` and `found <class 'Foo'>` is subtle and can be difficult to spot at a glance, especially for beginners or in complex error logs.\n\n```python\nclass Foo:\n    pass\n\ndef test(a: Foo):\n    pass\n\ndef main() -> None:\n    a = Foo\n    test(a)  # Passing the class itself, not an instance\n```\n\n### Current Output\n\n```text\nerror[invalid-argument-type]: Argument to function `test` is incorrect\n  --> test.py:11:10\n   |\n 9 | def main() -> None:\n10 |     a = Foo\n11 |     test(a)\n   |          ^ Expected `Foo`, found `<class 'Foo'>`\n   |\n```\n\nThe string `<class 'Foo'>` looks very similar to the expected type `Foo`. It doesn't clearly communicate that the issue is a **Type vs. Instance** mismatch.\n\nWe can adopt the `type[Foo]` notation used by other type checkers (like `pyright` and `mypy`). This makes it more clear that a Type object was passed instead of an instance.\n\n**Pyright:**\n```text\ntest.py:11:10 - error: Argument of type \"type[Foo]\" cannot be assigned to parameter \"a\" of type \"Foo\" in function \"test\"\n```\n\n**Mypy:**\n```text\ntest.py:11: error: Argument 1 to \"test\" has incompatible type \"type[Foo]\"; expected \"Foo\"  [arg-type]\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2287/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2286",
      "id": 3771934144,
      "node_id": "I_kwDOOje-Bs7g0yXA",
      "number": 2286,
      "title": "`repr` gets incorrect `Literal` types for strings",
      "user": {
        "login": "dscorbett",
        "id": 1124347,
        "node_id": "MDQ6VXNlcjExMjQzNDc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1124347?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dscorbett",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-31T04:08:52Z",
      "updated_at": "2025-12-31T11:00:36Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nty’s implementation of `repr` for strings doesn’t match Python’s. [Example](https://play.ty.dev/c83eb871-1800-45c1-bb22-584e434c02d3):\n```console\n$ cat >invalid-assignment.py <<'# EOF'\nfrom typing import Literal\nx: Literal[\"'\\\"\\\\x05⦂🙾'\"] = repr('\"\\5\\u2982\\U0001F67E')\n# EOF\n\n$ ty check --output-format concise invalid-assignment.py\ninvalid-assignment.py:2:29: error[invalid-assignment] Object of type `Literal[\"'\\\\\\\"\\\\u{5}\\\\u{2982}\\\\u{1f67e}'\"]` is not assignable to `Literal[\"'\\\"\\\\x05⦂🙾'\"]`\nFound 1 diagnostic\n```\n\n`repr` changes between Python versions to match Unicode. It is not safe to make assumptions about its exact output for strings. Its behavior for some characters might be considered reliable enough.\n\n### Version\n\nty 0.0.8 (aa7559db8 2025-12-29)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2286/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2282",
      "id": 3771564842,
      "node_id": "I_kwDOOje-Bs7gzYMq",
      "number": 2282,
      "title": "Support dynamic type guards with `hasattr` in a loop",
      "user": {
        "login": "phistep",
        "id": 544642,
        "node_id": "MDQ6VXNlcjU0NDY0Mg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/544642?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/phistep",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-30T23:32:44Z",
      "updated_at": "2026-01-06T01:59:58Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWould it be possible to support iterating over attribute names and type guarding in the loop body?\n\nThis works, but is cumbersome\n\n```python\nimport glfw\n\nif not hasattr(glfw, attr := \"window_hint_string\"):\n    raise RuntimeError(f\"GLFW is missing required attribute: {attr}\")\nif not hasattr(glfw, attr := \"set_window_opacity\"):\n    raise RuntimeError(f\"GLFW is missing required attribute: {attr}\")\nif not hasattr(glfw, attr := \"set_window_attrib\"):\n    raise RuntimeError(f\"GLFW is missing required attribute: {attr}\")\n\n# no warning\nglfw.window_hint_string(glfw.COCOA_FRAME_NAME, title)\n```\n\n`glwf`is annative  extension module that defines some members conditionally , see https://github.com/FlorianRhiem/pyGLFW/issues/87#issuecomment-3700678303\n\nI would rather want to write it like this\n```python\nfor attr in [\"window_hint_string\", \"set_window_opacity\", \"set_window_attrib\"):\n    if not hasattr(glfw, attr):\n        raise RuntimeError(f\"GLFW is missing required attribute: {attr}\")\n\n# warning[possibly-missing-attribute]: Member `window_hint_string` may be missing on module `glfw`\nglfw.window_hint_string(glfw.COCOA_FRAME_NAME, title)\n```\n\nUnsure if this is realistic or even possible given that one would have to actually execute the code. But for simple patterns like this, I assume that `ty` could infer all possible values of `attr` statically and doe the expansion?\n\n(side note: `warning[possibly-missing-attribute]` made me find this bug before it happened, thank you! :​­) https://github.com/phistep/VHSh/blob/a7f930bc47f9d4eae2be3ef329c79ef29849a259/src/vhsh/window.py#L57-L59\n\n### Version\n\n```\n~/Library/Application Support/Zed/languages/ty/ty-0.0.7/ty-aarch64-apple-darwin/ty\n```\n\nBundled with Zed `0.217.3+stable.105.80433cb239e868271457ac376673a5f75bc4adb1`",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2282/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2281",
      "id": 3771354515,
      "node_id": "I_kwDOOje-Bs7gyk2T",
      "number": 2281,
      "title": "No unresolved-reference error when definition exists but is not reachable",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        },
        "1": {
          "id": 8677454701,
          "node_id": "LA_kwDOOje-Bs8AAAACBTdzbQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/unreachable-code",
          "name": "unreachable-code",
          "color": "666666",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-30T21:38:11Z",
      "updated_at": "2025-12-30T21:38:51Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In this code, we (of course) emit an `unresolved-reference` on the use of `x` in the last line:\n\n```py\ndef foo():\n    x  # error: [unresolved-reference]\n```\n\nBut in this code (checked under Python > 3.10), we do not, but we should:\n\n```py\nimport sys\n\nif sys.version_info < (3, 10):\n    x = 1\n\ndef foo():\n    x\n```\n\nThe root cause is our generalized handling of reachability, where we check \"is there a path from a definition to a use\" without distinguishing whether it is the definition or the use that is unreachable.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2281/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2280",
      "id": 3771096002,
      "node_id": "I_kwDOOje-Bs7gxlvC",
      "number": 2280,
      "title": "Avoid literal promotion when constructing `frozenset` from list/set literal",
      "user": {
        "login": "Jammf",
        "id": 7865052,
        "node_id": "MDQ6VXNlcjc4NjUwNTI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7865052?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Jammf",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-12-30T19:34:28Z",
      "updated_at": "2026-01-06T02:11:34Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nLiteral promotion is currently performed for `tuple` but not for `frozenset`. This is surprising to me given that they both are immutable and behave somewhat similarly. It could be useful to change `frozenset`, for instance to support the following comparisons:\n\n```python\nfrom typing import reveal_type\n\n# tuple\nreveal_type((1, 2))  # Revealed type: `tuple[Literal[1], Literal[2]]`\nreveal_type((1, 2) == (1, 2))  # Revealed type: `Literal[True]`\n\n# frozenset\nreveal_type(frozenset({1, 2}))  # Revealed type: `frozenset[Unknown | int]`\nreveal_type(frozenset({1, 2}) == frozenset({1, 2}))  # Revealed type: `bool`\nreveal_type(frozenset({1, 2}) == frozenset({2, 1}))  # Revealed type: `bool`\n```\n\nhttps://play.ty.dev/464c2ef8-e7bc-4e74-938f-3c0f2cd20916\n\nRelated: https://github.com/astral-sh/ty/issues/1284#issuecomment-3403747307\n\n### Version\n\nty 0.0.8 (aa7559db8 2025-12-29)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2280/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2278",
      "id": 3770577647,
      "node_id": "I_kwDOOje-Bs7gvnLv",
      "number": 2278,
      "title": "Overloads don't work on decorated functions",
      "user": {
        "login": "ncollins-vs",
        "id": 48693082,
        "node_id": "MDQ6VXNlcjQ4NjkzMDgy",
        "avatar_url": "https://avatars.githubusercontent.com/u/48693082?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ncollins-vs",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-30T15:41:36Z",
      "updated_at": "2026-01-09T11:15:46Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```python\nfrom typing import overload, ParamSpec, TypeVar, Callable\nimport functools\n\nPS = ParamSpec(\"PS\")\nT = TypeVar(\"T\")\ndef decorator(f: Callable[PS, T]) -> Callable[PS, T]:\n    @functools.wraps(f)\n    def wrapper(*args: PS.args, **kwargs: PS.kwargs) -> T:\n        return f(*args, **kwargs)\n    return wrapper\n\n\n@overload\ndef test(x: int) -> int: ...\n@overload\ndef test(*, y: str) -> str: ...\n@decorator\ndef test(x: int | None = None, *, y: str | None = None) -> int | str:\n    raise NotImplementedError\n\nx = 1\nreveal_type(x)\nreveal_type(test(x))\n```\n\nIf I comment out `@decorator`, ty correctly determines that `test(x)` is of type `int`. But with the decorator it incorrectly determines the type as `int | str` as if the overloads didn't exist.\n\n[Playground link](https://play.ty.dev/24787475-a3a3-4ba9-9450-4bcdebc05f92)\n\n### Version\n\nty 0.0.8 (aa7559db8 2025-12-29)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2278/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2276",
      "id": 3770140314,
      "node_id": "I_kwDOOje-Bs7gt8aa",
      "number": 2276,
      "title": "Server: auto-indent works much worse when Pylance is disabled",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-30T13:00:22Z",
      "updated_at": "2026-01-05T15:19:56Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nConsider the below video. With Pylance enabled (at the beginning of the video), hitting return automatically indents my cursor by 8 spaces, which is where I want it to be to add a new line to the beginning of my function. But with Pylance disabled (so that ty is the only Python LSP active), hitting return only automatically indents my cursor by 4 spaces\n\nhttps://github.com/user-attachments/assets/d021e9d4-db44-441c-9423-63847d72e967\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2276/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2273",
      "id": 3769590310,
      "node_id": "I_kwDOOje-Bs7gr2Im",
      "number": 2273,
      "title": "Auto Import: Add support for namespace packages ",
      "user": {
        "login": "Zhmjharmgal",
        "id": 48463006,
        "node_id": "MDQ6VXNlcjQ4NDYzMDA2",
        "avatar_url": "https://avatars.githubusercontent.com/u/48463006?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Zhmjharmgal",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        },
        "2": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-12-30T09:24:44Z",
      "updated_at": "2026-01-06T14:20:18Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHello,\n\nThanks for the great work. ty is indeed much faster than pyright and basedpyright. However, I found that it cannot auto-import any functions defined in workspace python files. Below is a minimal reproduction:\n\nMy root directory is `test` and below is the directory structure:\n\n<img width=\"895\" height=\"355\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/2bc15a54-1e32-46b2-a096-a3752738c493\" />\n\nInside `src/path2/file2.py` I have a dummy function defined as \n\n<img width=\"1150\" height=\"272\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/5247ef21-1e8c-4d7c-b0dd-7bd08f8400ad\" />\n\nThen, in `src/path1/file1.py`, when I start typing my_custom<CURSOR>, `my_custom_function` is not an auto-completion entry from ty:\n\n<img width=\"493\" height=\"124\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/8be545f7-30a5-4a66-9839-f8e28676893a\" />\n\nFurther, after I completely typed my_custom_function there and invoked code actions, no auto-import entry is displayed, only \"ignore 'unresolved-reference' for this line [ty]\":\n\n<img width=\"1404\" height=\"312\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/9edf2d5c-5675-4011-9d7d-f5c30576cc65\" />\n\nHowever, after I started the lsp basedpyright, `my_cumtom_function` does become available as an auto-completion suggestion:\n\n<img width=\"816\" height=\"139\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/60781664-a7d1-4a85-8f40-6a29930a8789\" />\n\nSo, I would like to ask if this is a bug or an intentional plan. Thank you!\n\n---\n\n## Context:\n\n- I use Arch Linux.\n- I used `uv init test` to init this python project and used `uv tool install ty` to install ty. I don't have any other modifications on `pyproject.toml`.\n- I used `export PYTHONPATH=$PWD` to explicitly set the root directory in `test` (parent directory of `src`)\n- The ty version is 0.0.8.\n- I tested this issue on both neovim and vscode and the behavior is the same.\n\n\n\n### Version\n\nty 0.0.8",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2273/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2272",
      "id": 3769511773,
      "node_id": "I_kwDOOje-Bs7gri9d",
      "number": 2272,
      "title": "Hover on function calls reveals Never in unreachable code",
      "user": {
        "login": "hauntsaninja",
        "id": 12621235,
        "node_id": "MDQ6VXNlcjEyNjIxMjM1",
        "avatar_url": "https://avatars.githubusercontent.com/u/12621235?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/hauntsaninja",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8677454701,
          "node_id": "LA_kwDOOje-Bs8AAAACBTdzbQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/unreachable-code",
          "name": "unreachable-code",
          "color": "666666",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-30T08:55:01Z",
      "updated_at": "2025-12-31T15:46:41Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIf you hover on `bar` in the following, you get `Never`\n\nhttps://play.ty.dev/61a6752c-3844-4494-9ad5-367de301f768\n\nThis is totally reasonable behaviour from a type checker, but it's not as ideal for an LSP. It's pretty common to temporarily have unreachable code while refactoring and want to be able to see types — at least types of globals, like other functions\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2272/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2267",
      "id": 3768529222,
      "node_id": "I_kwDOOje-Bs7gnzFG",
      "number": 2267,
      "title": "validate TypeIs and TypeGuard definitions",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "2": {
          "id": 9907263243,
          "node_id": "LA_kwDOOje-Bs8AAAACToTXCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/conformance",
          "name": "conformance",
          "color": "0f7236",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 6,
      "created_at": "2025-12-29T23:14:51Z",
      "updated_at": "2026-01-06T17:02:28Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In order to fully pass the conformance suite for `TypeIs` and `TypeGuard`, we need to add some extra validations of functions annotated with a `TypeIs` or `TypeGuard` return type.\n\n1. The function should accept exactly one parameter (not counting `self` or `cls` if it's a method / classmethod).\n2. For `TypeIs`, the type parameter of the `TypeIs` return type must be assignable to the annotated type of the single parameter.\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2267/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2266",
      "id": 3768486392,
      "node_id": "I_kwDOOje-Bs7gnon4",
      "number": 2266,
      "title": "Built-in operators on `JustFloat`s should return `JustFloat`.",
      "user": {
        "login": "Jammf",
        "id": 7865052,
        "node_id": "MDQ6VXNlcjc4NjUwNTI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7865052?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Jammf",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-12-29T22:45:48Z",
      "updated_at": "2025-12-30T07:30:51Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n(Based on https://github.com/astral-sh/ty/issues/2184#issuecomment-3697621323)\n\nTy reports the sum of two `JustFloat` values is `int | float`. I would have expected it to be another `JustFloat`, given that result is always a `float` at runtime.\n\n```python\na = 0.1\nb = 0.2\nreveal_type(a)  # float\nreveal_type(b)  # float\n\nc = a + b\nreveal_type(c)  # int | float\n```\n\nhttps://play.ty.dev/a7945e32-cb7d-4765-bf50-d3b2b711b6ed\n\n\n\n### Version\n\nty 0.0.8 (aa7559db8 2025-12-29)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2266/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2265",
      "id": 3768433392,
      "node_id": "I_kwDOOje-Bs7gnbrw",
      "number": 2265,
      "title": "Support assignment to union of `TypedDict`",
      "user": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        },
        "1": {
          "id": 9596740363,
          "node_id": "LA_kwDOOje-Bs8AAAACPAKjCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typeddict",
          "name": "typeddict",
          "color": "46775a",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "ibraheemdev",
          "id": 34988408,
          "node_id": "MDQ6VXNlcjM0OTg4NDA4",
          "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ibraheemdev",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-29T22:07:07Z",
      "updated_at": "2026-01-09T05:29:47Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We currently only consider the type context if there is a single `TypedDict` element. We should support the following:\n\n```py\nfrom typing import TypedDict\n\nclass Foo(TypedDict):\n    foo: int\n\nclass Bar(TypedDict):\n    bar: int\n\nx: Foo | Bar = reveal_type({ \"foo\": 1 }) # Foo\n\nclass FooBar1(TypedDict):\n    foo: int\n    bar: int\n\nclass FooBar2(TypedDict):\n    foo: int\n    bar: int\n\nx: FooBar1 | FooBar2 = reveal_type({ \"foo\": 1, \"bar\": 1 }) # FooBar1 | FooBar2\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2265/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2263",
      "id": 3768203654,
      "node_id": "I_kwDOOje-Bs7gmjmG",
      "number": 2263,
      "title": "Hide inlay hints on explicitly specified generic constructor assignments",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-29T19:49:29Z",
      "updated_at": "2025-12-31T15:46:23Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Not sure how common of a pattern this is, but especially whenever I need an empty set I'll write it like this:\n```py\nx = set[int]()\n```\nSince otherwise with a type hint `set` would end up repeated twice.\n\nBut currently that makes an inlay hint with that duplicate information I was trying to avoid:\nhttps://play.ty.dev/d13ad5a0-33b3-43f4-815a-25ac39528bc2\n\n<img width=\"209\" height=\"32\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/6eb7687e-8dde-4776-9e31-593bbd790a88\" />\n\nIt would be nice if in this case of the direct assignment of a generic-specified class constructor ty hid the inlay hint. Not sure how feasible that is to do.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2263/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2255",
      "id": 3766724929,
      "node_id": "I_kwDOOje-Bs7gg6lB",
      "number": 2255,
      "title": "Self should be equivalent to bound typevar, but only Self causes Liskov violation",
      "user": {
        "login": "kamalfarahani",
        "id": 17600026,
        "node_id": "MDQ6VXNlcjE3NjAwMDI2",
        "avatar_url": "https://avatars.githubusercontent.com/u/17600026?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/kamalfarahani",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 11,
      "created_at": "2025-12-29T08:03:48Z",
      "updated_at": "2026-01-04T21:39:20Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nI am experimenting with `typing.Self` (introduced in [PEP 673](https://peps.python.org/pep-0673/)) to define a `Monoid` interface. According to the PEP, `Self` can be used to annotate parameters that expect instances of the current class.\n\nHowever, when I attempt to narrow the type of the parameter in a subclass, my type checker `ty`  flags an error.\n\n```python\nclass Monoid(ABC):\n    @abstractmethod\n    def op(self, other: Self) -> Self:\n        raise NotImplementedError()\n\n\nclass IntAdditionMonoid(Monoid):\n    def __init__(self, value: int):\n        self.value = value\n\n    def op(self, other: IntAdditionMonoid) -> Self:\n        return IntAdditionMonoid(\n            self.value + other.value,\n        )\n```\nfrom what I understand from this [PEP](https://peps.python.org/pep-0673/):\n> Another use for Self is to annotate parameters that expect instances of the current class\n\nIf the PEP states that `Self` represents the \"current class,\" why am I unable to replace the `Self` annotation with the concrete class name in the subclass implementation?\n\n### Version\n\nty 0.0.7",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2255/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2254",
      "id": 3766697789,
      "node_id": "I_kwDOOje-Bs7ggz89",
      "number": 2254,
      "title": "Autocomplete is extremely slow in Remote SSH",
      "user": {
        "login": "SunSeaLucky",
        "id": 134504601,
        "node_id": "U_kgDOCARgmQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/134504601?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SunSeaLucky",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "2": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "BurntSushi",
          "id": 456674,
          "node_id": "MDQ6VXNlcjQ1NjY3NA==",
          "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/BurntSushi",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 15,
      "created_at": "2025-12-29T07:48:06Z",
      "updated_at": "2026-01-06T15:20:19Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHello, \n\nWhen I use ty as language server (I install ty extension in VSCode) in remote server using Remote SSH:\n\n<img width=\"325\" height=\"165\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/bbee80fb-9ac5-4306-a0dc-7ba879e56331\" />\n\nIt always comsumes about **10s** or more to autocomplete. **I'm sure this promble is not presented when I use pylance (or pyright) as  my language server.**\n\n<img width=\"1022\" height=\"502\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/1bc97413-4c02-4755-be68-eb9a32e07c7e\" />\n\nHowever, it works well when I just develop all things in local. So I suspect there is something wrong in using remote. By the way, other functions works well in remote except the autocomplete function.\n\nMy environment:\n\nLocal: \n- MacOS 15.3.2\n- VSCode version: November 2025 (version 1.107)\n\nRemote:\n- VSCode extension id: astral-sh.ty (with ty==0.0.6)\n- Linux di-20251207003629-f9fr6 5.4.210-4-velinux1-amd64 #velinux1 SMP Debian 5.4.210-4-velinux1 Tue Mar 21 14:11:05 UTC  x86_64 x86_64 x86_64 GNU/Linux\n\n\n\n### Version\n\nty extension, which says ty==0.0.6 in document. Sorry if any information is not provided.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2254/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2251",
      "id": 3766102739,
      "node_id": "I_kwDOOje-Bs7geirT",
      "number": 2251,
      "title": "Emit error when unpacking a not-iterable argument in a call",
      "user": {
        "login": "phistep",
        "id": 544642,
        "node_id": "MDQ6VXNlcjU0NDY0Mg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/544642?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/phistep",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-28T23:25:13Z",
      "updated_at": "2026-01-06T02:15:14Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nfrom typing import Generic, TypeAlias, TypeVar\n\n\ndef foo(a: str, b: int, c: int, d: str): ...\n\n\nVType: TypeAlias = int | tuple[int, int]\nV = TypeVar(\"V\", bound=VType)\n\n\nclass Foo(Generic[V]):\n    v: V\n\n    def __init__(self, v: V):\n        self.v = v\n\n\nD = dict(\n    a=Foo(v=1),\n    b=Foo(v=(2, 2)),\n)\nfoo(\"foo\", *D[\"b\"], d=\"bar\")\n```\n\nreports\n```\nerror[parameter-already-assigned]: Multiple values provided for parameter `d` of function `foo`\n  --> src/vhsh/test.py:22:21\n   |\n20 |     b=Foo(v=(2, 2)),\n21 | )\n22 | foo(\"foo\", *D[\"b\"], d=\"bar\")\n   |                     ^^^^^^^\n   |\ninfo: rule `parameter-already-assigned` is enabled by default\n\nFound 1 diagnostic\n```\nwhen actually `d` is only passed once and `D[\"b\"]` is unpacked into `b` _and_ `c`.\n\nThis is similar to #2250 and #1985 but produces an error message and not only misleading inlays.\n\n<img width=\"699\" height=\"532\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/dceaa659-3762-466d-94b4-f56b910b9877\" />\n\n\n---\n\n```py\nfoo(\"foo\", D[\"b\"][0], D[\"b\"][1], d=\"bar\")\n```\ngives the expected[^1] errors\n\n```\nerror[non-subscriptable]: Cannot subscript object of type `Foo[int]` with no `__getitem__` method\n  --> src/vhsh/test.py:22:12\n   |\n20 |     b=Foo(v=(2, 2)),\n21 | )\n22 | foo(\"foo\", D[\"b\"][0], D[\"b\"][1], d=\"bar\")\n   |            ^^^^^^^^^\n   |\ninfo: rule `non-subscriptable` is enabled by default\n\nerror[non-subscriptable]: Cannot subscript object of type `Foo[tuple[int, int]]` with no `__getitem__` method\n  --> src/vhsh/test.py:22:12\n   |\n20 |     b=Foo(v=(2, 2)),\n21 | )\n22 | foo(\"foo\", D[\"b\"][0], D[\"b\"][1], d=\"bar\")\n   |            ^^^^^^^^^\n   |\ninfo: rule `non-subscriptable` is enabled by default\n\nerror[non-subscriptable]: Cannot subscript object of type `Foo[int]` with no `__getitem__` method\n  --> src/vhsh/test.py:22:23\n   |\n20 |     b=Foo(v=(2, 2)),\n21 | )\n22 | foo(\"foo\", D[\"b\"][0], D[\"b\"][1], d=\"bar\")\n   |                       ^^^^^^^^^\n   |\ninfo: rule `non-subscriptable` is enabled by default\n\nerror[non-subscriptable]: Cannot subscript object of type `Foo[tuple[int, int]]` with no `__getitem__` method\n  --> src/vhsh/test.py:22:23\n   |\n20 |     b=Foo(v=(2, 2)),\n21 | )\n22 | foo(\"foo\", D[\"b\"][0], D[\"b\"][1], d=\"bar\")\n   |                       ^^^^^^^^^\n   |\ninfo: rule `non-subscriptable` is enabled by default\n\nFound 4 diagnostics\n```\n\n<img width=\"627\" height=\"134\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/83cd6b65-aeb0-4ea0-87d1-22e36a6ec14d\" />\n\n[^1]: sadly unsatisfactory due to impossible type inference w/o `TypedDict`.\n\n\n### Version\n\n`ty 0.0.7 (cf82a04b5 2025-12-24)`",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2251/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2249",
      "id": 3765797820,
      "node_id": "I_kwDOOje-Bs7gdYO8",
      "number": 2249,
      "title": "Go-to-definition jumps to typeshed stubs for datetime module import ",
      "user": {
        "login": "olzhasar",
        "id": 12471703,
        "node_id": "MDQ6VXNlcjEyNDcxNzAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/12471703?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/olzhasar",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 7,
      "created_at": "2025-12-28T16:17:16Z",
      "updated_at": "2025-12-31T15:20:26Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen jumping to a definition ~~that corresponds to an external library~~, `ty` points to the cached Python file. This file is generally identical to the source, so exploring it's contents works fine.\nHowever, it gets inconvenient when one wants to, for example, explore other files in the same folder as the source. This feels like a common use case when jumping to definitions.\n\n### Version\n\nty 0.0.7",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2249/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2244",
      "id": 3765262166,
      "node_id": "I_kwDOOje-Bs7gbVdW",
      "number": 2244,
      "title": "Member <anything> may be missing on module `torch.distributed`",
      "user": {
        "login": "arogozhnikov",
        "id": 6318811,
        "node_id": "MDQ6VXNlcjYzMTg4MTE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6318811?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/arogozhnikov",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-28T02:37:45Z",
      "updated_at": "2025-12-29T17:15:36Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 1,
        "total_blocked_by": 1,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```python\nimport torch.distributed as tdist\n\ntdist.all_gather # complains on all ops I use: get_rank / get_world_size / ...\n```\n\nwhile this seemingly works\n\n```py\nfrom torch.distributed import ... \n```\n\n\n### Version\n\nty 0.0.7",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2244/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2243",
      "id": 3765145766,
      "node_id": "I_kwDOOje-Bs7ga5Cm",
      "number": 2243,
      "title": "[panic] too many cycle iterations when checking Callable type alias with narwhals.LazyFrame",
      "user": {
        "login": "matthiaskaeding",
        "id": 17614361,
        "node_id": "MDQ6VXNlcjE3NjE0MzYx",
        "avatar_url": "https://avatars.githubusercontent.com/u/17614361?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/matthiaskaeding",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-27T22:54:47Z",
      "updated_at": "2026-01-09T13:44:36Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Description\n\n`ty check` panics with \"too many cycle iterations\" when checking code that uses a `Callable` type alias with `narwhals.LazyFrame` as parameter and return types.\n\n## Minimal Reproduction\n\n```python\n\"\"\"Minimal reproduction for ty panic.\"\"\"\nfrom typing import Callable\n\nimport narwhals as nw\n\nBuilder = Callable[[nw.LazyFrame], nw.LazyFrame]\n\n\ndef get_builder() -> Builder:\n    return _builder\n\n\ndef _builder(df: nw.LazyFrame) -> nw.LazyFrame:\n    native = df._compliant_frame.native\n    return nw.from_native(native).lazy()\n```\n\nSave as `repro.py` and run:\n```bash\nty check repro.py\n```\n\n## Error Output\n\n```\nerror[panic]: Panicked at .../execute.rs:321:21 when checking `repro.py`: `is_redundant_with_impl(Id(...)): execute: too many cycle iterations`\ninfo: This indicates a bug in ty.\n```\n\n<details>\n<summary>Full stack trace</summary>\n\n```\nerror[panic]: Panicked at /Users/runner/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/55e5e7d/src/function/execute.rs:321:21 when checking `/tmp/ty_repro10.py`: `is_redundant_with_impl(Id(a058)): execute: too many cycle iterations`\ninfo: This indicates a bug in ty.\ninfo: Platform: macos aarch64\ninfo: Version: 0.0.4 (c1e6188b1 2025-12-18)\ninfo: Args: [\"ty\", \"check\", \"/tmp/ty_repro10.py\"]\ninfo: query stacktrace:\n   0: infer_definition_types(Id(cdf0))\n             at crates/ty_python_semantic/src/types/infer.rs:103\n   1: infer_deferred_types(Id(ce09))\n             at crates/ty_python_semantic/src/types/infer.rs:145\n   2: TypeVarInstance < 'db >::lazy_bound_(Id(9409))\n             at crates/ty_python_semantic/src/types.rs:9708\n   3: inferable_typevars_inner(Id(4d09))\n             at crates/ty_python_semantic/src/types/generics.rs:336\n             cycle heads: TypeVarInstance < 'db >::lazy_bound_(Id(9408)) -> iteration = 200, TypeVarInstance < 'db >::lazy_bound_(Id(9407)) -> iteration = 200\n   4: infer_definition_types(Id(cf3a))\n             at crates/ty_python_semantic/src/types/infer.rs:103\n   5: cached_protocol_interface(Id(b8cb))\n             at crates/ty_python_semantic/src/types/protocol_class.rs:870\n   6: is_equivalent_to_object_inner(Id(a409))\n             at crates/ty_python_semantic/src/types/instance.rs:699\n   7: infer_deferred_types(Id(f5c9))\n             at crates/ty_python_semantic/src/types/infer.rs:145\n             cycle heads: is_equivalent_to_object_inner(Id(a404)) -> iteration = 200, cached_protocol_interface(Id(b84b)) -> iteration = 200, cached_protocol_interface(Id(b832)) -> iteration = 200, TypeVarInstance < 'db >::lazy_bound_(Id(9407)) -> iteration = 200\n   8: FunctionType < 'db >::signature_(Id(4451))\n             at crates/ty_python_semantic/src/types/function.rs:839\n   9: infer_definition_types(Id(f5c9))\n             at crates/ty_python_semantic/src/types/infer.rs:103\n  10: cached_protocol_interface(Id(b84b))\n             at crates/ty_python_semantic/src/types/protocol_class.rs:870\n             cycle heads: infer_definition_types(Id(f5c5)) -> iteration = 200\n  11: infer_deferred_types(Id(f5c5))\n             at crates/ty_python_semantic/src/types/infer.rs:145\n             cycle heads: is_equivalent_to_object_inner(Id(a404)) -> iteration = 200\n  12: FunctionType < 'db >::signature_(Id(444f))\n             at crates/ty_python_semantic/src/types/function.rs:839\n  13: infer_definition_types(Id(f5c5))\n             at crates/ty_python_semantic/src/types/infer.rs:103\n  14: cached_protocol_interface(Id(b832))\n             at crates/ty_python_semantic/src/types/protocol_class.rs:870\n  15: is_equivalent_to_object_inner(Id(a404))\n             at crates/ty_python_semantic/src/types/instance.rs:699\n  16: infer_definition_types(Id(cdf1))\n             at crates/ty_python_semantic/src/types/infer.rs:103\n  17: infer_definition_types(Id(cdf3))\n             at crates/ty_python_semantic/src/types/infer.rs:103\n  18: infer_deferred_types(Id(ce0a))\n             at crates/ty_python_semantic/src/types/infer.rs:145\n  19: TypeVarInstance < 'db >::lazy_bound_(Id(9408))\n             at crates/ty_python_semantic/src/types.rs:9708\n  20: infer_definition_types(Id(cdee))\n             at crates/ty_python_semantic/src/types/infer.rs:103\n  21: infer_deferred_types(Id(ce05))\n             at crates/ty_python_semantic/src/types/infer.rs:145\n  22: TypeVarInstance < 'db >::lazy_bound_(Id(9407))\n             at crates/ty_python_semantic/src/types.rs:9708\n  23: infer_definition_types(Id(680b))\n             at crates/ty_python_semantic/src/types/infer.rs:103\n  24: ClassLiteral < 'db >::implicit_attribute_inner_(Id(b406))\n             at crates/ty_python_semantic/src/types/class.rs:1524\n  25: Type < 'db >::member_lookup_with_policy_(Id(2c19))\n             at crates/ty_python_semantic/src/types.rs:881\n  26: infer_definition_types(Id(1405))\n             at crates/ty_python_semantic/src/types/infer.rs:103\n  27: infer_scope_types(Id(1002))\n             at crates/ty_python_semantic/src/types/infer.rs:69\n  28: check_file_impl(Id(c00))\n             at crates/ty_project/src/lib.rs:534\n```\n\n</details>\n\n## Environment\n\n- ty version: 0.0.4 (c1e6188b1 2025-12-18)\n- Platform: macOS aarch64 (Darwin 24.6.0)\n- Python: 3.11.12\n- narwhals: 2.1.2\n\n## Notes\n\nThe panic appears to be triggered by the combination of:\n1. A `Callable` type alias using `nw.LazyFrame` as both parameter and return type\n2. A function returning an instance of that Callable type\n3. The function body accessing `df._compliant_frame.native` and calling `nw.from_native(...).lazy()`\n\nRemoving any of these elements causes the panic to disappear.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2243/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2257",
      "id": 3767345849,
      "node_id": "I_kwDOOje-Bs7gjSK5",
      "number": 2257,
      "title": "Changes to files outside the project root aren't picked up by the server",
      "user": {
        "login": "rivershah",
        "id": 5272654,
        "node_id": "MDQ6VXNlcjUyNzI2NTQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5272654?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/rivershah",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-27T16:04:37Z",
      "updated_at": "2025-12-31T16:52:47Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I am inside a devcontainer. venvs are not being used.\npackages are being installed like this:\n`uv pip install --no-progress --compile-bytecode --system -r pyproject.toml`\n\n`ty` configuration in `devcontainer.json` is like this:\n\n```\n....\n        \"ty.configuration\": {\n          \"environment\": {\n            \"python\": \"/usr/local/bin/python\"\n          }\n        },\n....\n```\n\nCode navigation does not work till I force server restart:\n\n```\n2025-12-27 15:50:21.106301373  INFO Version: 0.0.6\n2025-12-27 15:50:21.299023590  INFO Defaulting to python-platform `linux`\n2025-12-27 15:50:21.299860040  INFO Python version: Python 3.12, platform: linux\n2025-12-27 15:50:22.552719729  INFO Indexed 69 file(s) in 0.006s\n2025-12-27 15:50:24.277865454  INFO Initializing the default project\n2025-12-27 15:50:24.280221553  INFO Defaulting to python-platform `linux`\n2025-12-27 15:50:24.280910303  INFO Python version: Python 3.14, platform: linux\n2025-12-27 15:51:04.646402464  INFO Defaulting to python-platform `linux`\n2025-12-27 15:51:04.646872401  INFO Python version: Python 3.12, platform: linux\n2025-12-27 15:53:32.730038234  INFO Indexed 69 file(s) in 0.007s\n2025-12-27 15:53:38.647198755  INFO Indexed 69 file(s) in 0.006s\n###### Code navigation is not working at this point\n2025-12-27 15:53:45.505586220  INFO Server shut down\n[Error - 3:53:45 PM] Server process exited with code 0.\n2025-12-27 15:53:45.574405173  INFO Version: 0.0.6\n2025-12-27 15:53:45.591334552  INFO Defaulting to python-platform `linux`\n2025-12-27 15:53:45.592182967  INFO Python version: Python 3.12, platform: linux\n2025-12-27 15:53:46.525817129  INFO Indexed 69 file(s) in 0.006s\n2025-12-27 15:54:20.960931926  INFO Initializing the default project\n2025-12-27 15:54:20.962718375  INFO Defaulting to python-platform `linux`\n2025-12-27 15:54:20.963330738  INFO Python version: Python 3.14, platform: linux\n2025-12-27 15:54:21.616495762  INFO Indexed 69 file(s) in 0.006s\n2025-12-27 15:55:18.696206614  INFO Defaulting to python-platform `linux`\n2025-12-27 15:55:18.696813328  INFO Python version: Python 3.12, platform: linux\n2025-12-27 15:56:00.597192961  INFO Indexed 69 file(s) in 0.007s\n###### Code navigation is working at this point\n```\n\nCan we please look into this for devcontainers.\n\n ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2257/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2233",
      "id": 3764163331,
      "node_id": "I_kwDOOje-Bs7gXJMD",
      "number": 2233,
      "title": "Try eliminating `~AlwaysFalsy` and `~AlwaysTruthy` from intersections if they don't immediately simplify out",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-27T00:27:23Z",
      "updated_at": "2025-12-27T00:27:23Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "They are rarely useful (this is a hypothesis -- to be confirmed or refuted by ecosystem tests), they make our displayed types more complex/confusing, and their tendency to preserve intersections instead of simpler types can cause other issues (e.g. most recently https://github.com/astral-sh/ty/issues/2200). Simplifying them out may improve performance due to more simple types instead of intersections (again a hypothesis to check on an actual PR.)\n\nThe easy approach here (good for a prototype PR to check the performance and ecosystem impact) would be to just strip them out in `IntersectionBuilder::build`.\n\nIf we decide we want to do this, the better approach might be to remove them entirely as `Type` variants, and replace with `Type::remove_always_truthy` and `Type::remove_always_falsy` transformers. (This will be easier if we update our narrowing support so that it can just return a new type, instead of only a type to intersect with.)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2233/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2232",
      "id": 3764100397,
      "node_id": "I_kwDOOje-Bs7gW50t",
      "number": 2232,
      "title": "No argument errors reported when a class is used as a decorator",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-26T22:55:23Z",
      "updated_at": "2026-01-04T22:25:09Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nFound this while messing around, if using a class as a decorator ty does not report any errors.\nhttps://play.ty.dev/d188d05e-e59b-44f7-8085-f180fd667424\n```py\nclass A: ...\n\n@A  # Should have a too-many-positional-arguments error\ndef foo(): ...\n\n@int  # Should have a invalid-argument-type error\ndef bar(): ...\n```\n\n### Version\n\nty 0.0.7 (cf82a04b5 2025-12-24) playground 9693375e1",
      "closed_by": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2232/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2230",
      "id": 3763747373,
      "node_id": "I_kwDOOje-Bs7gVjot",
      "number": 2230,
      "title": "Add / document support for Claude Code LSP integration",
      "user": {
        "login": "adamtheturtle",
        "id": 797801,
        "node_id": "MDQ6VXNlcjc5NzgwMQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/797801?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/adamtheturtle",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-12-26T17:05:23Z",
      "updated_at": "2026-01-08T13:40:35Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I see `pyright-lsp` on https://code.claude.com/docs/en/plugins-reference#lsp-servers and would be happy for Claude to use ty.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2230/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2229",
      "id": 3763675498,
      "node_id": "I_kwDOOje-Bs7gVSFq",
      "number": 2229,
      "title": "Narrowing to Any/Unknown loses type information",
      "user": {
        "login": "Decodetalkers",
        "id": 60290287,
        "node_id": "MDQ6VXNlcjYwMjkwMjg3",
        "avatar_url": "https://avatars.githubusercontent.com/u/60290287?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Decodetalkers",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        },
        "1": {
          "id": 8645345133,
          "node_id": "LA_kwDOOje-Bs8AAAACA01_bQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type-inference",
          "name": "type-inference",
          "color": "442A97",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-26T15:22:22Z",
      "updated_at": "2025-12-26T17:29:24Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom model import Perception\n\ndata = np.genfromtxt(\"perceptron_toydata.txt\", delimiter=\"\\t\")\nX: np.ndarray\nY: np.ndarray\nX, Y = data[:, :2], data[:, 2]\nY = Y.astype(np.int64)\n\nprint(\"Class label counts:\", np.bincount(Y))\nprint(\"X.shape:\", X.shape)\nprint(\"y.shape:\", Y.shape)\n\nshuffle_idx = np.arange(Y.shape[0])\nshuffle_rng = np.random.RandomState(123)\nshuffle_rng.shuffle(shuffle_idx)\nX = X[shuffle_idx]\nY = Y[shuffle_idx]\n\nX_train: np.ndarray\nX_test: np.ndarray\nY_train: np.ndarray\nY_test: np.ndarray\n\nX_train, X_test = X[shuffle_idx[:70]], X[shuffle_idx[70:]]\nY_train, Y_test = Y[shuffle_idx[:70]], Y[shuffle_idx[70:]]\n```\n\nSo I have already mark the X_train is np.ndarray, but the type hint did not work\n\n<img width=\"1147\" height=\"409\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/bb36032b-25f5-48d3-8253-966957760229\" />\n\n### Version\nty 0.0.7\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2229/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2227",
      "id": 3763576563,
      "node_id": "I_kwDOOje-Bs7gU57z",
      "number": 2227,
      "title": "Incorrect type inference for `bisect`",
      "user": {
        "login": "condemil",
        "id": 722990,
        "node_id": "MDQ6VXNlcjcyMjk5MA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/722990?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/condemil",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-26T14:42:17Z",
      "updated_at": "2025-12-26T17:11:30Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI see that ty cannot properly match types for `bisect` functions:\n\n```python\nimport bisect\n\ndef foo(number: int, ranges: list[tuple[int, float]]) -> None:\n    # Argument to function `bisect_right` is incorrect: Expected `SupportsLenAndGetItem[tuple[int, float]]`, found `list[tuple[int, int | float]]`\n    bisect.bisect_right(ranges, (number, float(\"inf\")))\n```\n\nThe similar issue happens for `ranges: list[tuple[int, int]]` type.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2227/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2222",
      "id": 3762282600,
      "node_id": "I_kwDOOje-Bs7gP-Bo",
      "number": 2222,
      "title": "Advanced type mapping operators",
      "user": {
        "login": "rasmusfiskerbang",
        "id": 25955484,
        "node_id": "MDQ6VXNlcjI1OTU1NDg0",
        "avatar_url": "https://avatars.githubusercontent.com/u/25955484?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/rasmusfiskerbang",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-12-25T18:58:31Z",
      "updated_at": "2025-12-26T10:05:32Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nHi,\n\nI cannot really find anything about the longer term ambition for ty. I know it is early days. Is the long term goal to give a similar feature set and developer experience as in typescript? \n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2222/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2221",
      "id": 3762193290,
      "node_id": "I_kwDOOje-Bs7gPoOK",
      "number": 2221,
      "title": "Improve error messages when narrowing fails",
      "user": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-25T16:48:53Z",
      "updated_at": "2026-01-09T03:32:58Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When strictly maintaining soundness, narrowing tends to produce results that are quite different from user intuition.\nUsers may not realize that this is due to the specifications of ty (or Python type system), and may consider it an incompleteness or a bug (e.g. https://github.com/astral-sh/ty/issues/2215).\nTherefore, if the cause of the error is thought to be a narrowing failure, it may be better to provide a hint as to why narrowing could not be applied.\nAlso, in some cases, alternatives can be suggested that make narrowing applicable (such as using `is` instead of `==`, typing explicitly, or marking the class as non-inheritable with `typing.final`).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2221/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2218",
      "id": 3761519309,
      "node_id": "I_kwDOOje-Bs7gNDrN",
      "number": 2218,
      "title": "Go-to-definition for a class returns both the `__init__` definition and the class itself",
      "user": {
        "login": "lkhphuc",
        "id": 12573521,
        "node_id": "MDQ6VXNlcjEyNTczNTIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/12573521?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/lkhphuc",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 7,
      "created_at": "2025-12-25T06:59:57Z",
      "updated_at": "2026-01-10T08:51:56Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen using the \"go to definition\" (in neovim) for a class, currently ty return 2 \"definitions\":\n- The class name line `class MyClass(...):`\n- and the init method `def __init__(self,...):`\n\nI'm not sure if this is by design or not, but other lsp (pyright) just return one definition `class MyClass` and thus the editor can jump directly to that definition.\nCurrent it unnecessary open a picker to pick the definition even though there's just one implementaton of that class.\n\n\n<img width=\"959\" height=\"100\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/661757f8-bf24-4b9f-bb3e-9bb97c8fa477\" />\n\n\n### Version\n\nty 0.0.5",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2218/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2205",
      "id": 3760369351,
      "node_id": "I_kwDOOje-Bs7gIq7H",
      "number": 2205,
      "title": "Improve the developer experience of working on ty",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        },
        "1": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-12-24T13:46:27Z",
      "updated_at": "2025-12-24T21:06:56Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We discussed in a recent ty planning meeting that it can sometimes feel a bit painful to work on ty right now as a developer. Things that we discussed which might help include:\n- Improving the typing-conformance workflow. All lines in the typing-conformance test suite where a type checker _should_ emit an error have an `# E` comment next to them; a type checker is not expected to emit an error on any other lines. It should therefore not be too hard to improve this workflow so that it automatically tells you whether a diagnostic being added or going away is a good or bad change.\n- Make the ecosystem-analyzer and/or mypy_primer workflow more \"positive\". If you've worked for several days on a PR, it can be a bit dispiriting to then be greeted with an overwhelming list of new diagnostics being emitted on the ecosystem that you have to dig through and analyze. It would be nice to also have more positive feedback, such as: \"You reduced the percentage of `@Todo` or `Unknown` types in the ecosystem by 37%, well done!\".\n- Make the ecosystem reports easier to analyze:\n  - Could we run other type checkers on this code as well, and also have an indication in the report about whether our diagnostics are in line with those of other type checkers? It's often useful to know that other type checkers also emit an error on a certain line of code.\n  - Fix https://github.com/astral-sh/ty/issues/1670\n\nWe didn't discuss it explicitly in the meeting, but I'd also add to this list:\n- Reduce the number of generated files that it's necessary to check in when making a PR. We're adding/removing/renaming/redocumenting diagnostics at a very quick velocity right now. Having to run `cargo dev generate-all` increases the amount of time it takes to prepare a PR (I have to compile a whole different crate locally before submitting it), and it's hard to remember to do it, so you often end up filing the PR, then only remembering to run `cargo dev generate-all` when CI starts to fail. Generating the `rules.md` docs and the `ty.schema.json` file feel like they could be done as part of the release workflow on this repository, rather than having to be checked in as part of PRs to the Ruff repository? Alternatively, we could look at whether these files could be generated automatically behind the scenes when running `mdtest.py` or `cargo test -p ty_python_semantic`; then you wouldn't have to remember to execute a separate command before filing the PR.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2205/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2202",
      "id": 3760226425,
      "node_id": "I_kwDOOje-Bs7gIIB5",
      "number": 2202,
      "title": "Improve test coverage for iterating over intersections of tuples",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-12-24T12:34:47Z",
      "updated_at": "2025-12-25T11:27:47Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I don't think we have full test coverage for all code paths in https://github.com/astral-sh/ruff/blob/81f34fbc8e404cd26fa40ee86a339947dce7617c/crates/ty_python_semantic/src/types/tuple.rs#L1794-L1867 currently (added in https://github.com/astral-sh/ruff/commit/0f18a08a0ae848c92bc5524cb17077a9968bbc69)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2202/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2200",
      "id": 3759781617,
      "node_id": "I_kwDOOje-Bs7gGbbx",
      "number": 2200,
      "title": "Conversion of `collections.abc.Collection[str] & ~AlwaysFalsy` to `set()` results in `set[Unknown]` instead of `set[str]`",
      "user": {
        "login": "sinon",
        "id": 146272,
        "node_id": "MDQ6VXNlcjE0NjI3Mg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/146272?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sinon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-24T09:28:59Z",
      "updated_at": "2025-12-27T00:28:28Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis builds upon the issue raised in:\nhttps://github.com/astral-sh/ty/issues/2060\n\nThe MRE I supplied of the real-world code elided a Falsey check, which does seem to disrupt the fix that was made for https://github.com/astral-sh/ty/issues/2060\n\nhttps://play.ty.dev/f980f01d-288a-48cc-a04a-759f80d74b9d\n```py\nfrom collections.abc import Collection\nfrom typing import Mapping, reveal_type\n\ndef something(mapping: Collection[str] | None = None):\n    if not mapping:\n        raise ValueError\n    reveal_type(mapping)  # Collection[str] & ~AlwaysFalsy\n    mapping = set(mapping)\n    reveal_type(mapping) # set[Unknown]\n```\n\n\n### Version\n\n0.0.6",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2200/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2199",
      "id": 3759548912,
      "node_id": "I_kwDOOje-Bs7gFinw",
      "number": 2199,
      "title": "Speed-up `ty_python_semantic` compile time",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-24T07:55:54Z",
      "updated_at": "2025-12-24T08:01:23Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961576,
        "node_id": "IT_kwDOBulz184BEhJo",
        "name": "Task",
        "description": "A specific piece of work",
        "color": "yellow",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "`ty_python_semantic` is by far the slowest to-compile crate in ty (and it's in the critical path too). \n\nWhat stands out to me from looking at the timing report (`RUSTC_BOOTSTRAP=1 RUSTFLAGS=\"-Ztime-passes\" cargo build -p ty_python_semantic`)\n\n```\n   Compiling ty_python_semantic v0.0.0 (/Users/micha/astral/ruff/crates/ty_python_semantic)\ntime:   0.000; rss:  313MB ->  313MB (   +0MB)\tfind_cgu_reuse\ntime:   0.000; rss:   73MB ->   74MB (   +1MB)\tparse_crate\ntime:   0.000; rss:   75MB ->   75MB (   +0MB)\tincr_comp_prepare_session_directory\ntime:   0.000; rss:   75MB ->   75MB (   +0MB)\tincr_comp_garbage_collect_session_directories\ntime:   0.000; rss:   80MB ->   80MB (   +0MB)\tcrate_injection\ntime:   0.534; rss:  313MB ->  397MB (  +84MB)\tcodegen_to_LLVM_IR\ntime:   0.543; rss:  308MB ->  397MB (  +89MB)\tcodegen_crate\ntime:   0.000; rss:  398MB ->  398MB (   +0MB)\tassert_dep_graph\ntime:   0.000; rss:  398MB ->  398MB (   +1MB)\tincr_comp_persist_dep_graph\ntime:   0.474; rss:  335MB ->  397MB (  +62MB)\tLLVM_passes\ntime:   0.009; rss:  399MB ->  395MB (   -3MB)\tencode_query_results\ntime:   0.010; rss:  399MB ->  395MB (   -3MB)\tincr_comp_serialize_result_cache\ntime:   0.010; rss:  398MB ->  395MB (   -3MB)\tincr_comp_persist_result_cache\ntime:   0.010; rss:  398MB ->  395MB (   -2MB)\tserialize_dep_graph\ntime:   0.000; rss:  312MB ->  312MB (   +0MB)\tjoin_worker_thread\ntime:   0.035; rss:  312MB ->  312MB (   +0MB)\tcopy_all_cgu_workproducts_to_incr_comp_cache_dir\ntime:   0.035; rss:  312MB ->  312MB (   +0MB)\tfinish_ongoing_codegen\ntime:   0.000; rss:  312MB ->  312MB (   +0MB)\tserialize_work_products\ntime:   0.012; rss:  312MB ->  314MB (   +2MB)\tlink_rlib\ntime:   0.013; rss:  312MB ->  314MB (   +2MB)\tlink_binary\ntime:   0.013; rss:  312MB ->  313MB (   +1MB)\tlink_crate\ntime:   0.014; rss:  312MB ->  313MB (   +1MB)\tlink\ntime:   1.572; rss:   21MB ->  117MB (  +97MB)\ttotal\ntime:   0.520; rss:   80MB ->  297MB ( +217MB)\texpand_crate\ntime:   0.520; rss:   80MB ->  297MB ( +217MB)\tmacro_expand_crate\ntime:   0.006; rss:  297MB ->  297MB (   +0MB)\tAST_validation\ntime:   0.002; rss:  297MB ->  298MB (   +1MB)\tfinalize_imports\ntime:   0.001; rss:  298MB ->  298MB (   +0MB)\tcompute_effective_visibilities\ntime:   0.000; rss:  298MB ->  298MB (   +0MB)\tlint_reexports\ntime:   0.004; rss:  298MB ->  299MB (   +1MB)\tfinalize_macro_resolutions\ntime:   0.079; rss:  299MB ->  343MB (  +44MB)\tlate_resolve_crate\ntime:   0.005; rss:  343MB ->  343MB (   +0MB)\tresolve_check_unused\ntime:   0.006; rss:  343MB ->  343MB (   +0MB)\tresolve_postprocess\ntime:   0.098; rss:  297MB ->  343MB (  +46MB)\tresolve_crate\ntime:   0.004; rss:  343MB ->  344MB (   +0MB)\twrite_dep_info\ntime:   0.003; rss:  344MB ->  344MB (   +0MB)\tcomplete_gated_feature_checking\ntime:   0.024; rss:  424MB ->  424MB (   +0MB)\tdrop_ast\ntime:   0.000; rss:  406MB ->  406MB (   +0MB)\tlooking_for_entry_point\ntime:   0.001; rss:  406MB ->  406MB (   +0MB)\tlooking_for_derive_registrar\ntime:   0.036; rss:  406MB ->  402MB (   -5MB)\tmisc_checking_1\ntime:   0.464; rss:  402MB ->  517MB ( +115MB)\tcoherence_checking\ntime:   1.725; rss:  402MB ->  678MB ( +276MB)\ttype_check_crate\ntime:   1.829; rss:  678MB ->  893MB ( +215MB)\tMIR_borrow_checking\ntime:   0.054; rss:  898MB ->  901MB (   +2MB)\tmodule_lints\ntime:   0.054; rss:  898MB ->  901MB (   +2MB)\tlint_checking\ntime:   0.053; rss:  901MB ->  901MB (   +1MB)\tprivacy_checking_modules\ntime:   0.000; rss:  901MB ->  901MB (   +0MB)\tcheck_lint_expectations\ntime:   0.141; rss:  893MB ->  901MB (   +8MB)\tmisc_checking_3\ntime:   0.002; rss:  956MB ->  956MB (   +0MB)\tmonomorphization_collector_root_collections\ntime:   1.801; rss:  956MB -> 1250MB ( +295MB)\tmonomorphization_collector_graph_walk\ntime:   0.248; rss: 1253MB -> 1290MB (  +37MB)\tpartition_and_assert_distinct_symbols\ntime:   2.255; rss:  901MB -> 1259MB ( +358MB)\tgenerate_crate_metadata\ntime:   0.000; rss: 1264MB -> 1265MB (   +0MB)\tfind_cgu_reuse\ntime:   5.518; rss: 1265MB -> 1806MB ( +541MB)\tcodegen_to_LLVM_IR\ntime:   5.532; rss: 1259MB -> 1806MB ( +547MB)\tcodegen_crate\ntime:   0.000; rss: 1806MB -> 1806MB (   +0MB)\tassert_dep_graph\ntime:   0.000; rss: 1806MB -> 1807MB (   +0MB)\tincr_comp_persist_dep_graph\ntime:   4.966; rss: 1437MB -> 1803MB ( +366MB)\tLLVM_passes\ntime:   0.110; rss: 1807MB -> 1810MB (   +3MB)\tencode_query_results\ntime:   0.124; rss: 1807MB -> 1797MB (  -10MB)\tincr_comp_serialize_result_cache\ntime:   0.124; rss: 1807MB -> 1797MB (  -10MB)\tincr_comp_persist_result_cache\ntime:   0.124; rss: 1806MB -> 1797MB (   -9MB)\tserialize_dep_graph\ntime:   0.000; rss: 1246MB -> 1246MB (   +0MB)\tjoin_worker_thread\ntime:   0.070; rss: 1246MB -> 1246MB (   +0MB)\tcopy_all_cgu_workproducts_to_incr_comp_cache_dir\ntime:   0.070; rss: 1246MB -> 1246MB (   +0MB)\tfinish_ongoing_codegen\ntime:   0.000; rss: 1246MB -> 1246MB (   +0MB)\tserialize_work_products\ntime:   0.117; rss: 1237MB -> 1244MB (   +6MB)\tlink_rlib\ntime:   0.119; rss: 1237MB -> 1244MB (   +6MB)\tlink_binary\ntime:   0.119; rss: 1237MB -> 1228MB (   -9MB)\tlink_crate\ntime:   0.120; rss: 1246MB -> 1228MB (  -18MB)\tlink\ntime:  12.826; rss:   21MB ->  127MB ( +107MB)\ttotal\n```\n\nis that rustcs spends about 2s doing monomorphization:\n\n```\ntime:   1.801; rss:  956MB -> 1250MB ( +295MB)\tmonomorphization_collector_graph_walk\n```\n\nwhich I suspect also leads to a lot of extra work in `codegen` and `LLVM_passes`. \n\nThe output of `cargo llvm-lines` stronlgy suggest that a lot of monomorphization happens in Salsa tracked functions (not very surprisingly)\n\n```\n  Lines                  Copies               Function name\n  -----                  ------               -------------\n  3501590                88125                (TOTAL)\n   128787 (3.7%,  3.7%)   2004 (2.3%,  2.3%)  std::thread::local::LocalKey<T>::try_with\n   125930 (3.6%,  7.3%)   3598 (4.1%,  6.4%)  tracing_core::dispatcher::get_default::{{closure}}\n   119935 (3.4%, 10.7%)     71 (0.1%,  6.4%)  salsa::function::execute::<impl salsa::function::IngredientImpl<C>>::execute_maybe_iterate\n    97824 (2.8%, 13.5%)   1278 (1.5%,  7.9%)  salsa::function::execute::<impl salsa::function::IngredientImpl<C>>::execute_maybe_iterate::{{closure}}\n    67890 (1.9%, 15.4%)     73 (0.1%,  8.0%)  salsa::interned::IngredientImpl<C>::intern_id\n    59367 (1.7%, 17.1%)   1799 (2.0%, 10.0%)  tracing_core::dispatcher::get_default\n    44009 (1.3%, 18.4%)   1842 (2.1%, 12.1%)  core::result::Result<T,E>::unwrap_or_else\n    43455 (1.2%, 19.6%)     87 (0.1%, 12.2%)  <core::iter::adapters::flatten::FlattenCompat<I,U> as core::iter::traits::iterator::Iterator>::size_hint\n    42811 (1.2%, 20.8%)    528 (0.6%, 12.8%)  core::iter::traits::iterator::Iterator::try_fold\n    41180 (1.2%, 22.0%)    568 (0.6%, 13.4%)  salsa::function::execute::<impl salsa::function::IngredientImpl<C>>::execute_maybe_iterate::{{closure}}::{{closure}}\n    39400 (1.1%, 23.1%)    560 (0.6%, 14.1%)  salsa::function::fetch::<impl salsa::function::IngredientImpl<C>>::fetch_cold_cycle::{{closure}}\n    39129 (1.1%, 24.3%)   2035 (2.3%, 16.4%)  core::ops::function::FnOnce::call_once\n    34399 (1.0%, 25.2%)    352 (0.4%, 16.8%)  <alloc::vec::Vec<T> as alloc::vec::spec_from_iter_nested::SpecFromIterNested<T,I>>::from_iter\n    33331 (1.0%, 26.2%)     71 (0.1%, 16.9%)  salsa::function::execute::<impl salsa::function::IngredientImpl<C>>::execute\n    29296 (0.8%, 27.0%)     70 (0.1%, 16.9%)  salsa::function::fetch::<impl salsa::function::IngredientImpl<C>>::fetch_cold_cycle\n    28480 (0.8%, 27.9%)     71 (0.1%, 17.0%)  salsa::function::maybe_changed_after::<impl salsa::function::IngredientImpl<C>>::deep_verify_memo\n    28158 (0.8%, 28.7%)     71 (0.1%, 17.1%)  salsa::function::maybe_changed_after::<impl salsa::function::IngredientImpl<C>>::maybe_changed_after_cold\n    27173 (0.8%, 29.4%)    257 (0.3%, 17.4%)  <core::slice::iter::Iter<T> as core::iter::traits::iterator::Iterator>::fold\n    26128 (0.7%, 30.2%)    284 (0.3%, 17.7%)  salsa::function::maybe_changed_after::<impl salsa::function::IngredientImpl<C>>::shallow_verify_memo::{{closure}}\n```\n\nMost notably `execute_maybe_iterate`, which accounts for 3.4% of all the code. \n\nWe should look into how we can reduce the amount of monomorphized code in Salsa to improve compile times. \n\nUpstream issue https://github.com/salsa-rs/salsa/issues/1042\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2199/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2198",
      "id": 3759459762,
      "node_id": "I_kwDOOje-Bs7gFM2y",
      "number": 2198,
      "title": "Invalid diagnostic location for a sub-call to a specialized `ParamSpec`",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-24T07:17:27Z",
      "updated_at": "2025-12-24T07:19:14Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nGiven the following example:\n```py\nfrom typing import Callable\n\ndef fn(a: int) -> None: ...\n\ndef foo[**P, T](fn: Callable[P, T], *args: P.args, **kwargs: P.kwargs): ...\n\nfoo(fn, a=\"a\")\n```\n\nThe diagnostic is using the location for `fn` for highlighting on `foo`:\n\n```console\n❯ ty check .                                                          \nerror[invalid-argument-type]: Argument to function `foo` is incorrect\n  --> main.py:10:5\n   |\n10 | foo(fn, a=\"a\")\n   |     ^^ Expected `int`, found `Literal[\"a\"]`\n   |\ninfo: Function defined here\n --> main.py:7:5\n  |\n7 | def foo[**P, T](fn: Callable[P, T], *args: P.args, **kwargs: P.kwargs): ...\n  |     ^^^         ------------------ Parameter declared here\n  |\ninfo: rule `invalid-argument-type` is enabled by default\n\nFound 1 diagnostic\n```\n\n- The \"Expected `...`, found `...`\" should be on `\"a\"`\n- It should use the `fn` function directly for the info diagnostic of \"Function defined here\"\n- And, provide a sub-diagnostic / info to state that this function comes from the argument being matched against a `ParamSpec` type variable which resolved to this function\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2198/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2193",
      "id": 3758558084,
      "node_id": "I_kwDOOje-Bs7gBwuE",
      "number": 2193,
      "title": "support externally patching methods on instances",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9597629813,
          "node_id": "LA_kwDOOje-Bs8AAAACPBA1dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/callables",
          "name": "callables",
          "color": "5d4406",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-23T21:04:18Z",
      "updated_at": "2025-12-24T13:04:42Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Initially reported at https://github.com/astral-sh/ty/issues/2134\n\nWe should support patching a method on an instance, if the replacement has compatible signature.\n\nhttps://play.ty.dev/80fd5a68-8c7d-4e73-b5e8-6906a9f9bf61\n\n```py\nclass RateLimiter:\n    def check_limit(self) -> bool:\n        return True\n\ndef test_lambda_stub_method():\n    rl = RateLimiter()\n\n    # Common pattern: stub method with lambda to control return value\n    rl.check_limit = lambda: False  # ty: invalid-assignment\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2193/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2192",
      "id": 3758371477,
      "node_id": "I_kwDOOje-Bs7gBDKV",
      "number": 2192,
      "title": "support \"tagged union\" narrowing via enum literal tags",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        },
        "1": {
          "id": 9596740363,
          "node_id": "LA_kwDOOje-Bs8AAAACPAKjCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typeddict",
          "name": "typeddict",
          "color": "46775a",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-23T19:42:07Z",
      "updated_at": "2026-01-04T18:47:42Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We currently support \"tagged union\" narrowing of TypedDicts via string/bytes/int literals. We should also support fields whose value is an enum literal. (We need to watch out for enums that override `__eq__`.)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2192/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2190",
      "id": 3758181017,
      "node_id": "I_kwDOOje-Bs7gAUqZ",
      "number": 2190,
      "title": "support generic TypedDict",
      "user": {
        "login": "RyanSaxe",
        "id": 2286292,
        "node_id": "MDQ6VXNlcjIyODYyOTI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2286292?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/RyanSaxe",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 9596740363,
          "node_id": "LA_kwDOOje-Bs8AAAACPAKjCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typeddict",
          "name": "typeddict",
          "color": "46775a",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-12-23T18:26:39Z",
      "updated_at": "2025-12-23T21:23:24Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nTypeVars do not seem to be properly handled inside TypedDicts\n\n```python\nfrom typing import TypedDict, reveal_type\n\n\nclass TestDictExample[T](TypedDict):\n    id: int\n    name: str\n    active: bool\n    bug: T\n\n\nclass Example[T]:\n    def __init__(self, data: TestDictExample[T]) -> None:\n        self.attr: TestDictExample[T] = data\n\n    def do_something(self) -> T:\n        value = self.attr[\"bug\"] # ty thinks this is Unknown instead of T\n        name = self.attr[\"name\"] # ty correctly gets this as str\n        return value\n```\n\nhttps://play.ty.dev/fa58789a-4d72-4f76-802d-7dafe74e52b8\n\n### Version\n\nty 0.0.5",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2190/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2189",
      "id": 3758167904,
      "node_id": "I_kwDOOje-Bs7gARdg",
      "number": 2189,
      "title": "Add autocompletions for TypedDict keys",
      "user": {
        "login": "RyanSaxe",
        "id": 2286292,
        "node_id": "MDQ6VXNlcjIyODYyOTI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2286292?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/RyanSaxe",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        },
        "2": {
          "id": 9596740363,
          "node_id": "LA_kwDOOje-Bs8AAAACPAKjCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typeddict",
          "name": "typeddict",
          "color": "46775a",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-23T18:21:04Z",
      "updated_at": "2025-12-23T21:23:39Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThere are no completions for the key values when the type is a TypedDict. I have confirmed that this does not happen on the playground as well as my editor.\n\nHere is a simple playground to explore yourself: https://play.ty.dev/8f17cad1-eee9-4ba2-bec6-abf9aef19ae5\n\n### Version\n\nty 0.0.5",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2189/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2188",
      "id": 3758019270,
      "node_id": "I_kwDOOje-Bs7f_tLG",
      "number": 2188,
      "title": "Improve predictability of instance attribute type inference",
      "user": {
        "login": "wvanbergen",
        "id": 15870,
        "node_id": "MDQ6VXNlcjE1ODcw",
        "avatar_url": "https://avatars.githubusercontent.com/u/15870?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/wvanbergen",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        },
        "1": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-12-23T17:12:55Z",
      "updated_at": "2025-12-27T06:50:11Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nUnrelated code in a  initializer appears to prevent type narrowing. Example:\n\n``` python\nclass Foo:\n    def bar(self) -> None:\n        # revealed type changes to `Literal[True]` if you comment out any of these lines related to _unrelated\n        if hasattr(self, \"_unrelated\"):\n            return\n        self._unrelated = True\n\n        self._b: bool | None = None    \n        self._b = True\n        reveal_type(self._b)  # bool | None, expected Literal[True]\n```\n\nIf you comment out any of the `_unrelated` lines, it changes to `Literal[True]`.\n\nThis behaviour seems to be specific to it being an instance method. For a regular function, the type narrowing never happens.\n\n- Playground recreation: https://play.ty.dev/c43a9722-ed99-4749-92d3-ada996276c66\n- mypy evaluates it as `builtins.bool`: https://mypy-play.net/?mypy=latest&python=3.12&gist=a2789d2ba9c6b0c511c577bba939e150\n- Running `uvx ty check`, no `ty` related settings in `pyproject.toml`\n\n### Version\n\nty 0.0.5 (d37b7dbd9 2025-12-20)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2188/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2184",
      "id": 3757217338,
      "node_id": "I_kwDOOje-Bs7f8pY6",
      "number": 2184,
      "title": "Showing annotated `float` as `int | float` might not be right",
      "user": {
        "login": "cmp0xff",
        "id": 5564164,
        "node_id": "MDQ6VXNlcjU1NjQxNjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5564164?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/cmp0xff",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 9,
      "created_at": "2025-12-23T12:26:43Z",
      "updated_at": "2025-12-29T22:07:21Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n- [`Y041` in `flake8`](https://pypi.org/project/flake8-pyi/22.7.0/) marks `float | int` as redundant\n- [PEP484](https://peps.python.org/pep-0484/#the-numeric-tower) suggests `float` contains `int`\n- `mypy`, `pyright` and [`pyrefly`](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEALqcROgOZ0Q3G6UN2UYANxiooAfSbEYAHSwwwdMLlwAKAJR0AtAD4lUXKgaI5dMwJgMArpXR0AjHLmCRYycxirla9erkgAGhArBmg4EnJEEABiOgBVUKgIJiUrdABjUNx0OCd5RWVKGiNxdCsabBhKVXxETnQGTV06OAZKEztzQWtbJRkQADlyyva6YHwAX37-ILJBMChSQgZaKApYgAVSecWWjBwCOnTsyDYbIwhswjlYgGUYGDoACwYGYjhEAHpPuYVFwl4bE%2BMHQn0wuHScE%2Bx3Qp3OWVBSl4dFQQlQ0FQ2FgRxOEDOlAu2TouGICPCcjIDCe2S0IkocEudgAvHR%2BgBmQj2ABM03QIAmQVQmQgIgAYtAYBQ0Fg8EQyPygA) show annotated `float` as `float`\n- However, [`ty`](https://play.ty.dev/6d776ddf-569d-4a56-b8b1-2c2d73166635) shows annotated `float` as `int | float`\n\n```py\nfrom typing import reveal_type\ndef foo() -> float:\n    return 1\n\nreveal_type(foo())  # ty shows int | float\n```\n\n### Version\n\n5ea30c4c5",
      "closed_by": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2184/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2182",
      "id": 3756731196,
      "node_id": "I_kwDOOje-Bs7f6ys8",
      "number": 2182,
      "title": "Problem inferring nested generic classes with defaults",
      "user": {
        "login": "cmp0xff",
        "id": 5564164,
        "node_id": "MDQ6VXNlcjU1NjQxNjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5564164?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/cmp0xff",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-23T09:30:15Z",
      "updated_at": "2026-01-08T18:04:06Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n`ty` cannot infer nested generic classes with default values properly.\n\nhttps://play.ty.dev/4ec45154-7726-41f8-b65c-920188c3c124\n\n```py\nfrom typing import Any, Generic\nfrom collections.abc import Sequence\nfrom typing_extensions import TypeVar, Self, reveal_type\n\n_OrderableT = TypeVar(\"_OrderableT\", default=Any)\n\nclass Interval(Generic[_OrderableT]):\n    def __new__(cls, left: _OrderableT, right: _OrderableT) -> Self:\n        return cls()\n\nIntervalT = TypeVar(\"IntervalT\", bound=Interval, default=Interval)\n\nS2 = TypeVar(\"S2\")\n\nclass IntervalIndex(Generic[S2]):\n    def __new__(cls, data: Sequence[IntervalT]) -> \"IntervalIndex[IntervalT]\":\n        return cls()\n\nreveal_type(Interval(0, 1))  # type checkers all give Interval[int]\nreveal_type(IntervalIndex([Interval(0, 1)]))  # mypy gives IntervalIndex[Interval[int]], ty gives IntervalIndex[Unknown]\n```\n\n### Version\n\n5ea30c4c5",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2182/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2180",
      "id": 3756638150,
      "node_id": "I_kwDOOje-Bs7f6b_G",
      "number": 2180,
      "title": "Find references runs out of memory",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-23T09:01:30Z",
      "updated_at": "2025-12-31T16:35:59Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n> With the language server, I accidentally did a \"show all references\" on logging and it kept going until it ran out of memory. I'm new to LSPs so I don't know if it's the fault of the vim plugin I'm using or ty for not stopping when the list length became unreasonable\n\nOriginally reported [on Discord](https://discord.com/channels/1039017663004942429/1279201882337705994/1452934695871582208)\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2180/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2175",
      "id": 3755651966,
      "node_id": "I_kwDOOje-Bs7f2rN-",
      "number": 2175,
      "title": "Validate that the type of a variable/attribute/subscript remains consistent with its declared type following an augmented assignment operation",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-23T00:47:29Z",
      "updated_at": "2025-12-23T11:05:18Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHopefully this is a new issue, couldn't find anything on it searching for `iadd` or `inplace`\nhttps://play.ty.dev/b3f4aadb-fd45-4ba2-99d2-5ad1475ef3ef\n```py\nfrom typing import reveal_type\n\nclass A:\n    def __add__(self, other: object) -> object:\n        return other\n\nclass B:\n    def __init__(self, x: A):\n        self.x: A = x\n\nc = B(A())\nreveal_type(c.x)  # Revealed type: `A`\nc.x += 1  # Should be an error\nreveal_type(c.x)  # Revealed type: `object` :(\nc.x = object()  # But a normal assignment correctly still fails\n```\n\n### Version\n\nty 0.0.5 (d37b7dbd9 2025-12-20) playground 664686bdb",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2175/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2171",
      "id": 3755015514,
      "node_id": "I_kwDOOje-Bs7f0P1a",
      "number": 2171,
      "title": "emit a diagnostic on unsafe dunder method overrides on tuple subclasses",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "1": {
          "id": 9331274371,
          "node_id": "LA_kwDOOje-Bs8AAAACLC_ygw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/unsoundness",
          "name": "unsoundness",
          "color": "9aa952",
          "default": false,
          "description": "Ty can give an expression type T, but at runtime it can have a non-T value, with no diagnostic."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-12-22T19:50:43Z",
      "updated_at": "2025-12-22T23:40:18Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We do (or want to do) various kinds of narrowing on tuples (see #215, #560, #2140), but the `tuple` type includes tuple subclasses, so making these narrowings sound requires assuming that tuple subclasses don't override `__len__`, `__bool__`, or `__eq__`. We should emit a diagnostic if they do.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2171/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2169",
      "id": 3754859242,
      "node_id": "I_kwDOOje-Bs7fzprq",
      "number": 2169,
      "title": "Add ability to hide all warnings",
      "user": {
        "login": "tino",
        "id": 99524,
        "node_id": "MDQ6VXNlcjk5NTI0",
        "avatar_url": "https://avatars.githubusercontent.com/u/99524?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tino",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "2": {
          "id": 8568528024,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlcmA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-info",
          "name": "needs-info",
          "color": "FBCA04",
          "default": false,
          "description": "More information is needed from the issue author"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-12-22T18:54:10Z",
      "updated_at": "2025-12-31T15:44:56Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I just want to focus on errors for now. I guess I can look up all the warning rules and call `--ignore <RULE>` for each but that's a bit tedious.\n\n`| grep -v warning` works for the concise output format, but having a `--errors-only` or something like it would still be very nice!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2169/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2168",
      "id": 3754618051,
      "node_id": "I_kwDOOje-Bs7fyuzD",
      "number": 2168,
      "title": "Find fatals by fuzzing ty on scripts containing invalid syntax",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-12-22T17:32:44Z",
      "updated_at": "2026-01-09T03:32:35Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961576,
        "node_id": "IT_kwDOBulz184BEhJo",
        "name": "Task",
        "description": "A specific piece of work",
        "color": "yellow",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": null,
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2168/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2162",
      "id": 3754203932,
      "node_id": "I_kwDOOje-Bs7fxJsc",
      "number": 2162,
      "title": "Bidirectional inference fails in assignments that use unpacking",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        },
        "1": {
          "id": 9596740363,
          "node_id": "LA_kwDOOje-Bs8AAAACPAKjCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typeddict",
          "name": "typeddict",
          "color": "46775a",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-22T15:27:00Z",
      "updated_at": "2025-12-23T06:14:26Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "E.g.\n\n```py\nfrom typing import TypedDict\n\nclass Foo(TypedDict):\n    x: int\n\nx: Foo\n\n# error: Object of type `dict[Unknown | str, Unknown | int]` is not assignable to `Foo`\nx, _ = {\"x\": 42}, 56\n```\n\nProbably not a top priority, but an inconsistency I noticed when looking at https://github.com/astral-sh/ty/issues/2161",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2162/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2161",
      "id": 3754193488,
      "node_id": "I_kwDOOje-Bs7fxHJQ",
      "number": 2161,
      "title": "Support dict literals and `dict()` calls as default values for parameters annotated with `TypedDict` types",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-22T15:23:59Z",
      "updated_at": "2025-12-22T16:37:36Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nOriginally reported by @mflova in https://github.com/astral-sh/ty/issues/2127#issuecomment-3678156698. We should be able to use the type context of the parameter annotation to avoid emitting a diagnostic on either of these:\n\n```py\nfrom typing import TypedDict\n\nclass Foo(TypedDict):\n    x: int\n\ndef x(a: Foo = {\"x\": 42}): ...\ndef y(a: Foo = dict(x=42)): ...\n```\n\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2161/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2160",
      "id": 3753993557,
      "node_id": "I_kwDOOje-Bs7fwWVV",
      "number": 2160,
      "title": "Detect invalid attempts to override `@property`s with mutable attributes",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-22T14:25:45Z",
      "updated_at": "2025-12-23T11:35:24Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "From the perspective of the Liskov Substitution Principle, this is fine[^1], because the attribute on the subclass can do strictly more than the attribute on the superclass (it's read-only on the superclass, but it's writable on the subclass!).\n\nHowever, overriding a property like this doesn't actually make the attribute writable at runtime -- so we should detect the unsoundness here:\n\n```pycon\n>>> class A:\n...     @property\n...     def f(self): ...\n...     \n>>> class B(A):\n...     f: int\n...     \n>>> B().f = 42\nTraceback (most recent call last):\n  File \"<python-input-11>\", line 1, in <module>\n    B().f = 42\n    ^^^^^\nAttributeError: property 'f' of 'B' object has no setter\n```\n\nIn order to make a read-only property in the superclass writable, you _must_ providing an overriding _definition_ in the class body, not just an overriding _declaration_. This works:\n\n```py\nclass A:\n    @property\n    def f(self): ...\n\nclass B(A):\n    @property\n    def f(self): ...\n\n    @f.setter\n    def f(self, value): ...\n```\n\nAs does this:\n\n```py\nclass A:\n    @property\n    def f(self): ...\n\nclass B(A):\n    @A.f.setter\n    def f(self, value): ...\n```\n\nAnd this too (but see footnote 1 for some caveats):\n\n```py\nclass A:\n    @property\n    def f(self) -> int:\n        return 42\n\nclass B(A):\n    f: int = 42\n```\n\nbut this also doesn't work:\n\n```py\nclass A:\n    @property\n    def f(self) -> int:\n        return 42\n\nclass B(A):\n    def __init__(self):\n        self.x: int = 42\n```\n\nThis should also be disallowed, since all fields on `NamedTuple`s are implicitly `@property`s:\n\n```py\nfrom typing import NamedTuple\n\nclass A(NamedTuple):\n    x: int\n\nclass B(A):\n    x: int\n```\n\nbut I think this should be fine (though pyright and pyrefly seem to disallow it, for some reason). If we do want to disallow it, I think it should be because of the caveat outlined in footnote (1) rather than because of the runtime error described above, because there's no runtime error here:\n\n```py\nfrom typing import NamedTuple\n\nclass A(NamedTuple):\n    x: int\n\nclass B(A):\n    x: int = 42\n```\n\n[^1]: Well, it's fine if you only consider the type when accessed from instances. It's not fine if you also consider the type as accessed from the class object. But anyway, I don't think that's the most important thing that's wrong about this override, so I don't think it's the thing we should actually complain about.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2160/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2158",
      "id": 3753885454,
      "node_id": "I_kwDOOje-Bs7fv78O",
      "number": 2158,
      "title": "Enforce the Liskov Substitution Principle for non-methods",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-22T13:54:58Z",
      "updated_at": "2025-12-22T14:07:37Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We have implemented a basic version of the Liskov Substitution Principle to cover cases where methods are incompatibly overridden in subclasses. We also need to implement separate diagnostics to cover properties incompatibly overridden in subclasses, and mutable attributes incompatibly overridden in subclasses.\n\nThe reason why these are planned as separate diagnostics is because a large amount of code in the ecosystem unsoundly overrides mutable attributes covariantly, e.g.\n\n```py\nclass A:\n    x: int\n\nclass B(A):\n    x: bool\n```\n\nPartly this is because mypy allowed this for years -- and still does, unless users explicitly opt into the `mutable-override` error code. Implementing these as separate diagnostics to our existing `invalid-method-override` diagnostic will therefore allow users to switch the mutable-attribute-override rule off specifically if it causes a large number of diagnostics on their code.\n\n---\n\nSub-tasks (many of these may share a common implementation):\n\n- [ ] Enforce Liskov for property types: this should cause us to emit a diagnostic:\n    ```py\n    class A:\n        @property\n        def f(self) -> int:\n            return 42\n\n    class B(A):\n        @property\n        def f(self) -> str:  ❌ Superclass returns `int`, subclass returns `str`, `str` is not a subtype of `int`\n            return \"42\"\n    ```\n\n- [ ] Enforce that a writable attribute cannot be overridden with a read-only property:\n    ```py\n    class A:\n        x: int\n\n    class B(A):\n        @property\n        def x(self) -> int:  ❌ Superclass attribute is writable, subclass attribute is read-only\n            return 42\n    ```\n\n    and\n\n    ```py\n    class A:\n        @property\n        def x(self) -> int:\n            return 42\n\n        @x.setter\n        def x(self, value: int) -> None: ...\n\n    class B(A):\n        @property\n        def x(self) -> int:  ❌ Superclass attribute is writable, subclass attribute is read-only\n            return 42\n    ```\n\n- [ ] Enforce Liskov for attribute types:\n    ```py\n    class A:\n        x: int\n\n    class B(A):\n        x: bool  ❌ Type of `x` attribute is invariant because it is mutable\n    ```\n\n- [ ] Enforce that a non-`Final` attribute cannot be overridden with a `Final` one\n    ```py\n    from typing import Final\n\n    class A:\n        x: int\n\n    class B(A):\n        x: Final[int]  ❌ Superclass attribute is writable, subclass attribute is read-only\n    ```\n\n- [ ] Enforce that a non-`ClassVar` attribute cannot be overridden with a `ClassVar` attribute:\n    ```py\n    from typing import ClassVar\n\n    class A:\n        x: int\n\n    class B(A):\n        x: ClassVar[int]  ❌ Superclass attribute is writable on instances, subclass attribute is not\n    ```\n\n- [ ] Enforce that a `ClassVar` attribute cannot be overridden with an implicit instance attribute, since `ClassVar`s can be mutated on the class object itself but implicit instance attributes cannot:\n    ```py\n    from typing import ClassVar\n\n    class A:\n        x: ClassVar[int]\n\n    class B(A):\n        def __init__(self):\n            self.x: int  ❌ Superclass attribute is writable on the class object, subclass attribute is not\n    ```\n\n- [ ] Enforce that a non-`ReadOnly` `TypedDict` field cannot be overridden with a `ReadOnly` `TypedDict` field:\n    ```py\n    from typing import TypedDict, ReadOnly\n\n    class A(TypedDict):\n        x: int\n\n    class B(A):\n        x: ReadOnly[int]  ❌ Superclass field is writable, subclass attribute is read-only\n    ```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2158/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2156",
      "id": 3753727161,
      "node_id": "I_kwDOOje-Bs7fvVS5",
      "number": 2156,
      "title": "Extend `invalid-method-override` diagnostics to cover methods being overridden by non-methods",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-22T13:00:12Z",
      "updated_at": "2025-12-22T17:26:11Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We have a basic implementation of the Liskov Substitution Principle in place for method overrides. But we do not currently emit diagnostics for methods invalidly overridden by non-methods. We need to implement this.\n\nThis should include methods being overridden by definitions in the class body:\n\n```py\nclass A:\n\tdef f(self) -> None: ...\n\nclass B(A):\n\tf = None\n```\n\nIt should include methods overridden by declarations in the class body:\n\n```py\nclass A:\n\tdef f(self) -> None: ...\n\nclass B(A):\n\tf: int\n```\n\nand it should include methods overridden by implicit instance attributes:\n\n```py\nclass A:\n\tdef f(self): ...\n\nclass B(A):\n\tdef __init__(self) -> None:\n        self.f = 42\n```\n\nWe may want to fix https://github.com/astral-sh/ty/issues/1345 before fixing this issue.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2156/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2154",
      "id": 3753655447,
      "node_id": "I_kwDOOje-Bs7fvDyX",
      "number": 2154,
      "title": "Improve `invalid-method-override` diagnostics for overloaded methods",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-22T12:37:19Z",
      "updated_at": "2025-12-22T17:04:18Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently for this file:\n\n```py\nfrom typing import overload\n\nclass A:\n    @overload\n    def f(self) -> int: ...\n    @overload\n    def f(self, x: str) -> str: ...\n    @overload\n    def f(self, x: str, y: str) -> bytes: ...\n    def f(self, x=\"foo\", y=\"bar\"):\n        raise NotImplementedError\n\nclass B(A):\n    @overload\n    def f(self) -> int: ...\n    @overload\n    def f(self, y: str) -> str: ...\n    @overload\n    def f(self, x: str, y: str) -> bytes: ...\n    def f(self, x=\"foo\", y=\"bar\"):\n        raise NotImplementedError\n```\n\nwe emit this diagnostic:\n\n<img width=\"1410\" height=\"746\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/6cc95379-7305-4abd-a2ec-b221184b59aa\" />\n\nwhich is extremely confusing, because from the code frame we show you'd think that the subclass method has exactly the same signature as the superclass method.\n\nThe issue here is that the second overload of the subclass method has a different parameter name to the second overload of the superclass method. Ideally we'd say exactly that, but that's very hard without https://github.com/astral-sh/ty/issues/163. In the meantime we should just print the first `N` overloads as part of the diagnostic, the same as mypy does, and the same as we do for other diagnostics such as `no-matching-overload`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2154/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2150",
      "id": 3751579051,
      "node_id": "I_kwDOOje-Bs7fnI2r",
      "number": 2150,
      "title": "Docstrings for reexported functions do not fall back to implementation definition",
      "user": {
        "login": "Jammf",
        "id": 7865052,
        "node_id": "MDQ6VXNlcjc4NjUwNTI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7865052?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Jammf",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-21T20:27:46Z",
      "updated_at": "2026-01-09T11:16:24Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen hovering a reexported function from a module with a `.pyi` stub file, the docstring from the stub file definition is (correctly) shown instead of the implementation docstring. However, if the stub definition does not have a docstring, then the docstring is missing on hover instead of falling back to the implementation docstring.\n\n```python\n## a/b.py\ndef foo() -> None:\n    \"\"\"Implementation docstring\"\"\"\n    pass\n\ndef bar() -> None:\n    \"\"\"Implementation docstring\"\"\"\n    pass\n\n\n## a/__init__.pyi\ndef foo() -> None: \n    \"\"\"Stub docstring\"\"\"\n    ...\n\ndef bar() -> None: \n    ...\n\n\n## a/__init__.py\nfrom .b import foo as foo\nfrom .b import bar as bar\n\n\n## main.py\nfrom a import foo  # Stub docstring\nfrom a import bar  # <missing docstring>\n```\n\nThis is in contrast to the following example that works as expected, when the stub file `a/__init__.pyi` is renamed to `a/b.pyi`:\n\n```python\n## a/b.py\ndef foo() -> None:\n    \"\"\"Implementation docstring\"\"\"\n    pass\n\ndef bar() -> None:\n    \"\"\"Implementation docstring\"\"\"\n    pass\n\n\n## a/b.pyi          <-- Renamed\ndef foo() -> None: \n    \"\"\"Stub docstring\"\"\"\n    ...\n\ndef bar() -> None: \n    ...\n\n\n## a/__init__.py\nfrom .b import foo as foo\nfrom .b import bar as bar\n\n\n## main.py\nfrom a import foo  # Stub docstring\nfrom a import bar  # Implementation docstring\n```\n\nPlayground link: https://play.ty.dev/74d4d6ee-8ced-41da-b0c6-bf8167f510ae\n\nPossibly related: https://github.com/astral-sh/ty/issues/788#issuecomment-3175228024\n\n### Version\n\nty 0.0.5 (d37b7dbd9 2025-12-20)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2150/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2147",
      "id": 3751342060,
      "node_id": "I_kwDOOje-Bs7fmO_s",
      "number": 2147,
      "title": "Improve rendering of ReST directives in docstrings",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239605,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/good%20first%20issue",
          "name": "good first issue",
          "color": "7057ff",
          "default": true,
          "description": "Good for newcomers"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-21T16:44:09Z",
      "updated_at": "2026-01-09T04:14:55Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nFor example, the stdlib method `logging.Filterer.filter` has several ReST directives at the bottom of its docstring that tell you when the API was updated: https://github.com/astral-sh/ruff/blob/b4c2825afdd8c1010c3a5859521629d2d1e0a6df/crates/ty_vendored/vendor/typeshed/stdlib/logging/__init__.pyi#L136-L142. Pylance renders these as sentences that use English words:\n\n<img width=\"1450\" height=\"246\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/c5cecc68-adc0-4962-88bd-94cb66460024\" />\n\n---\n\nAnd Sphinx renders them similarly in [CPython's online HTML documentation](https://docs.python.org/3/library/logging.html#logging.Filter):\n\n<img width=\"1690\" height=\"494\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/158277e7-7b91-4973-9146-64c86687ba42\" />\n\n---\n\nBut we currently just render these as \"**versionchanged**:: 3.2\":\n\n<img width=\"964\" height=\"648\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/f6b92f6a-a5ea-4feb-aeb9-7827f245be17\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2147/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2146",
      "id": 3751335467,
      "node_id": "I_kwDOOje-Bs7fmNYr",
      "number": 2146,
      "title": "Improve rendering of ReST hyperlinks in docstrings",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-21T16:36:00Z",
      "updated_at": "2025-12-21T20:18:56Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "E.g. our [very own docstrings](https://github.com/astral-sh/ruff/blob/b4c2825afdd8c1010c3a5859521629d2d1e0a6df/crates/ty_vendored/ty_extensions/ty_extensions.pyi#L115-L120) in `ty_extensions.pyi` currently use [standard ReST syntax for hyperlinks](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#hyperlinks), but these aren't rendered in their intended way at all currently when you hover over one of these APIs:\n\n<img width=\"1852\" height=\"448\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/f9343eb0-73af-489c-961c-0b9376b504b1\" />\n\nPyright also doesn't seem to do a great job here, though, so this maybe shouldn't be a priority.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2146/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2142",
      "id": 3750915473,
      "node_id": "I_kwDOOje-Bs7fkm2R",
      "number": 2142,
      "title": "Align docs/type signatures (hover) of different types/objects",
      "user": {
        "login": "Julian-J-S",
        "id": 25177421,
        "node_id": "MDQ6VXNlcjI1MTc3NDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/25177421?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Julian-J-S",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-21T08:34:29Z",
      "updated_at": "2025-12-22T17:13:40Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Atm the documentation/type signatures on hover are a little weird/inconsistent.\nPyright is very consistent here (and helpful).\n\nExample\n```python\nimport os\n\n\ndef my_function(): ...\n\n\nclass MyClass:\n    def my_method(self): ...\n\n\nmy_var = my_function()\nMY_CONSTANT = 0\n```\n\ntype | ty | pyright\n--- | --- | ---\nmodule | <module 'os'> | (module) os\nclass | <class 'MyClass'> | (class) MyClass\nmethod | def my_method(self) -> Unknown | (method) def my_method(self: Self@MyClass) -> None\nfunction | def my_function() -> Unknown | (function) def my_function() -> None\nvariable | Unknown | (variable) my_var: None\nconstant | Literal[0] | (constant) MY_CONSTANT: Literal[0]\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2142/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2137",
      "id": 3750508249,
      "node_id": "I_kwDOOje-Bs7fjDbZ",
      "number": 2137,
      "title": "Support `extend` configuration field (like `ruff`) for config inheritance",
      "user": {
        "login": "aeroyorch",
        "id": 33847633,
        "node_id": "MDQ6VXNlcjMzODQ3NjMz",
        "avatar_url": "https://avatars.githubusercontent.com/u/33847633?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/aeroyorch",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-20T23:08:08Z",
      "updated_at": "2026-01-02T15:59:30Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "First of all, thanks for ty!\n\nI’d like to ask whether `ty` plans to support an `extend` configuration field, similar to [the one provided by `ruff`](https://docs.astral.sh/ruff/configuration/#config-file-discovery), to allow explicit configuration inheritance.\n\nThis would be helpful for sharing common configuration parameters in monorepositories with multiple `pyproject.toml` files, while keeping overrides explicit and localized.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2137/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2136",
      "id": 3750483427,
      "node_id": "I_kwDOOje-Bs7fi9Xj",
      "number": 2136,
      "title": "Use type context from `__setitem__` signature to inform the type inferred on the right-hand side of subscript assignments",
      "user": {
        "login": "nwalters512",
        "id": 1476544,
        "node_id": "MDQ6VXNlcjE0NzY1NDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1476544?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/nwalters512",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "ibraheemdev",
          "id": 34988408,
          "node_id": "MDQ6VXNlcjM0OTg4NDA4",
          "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ibraheemdev",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-20T22:29:36Z",
      "updated_at": "2026-01-09T05:29:41Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nConsider this code:\n\n```py\nfrom typing import TypedDict\n\n\nclass Bar(TypedDict):\n    baz: float\n\nfoo: dict[str, Bar] = { \"a\": { \"baz\": 1 } }\n\nfoo[\"b\"] = { \"baz\": 2 }\n```\n\nI would expect the assignment on the last line to be considered correct/valid, and this is how Pyright ([playground link](https://pyright-play.net/?code=GYJw9gtgBALgngBwJYDsDmUkQWEMoAqiApgCYAiSAxjAFD1UA2AhgM6tQBCzIAFEQjKUaASgBctKFKgAjZgC8xUYIzDM6tYGDBLS1GAG1WMEABouPALpQAvFADeUAETMnSx07ny3UAIxQAX0D6LTADTydrOw8vHwAmQKA)) and mypy ([playground link](https://mypy-play.net/?mypy=latest&python=3.12&gist=137841c602f4c59751b049f2eec2bbb1)) treat it. However, `ty` reports an error:\n\n```\nInvalid subscript assignment with key of type `Literal[\"b\"]` and value of type `dict[Unknown | str, Unknown | int]` on object of type `dict[str, Bar]` (invalid-assignment) [Ln 9, Col 1]\n```\n\nThe initial assignment/initialization of `foo` demonstrates that `ty` can correctly infer that a plain dictionary (`{ \"baz\": 1 }`) is assignable to type `Bar`; it just seemingly can't do that for a later assignment to a dictionary's items.\n\nPlayground link: https://play.ty.dev/8b35242f-36a7-4cb3-9e15-8416f0c509de\n\n### Version\n\nty 0.0.5 (d37b7dbd9 2025-12-20)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2136/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2135",
      "id": 3750374169,
      "node_id": "I_kwDOOje-Bs7fiisZ",
      "number": 2135,
      "title": "Windows | VSCode | Code completion doesn't work for local variables",
      "user": {
        "login": "LittleLittleCloud",
        "id": 16876986,
        "node_id": "MDQ6VXNlcjE2ODc2OTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/16876986?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/LittleLittleCloud",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568529382,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlh5g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-mre",
          "name": "needs-mre",
          "color": "463BEF",
          "default": false,
          "description": "Needs more information for reproduction"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "2": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-12-20T20:16:23Z",
      "updated_at": "2025-12-24T06:54:32Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nCode completion doesn't work for local variables. from the video below you can see if I disable `ty` language server, the completion for `abc` shows up. After I enable `ty` language server, the code completion for local variables doesn't work, but code completion for property/method name still working\n\nhttps://github.com/user-attachments/assets/97fc6f68-7ac2-4071-87f0-97ec6b7980bb\n\nI think it's duplicate/regression of this issue #1864 \n\n### Version\n\nruff==0.14.10 + ty==0.0.4 + ty extension==2025.74.0",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2135/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2134",
      "id": 3750358167,
      "node_id": "I_kwDOOje-Bs7fieyX",
      "number": 2134,
      "title": "Support deeper-nested attribute type narrowing",
      "user": {
        "login": "pasky",
        "id": 18439,
        "node_id": "MDQ6VXNlcjE4NDM5",
        "avatar_url": "https://avatars.githubusercontent.com/u/18439?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/pasky",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        },
        "1": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "mtshiba",
          "id": 45118249,
          "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
          "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mtshiba",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-20T19:55:10Z",
      "updated_at": "2025-12-27T00:41:06Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nCommon `unittest.mock` patterns used in (at least my) test suite(s) produce false positives in ty, while pyright handles them correctly. This makes it difficult to type-check test files with ty.\n\nSee the full reproducer at https://play.ty.dev/d95a7a51-6af0-486d-8ebb-a3b0ca0d0ea6\n\n## 1. `possibly-missing-attribute` after mock assignment\n\nWhen a typed attribute is replaced with `AsyncMock()` or `MagicMock()`, ty still tracks the union of possible types (`Unknown | OriginalType`). When accessing mock-specific attributes like `.assert_called()`, `.call_args`, or `.call_count` on child attributes of the mock, ty reports `possibly-missing-attribute` because it sees the original method signature in the union.\n\n```\n    agent.irc_monitor.varlink_sender = AsyncMock()\n    await agent.irc_monitor.varlink_sender.send_message(\"#test\", \"hello\", \"server\")\n    agent.irc_monitor.varlink_sender.send_message.assert_called()  # ty: possibly-missing-attribute\n```\nproduces\n```\nwarning[possibly-missing-attribute]: Attribute `assert_called` may be missing on object of type `Unknown | (bound method VarlinkSender.send_message(target: str, message: str, server: str) -> CoroutineType[Any, Any, bool])`\n```\n\n## 2. `invalid-assignment` for lambda stubs\n\nMonkeypatching a method with a lambda that has a compatible but not identical signature (e.g., `lambda: False` vs `def check_limit(self) -> bool`) triggers `invalid-assignment`. This is a common pattern for quickly stubbing out methods in tests.\n\n```\nclass RateLimiter:\n    def check_limit(self) -> bool:\n        return True\nagent.irc_monitor.rate_limiter.check_limit = lambda: False  # ty: invalid-assignment\n```\nproduces\n```\nerror[invalid-assignment]: Object of type `() -> Unknown` is not assignable to attribute `check_limit` on type `Unknown | RateLimiter\n```\n\nBoth of these cases work just fine with `pyright` (1.1.407) and I think having to exclude them manually seems unreasonable. I tried to look for some best practices around ty and tests, but didn't really find much so far...\n\n### Version\n\n0.0.4",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2134/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2131",
      "id": 3750276252,
      "node_id": "I_kwDOOje-Bs7fiKyc",
      "number": 2131,
      "title": "Function returning `Awaitable[R]` returns `T | None` on Python 3.13 but `T` on Python 3.12",
      "user": {
        "login": "yamaaaaaa31",
        "id": 143375737,
        "node_id": "U_kgDOCIu9eQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/143375737?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/yamaaaaaa31",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 8,
      "created_at": "2025-12-20T18:02:59Z",
      "updated_at": "2026-01-09T21:30:46Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Description\n\nWhen using a function decorated with `@overload` as a method decorator, ty incorrectly infers the return type as `T | None` on Python 3.13, but correctly infers `T` on Python 3.12.\n\n## Reproduction\n\n```python\n# log_fn.py\nimport asyncio\nfrom collections.abc import Awaitable, Callable\nfrom functools import wraps\nfrom typing import Any, ParamSpec, TypeVar, overload\n\nP = ParamSpec(\"P\")\nR = TypeVar(\"R\")\n\n@overload\ndef log_fn(fn: Callable[P, Awaitable[R]]) -> Callable[P, Awaitable[R]]: ...\n@overload\ndef log_fn(fn: Callable[P, R]) -> Callable[P, R]: ...\ndef log_fn(fn: Any) -> Any:\n    if asyncio.iscoroutinefunction(fn):\n        @wraps(fn)\n        async def async_wrapper(*args: Any, **kwargs: Any) -> Any:\n            return await fn(*args, **kwargs)\n        return async_wrapper\n    @wraps(fn)\n    def wrapper(*args: Any, **kwargs: Any) -> Any:\n        return fn(*args, **kwargs)\n    return wrapper\n```\n\n```python\n# use_case.py\nfrom dataclasses import dataclass\nfrom injector import inject\nfrom log_fn import log_fn\n\n@dataclass\nclass Result:\n    value: str\n\n@inject\n@dataclass\nclass UseCase:\n    @log_fn\n    async def run(self) -> Result:\n        return Result(value=\"test\")\n```\n\n```python\n# router.py\nfrom use_case import UseCase, Result\n\nasync def main():\n    result = await UseCase().run()\n    print(result.value)  # Error on 3.13: possibly-missing-attribute\n```\n\n## Commands\n\n```bash\nty check --python-version 3.12 router.py  # All checks passed!\nty check --python-version 3.13 router.py  # Error: Attribute 'value' may be missing on object of type 'Result | None'\n```\n\n## Expected\n\nNo error on Python 3.13 (same behavior as Python 3.12)\n\n## Actual\n\n`possibly-missing-attribute` and `invalid-argument-type` errors on Python 3.13:\n\n```\nerror[possibly-missing-attribute]: Attribute 'value' may be missing on object of type 'Result | None'\n```\n\n## Environment\n\n- ty version: 0.0.4\n- OS: macOS",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2131/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2130",
      "id": 3750141462,
      "node_id": "I_kwDOOje-Bs7fhp4W",
      "number": 2130,
      "title": "Support for Pydantic `default_factory` option inside `Annotated`",
      "user": {
        "login": "gusutabopb",
        "id": 4231387,
        "node_id": "MDQ6VXNlcjQyMzEzODc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4231387?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gusutabopb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-20T15:12:36Z",
      "updated_at": "2025-12-20T19:52:34Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nRelated to https://github.com/pydantic/pydantic/issues/6713\n\nCurrently ty doesn't detect that a field is optional in a Pydantic model constructor when using the `Annotated[<type>, <annotations>]` syntax, which is currently recommended way to add `Field` constraints.\n\nAre there plans to support this? If not is there some other (not Pydantic-specific) annotation that could be used to tell ty the given parameter is not mandatory?\n\n### Sample code\n\n```python\nfrom typing import Annotated\n\nfrom pydantic import BaseModel, Field\n\n\nclass Model(BaseModel):\n    name: str\n    options: Annotated[list[str], Field(default_factory=list)]\n\nm = Model(name=\"John\")\n```\n\n\n### Error\n\n```\nerror[missing-argument]: No argument provided for required parameter `options`\n  --> main.py:10:5\n   |\n 8 |     options: Annotated[list[str], Field(default_factory=list)]\n 9 |\n10 | m = Model(name=\"John\")\n   |     ^^^^^^^^^^^^^^^^^^\n   |\ninfo: rule `missing-argument` is enabled by default\n\nFound 1 diagnostic\n```\n\n### Workaround\n\nThe code below works fine.\n\n```python\nfrom pydantic import BaseModel, Field\n\n\nclass Model(BaseModel):\n    name: str\n    options: list[str] = Field(default_factory=list)\n\n\nm = Model(name=\"John\")\n```\n\n\nPS: I couldn't past a playground link because I wasn't able to add third-party packages (i.e. Pydantic)\n\n### Version\n\nty 0.0.4 (c1e6188b1 2025-12-18)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2130/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2129",
      "id": 3749970444,
      "node_id": "I_kwDOOje-Bs7fhAIM",
      "number": 2129,
      "title": "Make it easier for users to select rules based on strictness (profiles, rule categories)",
      "user": {
        "login": "OEvortex",
        "id": 158988478,
        "node_id": "U_kgDOCXn4vg",
        "avatar_url": "https://avatars.githubusercontent.com/u/158988478?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/OEvortex",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-20T11:31:03Z",
      "updated_at": "2025-12-31T16:56:59Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I’d like a per-project (or workspace) toggle to enable or disable Python type checking similar to Pylance’s \"Type Checking Mode\" (off/basic/strict). This should let users quickly switch type checking behavior without changing global settings or editing config files.\n\nMotivation\n- Some projects rely heavily on type checking while others (or legacy codebases) are noisy; switching globally is disruptive.\n- Pylance’s UI makes it easy to change modes per-workspace; having the same capability would improve developer experience and reduce friction when working across multiple repositories.\n\nProposed behavior\n- Expose a workspace-level setting named something like \"python.typeCheckingMode\" with values: \"off\", \"basic\", \"strict\".\n- Provide a command palette action (e.g., “Toggle Python Type Checking”) that cycles modes or opens a quick pick with the three options.\n- Persist the chosen mode in workspace settings (and allow user-level override).\n- When \"off\" is selected, the language server/extension must suppress type-check diagnostics entirely.\n- When \"basic\" or \"strict\" are selected, diagnostics should behave accordingly (match existing behavior used for current strictness levels).\n- Changing the mode should immediately re-run analysis and update diagnostics without requiring restart.\n\nUI/UX\n- Quick pick command accessible from Command Palette.\n- Optional status bar item showing current mode; clicking it opens the quick pick.\n- Setting visible in workspace settings UI.\n\nImplementation notes (suggested)\n- Reuse existing type-checking diagnostic pipeline; gate diagnostics emission based on the workspace setting.\n- Ensure workspace-level configuration overrides user-level defaults.\n- Emit telemetry (opt-in) for mode changes to understand usage patterns.\n- Add unit and integration tests to validate persistence and immediate refresh behavior.\n\nAcceptance criteria\n- Workspace setting exists and accepts \"off\", \"basic\", \"strict\".\n- Command palette item and status bar entry present and functional.\n- Diagnostics update immediately when toggling modes.\n- Workspace-level setting overrides user-level setting.\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2129/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2128",
      "id": 3749416207,
      "node_id": "I_kwDOOje-Bs7fe40P",
      "number": 2128,
      "title": "`Literal[\"abba\"]` should be a subtype of `Sequence[Literal[\"a\", \"b\"]]`",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239605,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/good%20first%20issue",
          "name": "good first issue",
          "color": "7057ff",
          "default": true,
          "description": "Good for newcomers"
        },
        "1": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-20T02:07:10Z",
      "updated_at": "2025-12-20T16:34:29Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "A string literal containing only characters from a given set should be a subtype of `Sequence` of the union of those literal characters.\n\n```py\nfrom collections.abc import Sequence\nfrom typing import Literal\n\ndef func(tags: Sequence[Literal[\"a\", \"b\"]]) -> None:\n    pass\n\nfunc(\"abba\")\n```\n\nhttps://play.ty.dev/381e87b8-2438-4287-a1cd-2e26c04a6dd1",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2128/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2125",
      "id": 3749306087,
      "node_id": "I_kwDOOje-Bs7fed7n",
      "number": 2125,
      "title": "Before filing an issue",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": true,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-20T00:31:18Z",
      "updated_at": "2025-12-23T11:22:12Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Thanks for trying ty and reporting an issue!\n\n**First, please check whether your question or problem is already known.**\n\n1. If you are seeing a type error on your code that you didn't expect, does the [documentation reference page](https://docs.astral.sh/ty/reference/rules/) for that error code explain the problem?\n2. Have we documented it in our [typing FAQ](https://docs.astral.sh/ty/reference/typing-faq/)?\n3. Is it a [typing feature](https://github.com/astral-sh/ty/issues/1889) we haven't (fully) implemented yet?\n4. Or is it one of these known bugs?\n- Sometimes ty fails to narrow types as it should when there is a call to a `NoReturn` or `Never` returning function (e.g. `sys.exit()`) in a nested control flow path. This is tracked in https://github.com/astral-sh/ty/issues/690\n- ty may not infer a specialization for a type variable inside a generic protocol. This is tracked in https://github.com/astral-sh/ty/issues/1714\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2125/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2124",
      "id": 3749228844,
      "node_id": "I_kwDOOje-Bs7feLEs",
      "number": 2124,
      "title": "re-unify `Type::try_call_constructor` and `Type::bindings`",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-19T23:31:21Z",
      "updated_at": "2025-12-19T23:31:21Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 1,
        "total_blocking": 1
      },
      "body": "We currently do some extensive special-casing in `TypeInferenceBuilder::infer_call_expression_impl`, much of which dates back to working around limitations we no longer have, and can/should now be removed. Part of this special-casing is a dedicated path for constructor calls (`Type::try_call_constructor`), which doesn't use the bindings that would be returned by `Type::bindings` for the same type -- so it's not consistent with what happens if you use `Type::try_call`. This leads to bugs like https://github.com/astral-sh/ty/issues/1446",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2124/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2123",
      "id": 3749225860,
      "node_id": "I_kwDOOje-Bs7feKWE",
      "number": 2123,
      "title": "exponential runtime for some large unions (part 2)",
      "user": {
        "login": "markjm",
        "id": 16494982,
        "node_id": "MDQ6VXNlcjE2NDk0OTgy",
        "avatar_url": "https://avatars.githubusercontent.com/u/16494982?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/markjm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-19T23:28:53Z",
      "updated_at": "2026-01-09T13:44:25Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI'm back!\n\nI want to express my gratitude for the quick fix on #1968. The repro works like a charm now. Unfortunately, when I tried out 0.0.3 (or 4) on the actual sourcecode which triggered the issue in our codebase, I could still repro the slowdown :(\n\nI have below another similar repro which I see still has exponential runtime based on the size of the `StreamMessage` union:\n\n```python\n\"\"\"\nty type checker hang reproduction.\nRun: uvx ty==0.0.4 check ty_repro.py\n\"\"\"\n\nfrom __future__ import annotations\n\nfrom typing import Callable\nfrom typing import Generic\nfrom typing import TypeVar\nfrom typing import Union\n\n\nclass M1: pass\nclass M2: pass\nclass M3: pass\nclass M4: pass\nclass M5: pass\nclass M6: pass\nclass M7: pass\nclass M8: pass\nclass M9: pass\nclass M10: pass\nclass M11: pass\nclass M12: pass\nclass M13: pass\nclass M14: pass\nclass M15: pass\n\n# limiting the # of elements in this union improves runtime. For me, 12 elements takes 5sec, 13 takes 12sec, and grows further\nStreamMessage = Union[M1, M2, M3, M4, M5, M6, M7, M8, M9, M10, M11, M12, M13, M14, M15]\n\nT = TypeVar(\"T\")\nU_co = TypeVar(\"U_co\", covariant=True)\n\n\nclass AsyncStream(Generic[T]):\n    def apply(self, func: Callable[[AsyncStream[T]], AsyncStream[U_co]]) -> AsyncStream[U_co]:\n        return func(self)\n\n    def filter(self, predicate: Callable[[T], bool]) -> AsyncStream[T]:\n        return AsyncStream()  # type: ignore\n\n    def peek_index(self, action: Callable[[T, int], None]) -> AsyncStream[T]:\n        return AsyncStream()  # type: ignore\n\n\nTStreamMessage = TypeVar(\"TStreamMessage\", bound=StreamMessage)\n\n\nclass Builder(Generic[TStreamMessage]):\n    def build(self) -> AsyncStream[TStreamMessage]:\n        stream = AsyncStream().filter(lambda x: True)  # type: ignore\n        stream = stream.apply(self._handle_2).apply(self._handle_1)\n        stream = stream.peek_index(self._peek)\n        return stream\n\n    def _handle_1(self, stream: AsyncStream[TStreamMessage]) -> AsyncStream[TStreamMessage]:\n        return AsyncStream()  # type: ignore\n\n    def _handle_2(self, stream: AsyncStream[StreamMessage]) -> AsyncStream[StreamMessage]:\n        return AsyncStream()  # type: ignore\n\n    def _peek(self, item: StreamMessage, index: int) -> None:\n        pass\n```\n\nThis is as much of a repro i could narrow before heading out for the week, so sorry its a bit messy. Happy holidays!\n\n### Version\n\n0.0.4",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2123/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2117",
      "id": 3748255211,
      "node_id": "I_kwDOOje-Bs7fadXr",
      "number": 2117,
      "title": "Re-enable boundness analysis for implicit instance attributes",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        },
        "1": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-19T17:30:57Z",
      "updated_at": "2025-12-20T00:32:30Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In https://github.com/astral-sh/ruff/pull/20128, we disabled boundness analysis for *implicit* instance attributes:\n\n```py\nclass C:\n    def __init__(self):\n        if False:   \n            self.x = 1\n\nC().x  # would previously show an error, with this PR we pretend the attribute exists\n```\n\nIt is possible that we can simply re-enable this now that we have a better strategy for dealing with these cyclic type inference problems.\n\nWe probably don't want a full-blown revert of that PR. I like `TypeQualifiers::IMPLICIT_INSTANCE_ATTRIBUTE` much better than `TypeQualifiers::POSSIBLY_UNBOUND_IMPLICIT_ATTRIBUTE`, so maybe we can prevent bringing the latter back.\n\nFor some reason, I don't see any regression tests for https://github.com/astral-sh/ty/issues/758 in that PR, so we should probably add them when we resolve this issue.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2117/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2113",
      "id": 3747399580,
      "node_id": "I_kwDOOje-Bs7fXMec",
      "number": 2113,
      "title": "Duplicate `invalid-named-tuple` diagnostics if `_asdict` is declared and bound in separate statements",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-19T12:37:47Z",
      "updated_at": "2025-12-19T12:37:47Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nOpening an issue so I don't forget about this TODO: https://github.com/astral-sh/ruff/blob/e177cc2a5a5d5e25c06ea6b0bbac9209f37fe756/crates/ty_python_semantic/resources/mdtest/named_tuple.md?plain=1#L623-L631. The bug can probably also be reproduced for some of our other override-related rules such as `invalid-method-override`. The bug is caused due to the way `list_members::all_end_of_scope_members` naively chains together declarations and bindings [here](https://github.com/astral-sh/ruff/blob/e177cc2a5a5d5e25c06ea6b0bbac9209f37fe756/crates/ty_python_semantic/src/types/list_members.rs#L37-L76); it needs to dedupe them; I'm imagining that it would return an `FxHashMap<Name, Member<'db>>` struct, where `Member` holds information about the symbol's declaration and/or its binding.\n\nIt's possible that the `list_members::all_reachable_members` iterator that our completions infrastructure uses needs a similar bugfix, too.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2113/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2111",
      "id": 3747235939,
      "node_id": "I_kwDOOje-Bs7fWkhj",
      "number": 2111,
      "title": "Add table to documentation mapping mypy/pyright rules to ty rules",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239594,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/documentation",
          "name": "documentation",
          "color": "0075ca",
          "default": true,
          "description": "Improvements or additions to documentation"
        },
        "1": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-19T11:48:03Z",
      "updated_at": "2026-01-05T10:21:47Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For some of our rules there isn't a 1:1 mapping, but for a lot of rules there is. This could be really helpful for users migrating from other type checkers.\n\nI'm not sure we should do it now, though, because our ruleset is still in quite a high level of flux. We should probably wait until we're closer to stable before attempting something like this.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2111/reactions",
        "total_count": 6,
        "+1": 6,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2108",
      "id": 3747132652,
      "node_id": "I_kwDOOje-Bs7fWLTs",
      "number": 2108,
      "title": "False positive: `conflicting-declarations` on try/except import fallback pattern",
      "user": {
        "login": "The-Red-Dragons",
        "id": 48058613,
        "node_id": "MDQ6VXNlcjQ4MDU4NjEz",
        "avatar_url": "https://avatars.githubusercontent.com/u/48058613?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/The-Red-Dragons",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-19T11:13:50Z",
      "updated_at": "2025-12-23T05:15:29Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n## Summary\n\nty reports `conflicting-declarations` when using the common Python pattern for optional imports with a fallback to `None`.\n\n## Environment\n\n- ty version: 0.0.4\n- Python version: 3.14\n- OS: Ubuntu 24.04\n\n## Reproduction\n\n```python\nfrom mymodule import MyClass as MyClassType\n\n# Type declaration for the variable\ntranslator: MyClassType | None\n\ntry:\n    from mymodule import translator\nexcept (ImportError, ModuleNotFoundError, AttributeError):\n    translator = None\n```\n\n## Expected Behavior\n\nNo error - this is a common pattern for optional dependencies where:\n1. The type is declared as `T | None`\n2. We try to import the real value\n3. On failure, we fall back to `None`\n\n## Actual Behavior\n\n```\nerror[conflicting-declarations]: Conflicting declared types for `translator`: `MyClass | None` and `MyClass`\n```\n\n## Real-world Use Case\n\nThis pattern is widely used for optional features:\n```python\n# Optional translator support\ntranslator: Translator | None\n\ntry:\n    from utils.localization import translator\nexcept ImportError:\n    translator = None  # Feature disabled if not installed\n\n# Later in code\nif translator is not None:\n    message = translator.t(\"key\")\n```\n\n## Workaround\n\nUsing `conflicting-declarations = \"warn\"` in configuration.\n\n### Version\n\n0.0.4",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2108/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2107",
      "id": 3747128558,
      "node_id": "I_kwDOOje-Bs7fWKTu",
      "number": 2107,
      "title": "Support narrowing `Literal[0]` out of unions using `<`, `<=`, `>` and `>=` checks",
      "user": {
        "login": "The-Red-Dragons",
        "id": 48058613,
        "node_id": "MDQ6VXNlcjQ4MDU4NjEz",
        "avatar_url": "https://avatars.githubusercontent.com/u/48058613?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/The-Red-Dragons",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-19T11:12:25Z",
      "updated_at": "2025-12-19T12:03:35Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n## Summary\n\nty reports `division-by-zero` errors even when the division is guarded by a conditional check like `if x > 0`.\n\n## Environment\n\n- ty version: 0.0.4\n- Python version: 3.14\n- OS: Ubuntu 24.04\n\n## Reproduction\n\n```python\nclass Example:\n    def __init__(self) -> None:\n        self.total_requests = 0\n        self.rate_limited_requests = 0\n\n    def get_statistics(self) -> dict[str, str]:\n        return {\n            \"rate_limit_percentage\": (\n                f\"{(self.rate_limited_requests / self.total_requests * 100):.2f}%\"\n                if self.total_requests > 0  # ← Guard is present!\n                else \"0%\"\n            ),\n        }\n```\n\n## Expected Behavior\n\nNo error - the division is only executed when `self.total_requests > 0`, making division by zero impossible.\n\n## Actual Behavior\n\n```\nerror[division-by-zero]: Cannot divide object of type `Literal[0]` by zero\n```\n\nty correctly infers that `self.total_requests` is initialized to `0`, but doesn't recognize that the `if self.total_requests > 0` guard narrows the type to exclude zero before the division occurs.\n\n## Workaround\n\nCurrently using `division-by-zero = \"warn\"` in `pyproject.toml` to suppress these false positives.\n\n## Related\n\nThis is similar to how type checkers handle None checks - after `if x is not None`, the type is narrowed. The same narrowing logic should apply to numeric comparisons before division.\n\n### Version\n\n0.0.4",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2107/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2102",
      "id": 3746325986,
      "node_id": "I_kwDOOje-Bs7fTGXi",
      "number": 2102,
      "title": "local vars reported as types in lsp autocompletion",
      "user": {
        "login": "egorbn",
        "id": 116128944,
        "node_id": "U_kgDOBuv8sA",
        "avatar_url": "https://avatars.githubusercontent.com/u/116128944?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/egorbn",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-12-19T06:50:09Z",
      "updated_at": "2026-01-09T15:52:29Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nNot sure if this is expected behavior, but locally defined variables are reported as `Struct` or `Value`, when really they should be reported as `Variable` in the lsp autocompletion.\n\nHere's some example code:\n```python\ndef bar(baz: int) -> int:\n    return baz\n\n\nif __name__ == \"__main__\":\n    msg = \"Hello ty\"\n    print(msg)\n\n    number = bar(3)\n    print(number)\n```\nhttps://play.ty.dev/8825913f-afcf-46be-875e-0ce1553f977e\n\n# `Value` kind\nWhen completing `msg` in the print statement, the \"kind\" of the autocomplete is shows as `Value` in `neovim`.\n\nIn the online playground the kind icon is also not variable kind, so I'm guessing it's also linked to something like `Value`.\n\nThis kind is shown when variables are declared with literal values.\n\n## `neovim`\n\n<img width=\"1118\" height=\"65\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/851296e5-f875-47d6-9c20-46999bacd588\" />\n\n## online playground\n\n<img width=\"545\" height=\"65\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/0ee73a4f-c416-4b30-ab95-e600adb79c71\" />\n\n# `Struct` kind\n\nWhen a variable is assigned the return value of a function, the kind is reported as `Struct`.\n\n## `neovim`\n\n<img width=\"965\" height=\"87\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/05c7514e-1dc5-4f6a-abbe-acb0a23fe2df\" />\n\n## online playground\n\n<img width=\"547\" height=\"70\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/cb0a02d1-9697-4831-b748-f6bfdcce26e1\" />\n\n# Question\nIs this expected behavior?\n\n# Suggestion\nI think it would be better to report both as `Variable` kind, in-line with most tools (at least the ones I'm familiar with).\n\nWhen I see an autocomplete for a local variable, I want to know that it's a local variable.\n\n### Version\n\nty 0.0.4 (c1e6188b1 2025-12-18)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2102/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2100",
      "id": 3746182622,
      "node_id": "I_kwDOOje-Bs7fSjXe",
      "number": 2100,
      "title": "ty not working with Marimo's VSCode extension",
      "user": {
        "login": "hierr",
        "id": 25069969,
        "node_id": "MDQ6VXNlcjI1MDY5OTY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/25069969?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/hierr",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9412245782,
          "node_id": "LA_kwDOOje-Bs8AAAACMQN5Fg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/notebook",
          "name": "notebook",
          "color": "af5117",
          "default": false,
          "description": "support for Jupyter (or similar) notebooks"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-19T05:56:31Z",
      "updated_at": "2025-12-23T11:36:10Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nTy doesn't seem to be working with [Marimo's VSCode extension](https://github.com/marimo-team/marimo-lsp).  May be related in some way with [this ruff issue](https://github.com/astral-sh/ruff-vscode/issues/893)\n\n### Version\n\nty 0.0.4",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2100/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2098",
      "id": 3745738331,
      "node_id": "I_kwDOOje-Bs7fQ25b",
      "number": 2098,
      "title": "error on invalid usage for variance of a legacy typevar",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-19T02:23:35Z",
      "updated_at": "2025-12-19T02:23:35Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "E.g. if a typevar that claims to be covariant is used in contravariant position, or vice versa.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2098/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2097",
      "id": 3745585795,
      "node_id": "I_kwDOOje-Bs7fQRqD",
      "number": 2097,
      "title": "Bazel rules",
      "user": {
        "login": "SamuelMarks",
        "id": 807580,
        "node_id": "MDQ6VXNlcjgwNzU4MA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/807580?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SamuelMarks",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-19T01:28:16Z",
      "updated_at": "2025-12-19T09:39:21Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "[Bazel](https://bazel.build) is a popular cross-platform cross-language build system. E.g., at Google it is commonly and publicly known that essentially every [sub]repo in its monorepo has `BUILD` files for Bazel integration.\n\n[ty](https://github.com/astral-sh/ty) could easily become the replacement for [pytype](https://github.com/google/pytype) now that that's deprecated.\n\nTo that end, the recommendation is for the creation and maintenance of `rules_ty`.\n\nFWIW: There is https://github.com/aspect-build/rules_py but it seems to have some weirdness associated requiring a login to their SaaS.\n\nReferences:\n- https://github.com/bazel-contrib/rules_python\n- https://github.com/bazel-contrib/rules_mypy\n- https://github.com/bazel-contrib/rules_python/issues/296 (call for action now that pytype—Google's oft used solution—is deprecated)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2097/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2096",
      "id": 3745533623,
      "node_id": "I_kwDOOje-Bs7fQE63",
      "number": 2096,
      "title": "special-case try/except ImportError if all imports resolve",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        },
        "1": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-12-19T01:07:45Z",
      "updated_at": "2025-12-31T15:20:15Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "> I encountered a case of this with library `mypy_boto3_s3` ([pypi](https://pypi.org/project/mypy-boto3-s3/), [github generator code](https://github.com/youtype/mypy_boto3_builder)). It uses a `try / except ImportError` pattern, I think for Python backwards compatibility?\n> \n> ```python\n> # mypy_boto3_s3/__init__.py\n> try:\n>     from .service_resource import S3ServiceResource\n> except ImportError:\n>     from builtins import object as S3ServiceResource  # type: ignore[assignment]\n> ```\n> \n> Unfortunately, ty doesn't handle this as gracefully as mypy. Mypy seems to recognize my `var: mypy_boto3_s3.S3ServiceResource` as an instance of `mypy_boto3_s3.service_resource.S3ServiceResource`, but ty instead widens it to `object`, and then it doesn't type check my code correctly.\n> \n> I have no suggestion on how to handle this correctly, I am simply reporting that I encountered this issue in the wild.\n> \n> Here's a basic reproduction case:\n> \n> ```python\n> # mypy_boto3_s3_test.py\n> from mypy_boto3_s3 import S3ServiceResource\n> \n> def f() -> S3ServiceResource:\n>     \"\"\"Fake making an S3ServiceResource\"\"\"\n>     return None  # type: ignore\n> \n> s = f()\n> s.get_available_subresources()  # ty thinks this is an error\n> \n> ```\n> \n> ```\n> $ uvx ty version\n> ty 0.0.2\n> \n> $ uvx ty check mypy_boto3_s3_test.py \n> error[unresolved-attribute]: Object of type `object` has no attribute `get_available_subresources`\n>  --> mypy_boto3_s3_test.py:9:1\n>   |\n> 8 | s = f()\n> 9 | s.get_available_subresources()  # ty thinks this is an error\n>   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n>   |\n> info: rule `unresolved-attribute` is enabled by default\n> \n> Found 1 diagnostic\n> ``` \n\n _Originally posted by @leon-sony in [#1585](https://github.com/astral-sh/ty/issues/1585#issuecomment-3667714012)_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2096/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2091",
      "id": 3745004815,
      "node_id": "I_kwDOOje-Bs7fOD0P",
      "number": 2091,
      "title": "`map(str, cmd)` fails with `Sequence[str] & ~str`, succeeds with `Sequence[str]`",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 7,
      "created_at": "2025-12-18T22:02:17Z",
      "updated_at": "2026-01-08T18:00:52Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "From #2087:\n\n```py\nfrom typing import Sequence, reveal_type\n\ndef test(command: Sequence[str] | str) -> str:\n    reveal_type(command)  # Sequence[str]\n    parts = map(str, command)  # works\n    if isinstance(command, str):\n        return command\n    else:\n        reveal_type(command)  # Sequence[str] & ~str\n        parts = map(str, command)  # fails with \"not assignable to `Iterable[Buffer]`\"\n        return ' '.join(parts)\n\nprint(test('echo hello'))\nprint(test(['echo', 'hello']))\n```\n\nThe first `map` works, the second one fails; the only difference is the intersection with `~str`. It should not be possible for that to cause the assignment to fail, if the other intersection component succeeds.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2091/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2084",
      "id": 3744516065,
      "node_id": "I_kwDOOje-Bs7fMMfh",
      "number": 2084,
      "title": "installable runtime shim for ty_extensions module",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-18T19:21:29Z",
      "updated_at": "2025-12-18T23:09:20Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For users who are OK restricting themselves to ty and want to use intersections, there's no reason for us not to make it easier for them to do so.\n\nWe should maybe consider splitting `ty_extensions` into two modules, one for things we want to support as public API, and another for things that are really just for internal mdtest use.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2084/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2083",
      "id": 3744283334,
      "node_id": "I_kwDOOje-Bs7fLTrG",
      "number": 2083,
      "title": "Import resolution... not the same as ruff (or pyright, pyrefly, etc)",
      "user": {
        "login": "danielpopescu",
        "id": 3674804,
        "node_id": "MDQ6VXNlcjM2NzQ4MDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3674804?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/danielpopescu",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568528024,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlcmA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-info",
          "name": "needs-info",
          "color": "FBCA04",
          "default": false,
          "description": "More information is needed from the issue author"
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-12-18T18:25:15Z",
      "updated_at": "2026-01-09T02:47:12Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n\nI have a project, with a non standard folder hierarchy... something like this:\n\n<project_root>/abc/xyz/A\n<project_root>/abc/xyz/B\n...\n<project_root>/abc/xyz/Z\n\npython files are spread into the leaf folders A, B,...etc\n\nanywhere in the files in the project (from A, B, etc) I can import, say foo.py from A as:\n\nimport A.foo \n\ninto any files from A,B,C....etc\n\nThis is fine with LSP servers I use: pyright/basedpyright, pyrefly or linters like ruff, etc... \n\nWith ty I get an unresloved-inport error. One must use: import abc.xyz.A.foo  to fix it.\n\nThis is also puzzling as I thought ruff and ty use the same code but somehow dont behave the same for this particular issue... \n\nusing latest 0.0.3 version.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2083/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2082",
      "id": 3744194255,
      "node_id": "I_kwDOOje-Bs7fK97P",
      "number": 2082,
      "title": "config setting to resolve some modules to Any",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-18T18:01:41Z",
      "updated_at": "2026-01-09T09:47:27Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Similar to https://pyrefly.org/en/docs/configuration/#replace-imports-with-any%20option\n\nThis is useful for highly-dynamic and/or badly-typed third-party modules that you just want to not get false positives from, ever.\n\nWould be a solution to #2076 \n\nRelated but not the same as https://github.com/astral-sh/ty/issues/1354",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2082/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2080",
      "id": 3743933190,
      "node_id": "I_kwDOOje-Bs7fJ-MG",
      "number": 2080,
      "title": "Failed to typecheck nested protocol",
      "user": {
        "login": "xxchan",
        "id": 37948597,
        "node_id": "MDQ6VXNlcjM3OTQ4NTk3",
        "avatar_url": "https://avatars.githubusercontent.com/u/37948597?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/xxchan",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-12-18T16:52:11Z",
      "updated_at": "2025-12-18T18:22:37Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```python\nfrom typing import Protocol, runtime_checkable\n\n@runtime_checkable\nclass Outer(Protocol):\n    name: str\n    \n    class Inner(Protocol):\n        def foo(self) -> int: ...\n    \n    def get_inner(self) -> Inner: ...\n\nclass MyOuter:\n    name: str = \"test\"\n    \n    class Inner:\n        def foo(self) -> int:\n            return 1\n    \n    def get_inner(self) -> Inner:\n        return MyOuter.Inner()\n\ndef use_outer(o: Outer) -> None:\n    pass\n\nuse_outer(MyOuter())  # ty error, pyright passes\n```\n\n```\nExit code 1\nerror[invalid-argument-type]: Argument to function `use_outer` is incorrect\n  --> /tmp/ty_nested_with_inner.py:25:11\n   |\n23 |     pass\n24 |\n25 | use_outer(MyOuter())\n   |           ^^^^^^^^^ Expected `Outer`, found `MyOuter`\n   |\ninfo: Function defined here\n  --> /tmp/ty_nested_with_inner.py:22:5\n   |\n20 |         return MyOuter.Inner()\n21 |\n22 | def use_outer(o: Outer) -> None:\n   |     ^^^^^^^^^ -------- Parameter declared here\n23 |     pass\n   |\ninfo: rule `invalid-argument-type` is enabled by default\n\nFound 1 diagnostic\n```\n\n### Version\n\nty 0.0.3 (fadfe0966 2025-12-17)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2080/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2075",
      "id": 3743572368,
      "node_id": "I_kwDOOje-Bs7fImGQ",
      "number": 2075,
      "title": "Coroutine generics not inferable to CoroutineType",
      "user": {
        "login": "LeoHxQin",
        "id": 25271013,
        "node_id": "MDQ6VXNlcjI1MjcxMDEz",
        "avatar_url": "https://avatars.githubusercontent.com/u/25271013?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/LeoHxQin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-18T15:09:32Z",
      "updated_at": "2026-01-08T17:58:27Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```python\nfrom typing import Callable, Coroutine, Any\n\ndef defer_execution[**P, T](func: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> Callable[P, T]:\n    return func\n\ndef run_coroutine[T](co: Coroutine[Any, Any, T]) -> T:\n    raise Exception()\n\nasync def do_nothing() -> None:\n    return\n\n# Argument to function `defer_execution` is incorrect: Expected `Coroutine[Any, Any, T@run_coroutine]`, found `CoroutineType[Any, Any, None]`\ndefer_execution(run_coroutine, do_nothing())\n```\n\n[ty playground](https://play.ty.dev/126bfe1c-c3f8-411b-93cf-844b61df2a35)\n\n[pyright playground](https://pyright-play.net/?pyrightVersion=1.1.405&pythonVersion=3.13&reportUnreachable=true&code=GYJw9gtgBALgngBwJYDsDmUkQWEMoDCAhgDYlEBGJApgDSG5gCuMqdUAginAFB8Am1YFEHBqIAPrUAHtQDGLJGBQBtAFRqACvQAqAXQAUwJijkAuQqXJVqK7VH301REGgDOFzQDoX7p2oBrAHdfDyhvYNCASigAWgA%2BSzJKGjtdPTMeKGyoEGoYJhAUKGNTPh5RXJMJOUZFFFt9A1qLAjrWBpUuOHpu9JiEh0yc3KIkN2ooAFFpOWoEVmUDKPKiNzhTESERMAkUMBgAC1Q0ZbjEgDllamGcvIKigSFxKVkFRZQDEGra8Hr2fi7fZHE7LFZAA)\n\n### Version\n\nty 0.0.2",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2075/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2074",
      "id": 3743454950,
      "node_id": "I_kwDOOje-Bs7fIJbm",
      "number": 2074,
      "title": "Annotated Self changes variance of class",
      "user": {
        "login": "Matt-Ord",
        "id": 55235095,
        "node_id": "MDQ6VXNlcjU1MjM1MDk1",
        "avatar_url": "https://avatars.githubusercontent.com/u/55235095?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Matt-Ord",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-18T14:42:21Z",
      "updated_at": "2026-01-08T19:20:33Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```python\nclass A[M: BasisMetadata = BasisMetadata]:\n    def __init__(self, metadata: M) -> None:\n        self._metadata = metadata\n\n    def makes_it_covariant(self) -> M:\n        \"\"\"An example method that makes the object covariant.\"\"\"\n        return self._metadata\n\n    def makes_it_invariant(self: A[Any]) -> None:\n        \"\"\"This (incorrectly?) makes the object invariant.\"\"\"\n```\n\nI've use this along with a similar pattern like\n```py\n    def makes_it_invariant[M1: BasisMetadata = BasisMetadata](\n        self: A[M1], other: M1\n    ) -> Never:\n        \"\"\"This (incorrectly?) makes the object invariant.\"\"\"\n```\n\n### Version\n\n0.0.2",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2074/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2073",
      "id": 3743403270,
      "node_id": "I_kwDOOje-Bs7fH80G",
      "number": 2073,
      "title": "Split more pedantic Liskov checks into separate error codes (and have them disabled by default)",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-18T14:29:16Z",
      "updated_at": "2025-12-18T14:29:16Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 1,
        "total_blocked_by": 1,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Our rule enforcing the Liskov Substitution Principle on method overrides (currently called `invalid-method-override`) is currently much stricter than any other type checker's equivalent rule. We should split the more pedantic parts of this rule out into separate error codes, so that it is easier for users switching from other type checkers to incrementally adopt ty: they will then be able to suppress the specific error codes that cover the parts pyright/mypy did not complain about on a per-module basis.\n\nOne situation where we are stricter than other type checkers currently is the situation where the subclass method parameter has the same type annotation to the superclass method parameter, but the parameter has a different name. Mypy [does not](https://mypy-play.net/?mypy=latest&python=3.12&gist=44806f2f7a48b90407ebfe700b029c41) complain about this; pyright [does](https://pyright-play.net/?pyrightVersion=1.1.405&pythonVersion=3.13&reportUnreachable=true&code=MYGwhgzhAECCBcAoaLoBMCmAzaBbDALgBYD2aAFBBiFgDTQAe80AlgHYECU0AtAHzQAciTYYkqCdAAOkCIkShZ0AELlYncakw58xMpWp1oAT2bsuvAcNGbJ02YiA), but only if the method is [not a dunder method](https://pyright-play.net/?pyrightVersion=1.1.405&pythonVersion=3.13&reportUnreachable=true&code=MYGwhgzhAECCBcAoaLoBMCmAzaB9XAthgC4AWA9mvgBQQYhYA00AHvNAJYB2xAlNAFoAfNABy5LhiSoZ0AA6QIiRKEXQAQtVi9pqTDnxEylGnQbMAnu259BI8ZN2z5ixEA):\n\n```py\nclass A:\n    def method(self, x: int) -> None:\n        pass\n\nclass B(A):\n    def method(self, y: int) -> None:\n        pass\n```\n\nAnother situation where we are stricter than other type checkers is the case where the superclass parameter is positional-or-keyword, but the subclass parameter is positional-only. Mypy [does not](https://mypy-play.net/?mypy=latest&python=3.12&gist=81eb1a0b42ad71aaeb24d13e2c054476) complain about this, but pyright [does](https://pyright-play.net/?pyrightVersion=1.1.405&pythonVersion=3.13&reportUnreachable=true&code=MYGwhgzhAECCBcAoaLoBMCmAzaBbDALgBYD2aAFBBiFgDTQAe80AlgHYECU0AtAHzQAciTYYkqCdAAOkCIkShZ0AELlYncakw58xMpWp1GzdgXoB6bvyEixySShlREQA) (and for this one, pyright [does not distinguish](https://pyright-play.net/?pyrightVersion=1.1.405&pythonVersion=3.13&reportUnreachable=true&code=MYGwhgzhAECCBcAoaLoBMCmAzaB9XAthgC4AWA9mvgBQQYhYA00AHvNAJYB2xAlNAFoAfNABy5LhiSoZ0AA6QIiRKEXQAQtVi9pqTDnxEylGnQbM2nHswD0-YWIlTkslAqiIgA) between dunder methods and non-dunder methods).\n\n```py\nclass A:\n    def method(self, x: int) -> None:\n        pass\n\nclass B(A):\n    def method(self, x: int, /) -> None:\n        pass\n```\n\nSimilar to https://github.com/astral-sh/ty/issues/1644, it's very hard to tackle this without propagating the reason for a subtyping failure out of our `Type::has_relation_to_impl` methods. So this is blocked by https://github.com/astral-sh/ty/issues/163 currently.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2073/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2072",
      "id": 3743359993,
      "node_id": "I_kwDOOje-Bs7fHyP5",
      "number": 2072,
      "title": "Fix `Todo` type inferred when subscripting an intersection",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-18T14:18:07Z",
      "updated_at": "2025-12-18T20:51:01Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "```py\nfrom typing import Sequence\n\nclass C: ...\n\ndef f(x: Sequence[int]):\n    if isinstance(x, C):\n        reveal_type(x[0])  # revealed: @Todo\n```\n\nWe should infer `int` there (and, same as our current behaviour, we should not emit a diagnostic).\n\nThis was previously attempted in https://github.com/astral-sh/ruff/pull/18846 but then reverted in https://github.com/astral-sh/ruff/pull/18920",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2072/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2071",
      "id": 3743337070,
      "node_id": "I_kwDOOje-Bs7fHspu",
      "number": 2071,
      "title": "Fix `Todo` type for starred expressions",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-18T14:13:15Z",
      "updated_at": "2025-12-18T20:42:10Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "`(1, *(2, 3), 4)` should be inferred as `tuple[Literal[1], Literal[2], Literal[3], Literal[4]]`, but we currentluy infer it as `tuple[Literal[1], @Todo(StarredExpression), Literal[4]]`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2071/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2070",
      "id": 3743144417,
      "node_id": "I_kwDOOje-Bs7fG9nh",
      "number": 2070,
      "title": "can’t create a type variable with a default on Python < 3.13 (false positive for invalid-legacy-type-variable)",
      "user": {
        "login": "flying-sheep",
        "id": 291575,
        "node_id": "MDQ6VXNlcjI5MTU3NQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/291575?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/flying-sheep",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-18T13:20:37Z",
      "updated_at": "2025-12-23T05:13:06Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nhttps://play.ty.dev/1f971569-26a4-4e0b-bfd4-158f9d46fa7f\n\n```python\nif TYPE_CHECKING or sys.version_info > (3, 13):\n    T = TypeVar(\"T\", default=int)\nelse:  # runtime on Python < 3.13\n    T = TypeVar(\"T\")\n```\n\noutputs\n\n> The `default` parameter of `typing.TypeVar` was added in Python 3.13 (invalid-legacy-type-variable) [Ln 5, Col 22]\n\nyeah I know, that’s why I only specify it in valid contexts.\n\n### Version\n\n0.0.3",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2070/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2069",
      "id": 3743140654,
      "node_id": "I_kwDOOje-Bs7fG8su",
      "number": 2069,
      "title": "functool partial and jax jit decorator interfere with argument types of function",
      "user": {
        "login": "chris-RNG",
        "id": 153906474,
        "node_id": "U_kgDOCSxtKg",
        "avatar_url": "https://avatars.githubusercontent.com/u/153906474?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/chris-RNG",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-18T13:19:39Z",
      "updated_at": "2025-12-23T21:42:01Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI'm not sure if this is a bug, but since a few ty updates ago, I've started encountering this type error when combining functools.partial with the jax.jit decorator on a function.\n\n```py\nfrom functools import partial\n\nimport jax\nimport jax.numpy as jnp\nfrom jax import Array\n\n\n@jax.jit\ndef sum_jit(a:Array, scale:float=1.0)->Array:\n    return jnp.sum(a)*scale\n\n@partial(jax.jit, static_argnames=[\"scale\"])\ndef sum_partial_jit(a:Array, scale:float=1.0)->Array:\n    return jnp.sum(a)*scale\n\ndef main():\n    n=12\n    a= jnp.ones(n)\n    sum1 = sum_jit(a)\n    sum2 = sum_partial_jit(a)\n    print(f\"sum1: {sum1}\")\n    print(f\"sum1: {sum2}\")\n\nif __name__ == \"__main__\":\n    main()\n```\n```\n$ uvx ty check\nerror[invalid-argument-type]: Argument is incorrect\n  --> main.py:20:27\n   |\n18 |     a= jnp.ones(n)\n19 |     sum1 = sum_jit(a)\n20 |     sum2= sum_partial_jit(a)\n   |                           ^ Expected `(...) -> Unknown`, found `Array`\n21 |     print(f\"sum1: {sum1}\")\n22 |     print(f\"sum1: {sum2}\")\n   |\ninfo: Union variant `((...) -> Unknown, /) -> JitWrapped` is incompatible with this call site\ninfo: Attempted to call union type `JitWrapped | (((...) -> Unknown, /) -> JitWrapped)`\ninfo: rule `invalid-argument-type` is enabled by default\n\nFound 1 diagnostic\n```\n\n### Version\n\nty 0.0.3",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2069/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2068",
      "id": 3743066851,
      "node_id": "I_kwDOOje-Bs7fGqrj",
      "number": 2068,
      "title": "Support finding dependencies in system Pythons that ty is installed into",
      "user": {
        "login": "leet0rz",
        "id": 29175192,
        "node_id": "MDQ6VXNlcjI5MTc1MTky",
        "avatar_url": "https://avatars.githubusercontent.com/u/29175192?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/leet0rz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 20,
      "created_at": "2025-12-18T13:02:32Z",
      "updated_at": "2026-01-07T22:35:43Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis is just neovim with ty LSP attached to the buffer and this error shows up:\n\n<img width=\"725\" height=\"197\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/e6c345d9-4f86-4132-96ab-33e3f971395d\" />\n\nThis does not happen with any of the other major LSPs, let me know if there is a fix for this.\n\n### Version\n\n0.0.3",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2068/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2063",
      "id": 3742781723,
      "node_id": "I_kwDOOje-Bs7fFlEb",
      "number": 2063,
      "title": "`__package__` in the global namespace should have type `str`, not `str | None`",
      "user": {
        "login": "spaceone",
        "id": 1100188,
        "node_id": "MDQ6VXNlcjExMDAxODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1100188?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/spaceone",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-12-18T11:50:53Z",
      "updated_at": "2026-01-07T23:31:00Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nI am unsure about the following, but mypy doesn't detect it:\n\n```sh\n$ ty check t.py \nt.py:4:23: error[invalid-argument-type] Argument to function `version` is incorrect: Expected `str`, found `str | None`\n$ cat t.py\n```\n```python\nfrom importlib.metadata import version\n\n\n__version__ = version(__package__)\n```\n\n### Version\n\n0.0.3",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2063/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2061",
      "id": 3742678766,
      "node_id": "I_kwDOOje-Bs7fFL7u",
      "number": 2061,
      "title": "Support `ty rule \"$RULE_NAME\"`",
      "user": {
        "login": "spaceone",
        "id": 1100188,
        "node_id": "MDQ6VXNlcjExMDAxODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1100188?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/spaceone",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-18T11:21:58Z",
      "updated_at": "2025-12-18T11:25:42Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Similar to ruff, ty could support a \"rule\" subcommand which explains the violation.\n\nI see that the violations are already documented:\nhttps://docs.astral.sh/ty/reference/rules/\n\nA local markdown version of it would be preferable.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2061/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2057",
      "id": 3742401469,
      "node_id": "I_kwDOOje-Bs7fEIO9",
      "number": 2057,
      "title": "How to correctly type async context managers with overloads",
      "user": {
        "login": "ddanier",
        "id": 113563,
        "node_id": "MDQ6VXNlcjExMzU2Mw==",
        "avatar_url": "https://avatars.githubusercontent.com/u/113563?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ddanier",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        },
        "2": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-12-18T10:12:53Z",
      "updated_at": "2026-01-08T19:32:21Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nI'm kind of desperate on this one, as nothing seems to work. I have an async context manager using some overloads. Nay combination I so far tried to use fails the `ty` type check. See the following code for examples:\n\n```python\nfrom collections.abc import AsyncIterator\nfrom contextlib import asynccontextmanager\nfrom typing import AsyncContextManager, overload, reveal_type\n\n# Not using overloads - works as expected\n\n@asynccontextmanager\nasync def test_contextmanager_plain(val: str | int) -> AsyncIterator[str]:\n    yield \"hello world\"\n\nreveal_type(test_contextmanager_plain)\n\nasync def call_asynccontextmanager_plain():\n    async with test_contextmanager_plain(123) as x:\n        reveal_type(x)\n\n# Using async context manager types\n\n@overload\ndef test_contextmanager_using_types(val: str) -> AsyncContextManager[str]: ...\n@overload\ndef test_contextmanager_using_types(val: int) -> AsyncContextManager[str]: ...\n@asynccontextmanager\nasync def test_contextmanager_using_types(val: str | int) -> AsyncIterator[str]:\n    yield \"hello world\"\n\nreveal_type(test_contextmanager_using_types)\n\nasync def call_asynccontextmanager_using_types():\n    async with test_contextmanager_using_types(123) as x:\n        reveal_type(x)\n\n# Using async iterator types (although this sounds wrong)\n\n@overload\ndef test_contextmanager_using_wrong_types(val: str) -> AsyncIterator[str]: ...\n@overload\ndef test_contextmanager_using_wrong_types(val: int) -> AsyncIterator[str]: ...\n@asynccontextmanager\nasync def test_contextmanager_using_wrong_types(val: str | int) -> AsyncIterator[str]:\n    yield \"hello world\"\n\nreveal_type(test_contextmanager_using_wrong_types)\n\nasync def call_asynccontextmanager_using_wrong_types():\n    async with test_contextmanager_using_wrong_types(123) as x:\n        reveal_type(x)\n\n# # Using the decorator in overloads\n\n@overload\n@asynccontextmanager\nasync def test_contextmanager_with_decorator(val: str) -> AsyncIterator[str]: ...\n@overload\n@asynccontextmanager\nasync def test_contextmanager_with_decorator(val: int) -> AsyncIterator[str]: ...\n@asynccontextmanager\nasync def test_contextmanager_with_decorator(val: str | int) -> AsyncIterator[str]:\n    yield \"hello world\"\n\nreveal_type(test_contextmanager_with_decorator)\n\nasync def call_asynccontextmanager_with_decorator():\n    async with test_contextmanager_with_decorator(123) as x:\n        reveal_type(x)\n```\n\nThe `ty` result is:\n```\ninfo[revealed-type]: Revealed type\n  --> ty_test.py:11:13\n   |\n 9 |     yield \"hello world\"\n10 |\n11 | reveal_type(test_contextmanager_plain)\n   |             ^^^^^^^^^^^^^^^^^^^^^^^^^ `(val: str | int) -> _AsyncGeneratorContextManager[str, None]`\n12 |\n13 | async def call_asynccontextmanager_plain():\n   |\n\ninfo[revealed-type]: Revealed type\n  --> ty_test.py:15:21\n   |\n13 | async def call_asynccontextmanager_plain():\n14 |     async with test_contextmanager_plain(123) as x:\n15 |         reveal_type(x)\n   |                     ^ `str`\n16 |\n17 | # Using async context manager types\n   |\n\nerror[invalid-argument-type]: Argument to function `asynccontextmanager` is incorrect\n  --> ty_test.py:23:1\n   |\n21 | @overload\n22 | def test_contextmanager_using_types(val: int) -> AsyncContextManager[str]: ...\n23 | @asynccontextmanager\n   | ^^^^^^^^^^^^^^^^^^^^ Expected `(...) -> AsyncIterator[Unknown]`, found `Overload[(val: str) -> AbstractAsyncContextManager[str, bool | None], (val: int) -> AbstractAsyncContextManager[str, bool | None]]`\n24 | async def test_contextmanager_using_types(val: str | int) -> AsyncIterator[str]:\n25 |     yield \"hello world\"\n   |\ninfo: Function defined here\n   --> stdlib/contextlib.pyi:177:5\n    |\n175 |         ) -> bool | None: ...\n176 |\n177 | def asynccontextmanager(func: Callable[_P, AsyncIterator[_T_co]]) -> Callable[_P, _AsyncGeneratorContextManager[_T_co]]:\n    |     ^^^^^^^^^^^^^^^^^^^ ---------------------------------------- Parameter declared here\n178 |     \"\"\"@asynccontextmanager decorator.\n    |\ninfo: rule `invalid-argument-type` is enabled by default\n\ninfo[revealed-type]: Revealed type\n  --> ty_test.py:27:13\n   |\n25 |     yield \"hello world\"\n26 |\n27 | reveal_type(test_contextmanager_using_types)\n   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(...) -> _AsyncGeneratorContextManager[Unknown, None]`\n28 |\n29 | async def call_asynccontextmanager_using_types():\n   |\n\ninfo[revealed-type]: Revealed type\n  --> ty_test.py:31:21\n   |\n29 | async def call_asynccontextmanager_using_types():\n30 |     async with test_contextmanager_using_types(123) as x:\n31 |         reveal_type(x)\n   |                     ^ `str | Unknown`\n32 |\n33 | # Using async iterator types (although this sounds wrong)\n   |\n\ninfo[revealed-type]: Revealed type\n  --> ty_test.py:43:13\n   |\n41 |     yield \"hello world\"\n42 |\n43 | reveal_type(test_contextmanager_using_wrong_types)\n   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Overload[(val: str) -> _AsyncGeneratorContextManager[str | None, None], (val: int) -> _AsyncGeneratorContextManager[str | None, None]]`\n44 |\n45 | async def call_asynccontextmanager_using_wrong_types():\n   |\n\nerror[invalid-context-manager]: Object of type `AsyncIterator[str] | _AsyncGeneratorContextManager[str | None, None]` cannot be used with `async with` because the methods `__aenter__` and `__aexit__` are possibly missing\n  --> ty_test.py:46:16\n   |\n45 | async def call_asynccontextmanager_using_wrong_types():\n46 |     async with test_contextmanager_using_wrong_types(123) as x:\n   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n47 |         reveal_type(x)\n   |\ninfo: rule `invalid-context-manager` is enabled by default\n\ninfo[revealed-type]: Revealed type\n  --> ty_test.py:47:21\n   |\n45 | async def call_asynccontextmanager_using_wrong_types():\n46 |     async with test_contextmanager_using_wrong_types(123) as x:\n47 |         reveal_type(x)\n   |                     ^ `CoroutineType[Any, Any, str | None]`\n48 |\n49 | # # Using the decorator in overloads\n   |\n\nerror[invalid-argument-type]: Argument to function `asynccontextmanager` is incorrect\n  --> ty_test.py:52:1\n   |\n51 | @overload\n52 | @asynccontextmanager\n   | ^^^^^^^^^^^^^^^^^^^^ Expected `(...) -> AsyncIterator[Unknown]`, found `def test_contextmanager_with_decorator(val: str) -> CoroutineType[Any, Any, AsyncIterator[str]]`\n53 | async def test_contextmanager_with_decorator(val: str) -> AsyncIterator[str]: ...\n54 | @overload\n   |\ninfo: Function defined here\n   --> stdlib/contextlib.pyi:177:5\n    |\n175 |         ) -> bool | None: ...\n176 |\n177 | def asynccontextmanager(func: Callable[_P, AsyncIterator[_T_co]]) -> Callable[_P, _AsyncGeneratorContextManager[_T_co]]:\n    |     ^^^^^^^^^^^^^^^^^^^ ---------------------------------------- Parameter declared here\n178 |     \"\"\"@asynccontextmanager decorator.\n    |\ninfo: rule `invalid-argument-type` is enabled by default\n\nerror[invalid-argument-type]: Argument to function `asynccontextmanager` is incorrect\n  --> ty_test.py:55:1\n   |\n53 | async def test_contextmanager_with_decorator(val: str) -> AsyncIterator[str]: ...\n54 | @overload\n55 | @asynccontextmanager\n   | ^^^^^^^^^^^^^^^^^^^^ Expected `(...) -> AsyncIterator[Unknown]`, found `def test_contextmanager_with_decorator(val: int) -> CoroutineType[Any, Any, AsyncIterator[str]]`\n56 | async def test_contextmanager_with_decorator(val: int) -> AsyncIterator[str]: ...\n57 | @asynccontextmanager\n   |\ninfo: Function defined here\n   --> stdlib/contextlib.pyi:177:5\n    |\n175 |         ) -> bool | None: ...\n176 |\n177 | def asynccontextmanager(func: Callable[_P, AsyncIterator[_T_co]]) -> Callable[_P, _AsyncGeneratorContextManager[_T_co]]:\n    |     ^^^^^^^^^^^^^^^^^^^ ---------------------------------------- Parameter declared here\n178 |     \"\"\"@asynccontextmanager decorator.\n    |\ninfo: rule `invalid-argument-type` is enabled by default\n\ninfo[revealed-type]: Revealed type\n  --> ty_test.py:61:13\n   |\n59 |     yield \"hello world\"\n60 |\n61 | reveal_type(test_contextmanager_with_decorator)\n   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(val: str | int) -> _AsyncGeneratorContextManager[str, None]`\n62 |\n63 | async def call_asynccontextmanager_with_decorator():\n   |\n\ninfo[revealed-type]: Revealed type\n  --> ty_test.py:65:21\n   |\n63 | async def call_asynccontextmanager_with_decorator():\n64 |     async with test_contextmanager_with_decorator(123) as x:\n65 |         reveal_type(x)\n   |                     ^ `Unknown | str`\n   |\n\nFound 12 diagnostics\n```\n\nAs you see the only variant thats actually working as expected is the one without the overloads.\n\nThe variant \"using async context manager types\" tells me the arguments to `@asynccontextmanager` are wrong cause of the overloads. Also the return type of `test_contextmanager_using_types` is set to `Unknown` instead of `str`.\n\nWith the last alpha version I was using the \"wrong\" typing version, which worked (but was pretty obviously wrong). Now it also complains about the `@asynccontextmanager` arguments plus has the wrong return type for the context manager (`CoroutineType[Any, Any, str | None]`, which even if you skip the coroutine part is still `str | None` instead of just `str`).\n\nI then tried to using decorators in the overloads, as I thought this might just set the correct type, but again the arguments to `@asynccontextmanager` are wrong plus the return type of the context manager is `Unknown | str` instead of just `str`.\n\nIs this still a restriction of the beta state of `ty` (btw. 🥳 for getting to beta, love the project) or am I doing something wrong?\n\n**Note:** `mypy` does allow the version with (I think) correct typing, but the return value is still `Any`, so this also is not completely working there.\n\n### Version\n\n0.0.3",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2057/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2053",
      "id": 3741907667,
      "node_id": "I_kwDOOje-Bs7fCPrT",
      "number": 2053,
      "title": "Use Iterable type context when inferring types inside a literal tuple",
      "user": {
        "login": "gpajot",
        "id": 7187655,
        "node_id": "MDQ6VXNlcjcxODc2NTU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7187655?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gpajot",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-12-18T07:56:54Z",
      "updated_at": "2026-01-08T19:12:46Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis has some similarities with https://github.com/astral-sh/ty/issues/1576 at first glance.\n\n[Playground link](https://play.ty.dev/19eadbf5-16e1-49e6-bc2b-f9f7743df92e)\n\nIt fails in all those circumstances:\n\n- `float` is replaced by any union type (`float` itself is transformed to `int | float` as per the error message)\n- `Iterable` is replaced by `Sequence` (and maybe other `collections.abc` types?)\n- input value is replaced by `set` or `list`\n- `dataclass` is replaced by either a normal generic class or a generic pydantic model\n\nIt does work if we replace `Iterable` by a concrete container class such as `tuple`.\nIt also works if replacing the generic data class by a generic built-in type such as `list[T]`.\n\nThanks for the tremendous work by the way!\n\n\n\n### Version\n\nty 0.0.3 (06305f3c0 2025-12-18)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2053/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2052",
      "id": 3741653644,
      "node_id": "I_kwDOOje-Bs7fBRqM",
      "number": 2052,
      "title": "False-positive `inconsistent-mro` when subclassing `Generic` and a \"protocol-like ABC\"",
      "user": {
        "login": "gschaffner",
        "id": 11418203,
        "node_id": "MDQ6VXNlcjExNDE4MjAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/11418203?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gschaffner",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-18T06:21:46Z",
      "updated_at": "2025-12-23T05:17:35Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nReproducer ([playground](https://play.ty.dev/b69404c6-38c0-4969-b4b8-f3755b668c5a)):\n\n```python\nfrom contextlib import AbstractContextManager\nfrom typing import Generic\nfrom typing import TypeVar\n\nT = TypeVar(\"T\")\n\n\nclass A(Generic[T], AbstractContextManager):  # error: inconsistent-mro\n    ...\n\n\nclass B(AbstractContextManager, Generic[T]):  # no error\n    ...\n```\n\nOutput:\n\n```console\n$ ty check eg.py\nerror[inconsistent-mro]: Cannot create a consistent method resolution order (MRO) for class `A` with bases list `[<special-form 'typing.Generic[T]'>, <class 'AbstractContextManager'>]`\n --> eg.py:8:1\n  |\n8 | / class A(Generic[T], AbstractContextManager):  # error: inconsistent-mro\n9 | |     ...\n  | |_______^\n  |\ninfo: rule `inconsistent-mro` is enabled by default\n\nFound 1 diagnostic\n```\n\nhttps://github.com/python/typeshed/pull/13005 is related.\n\n### Version\n\nty 0.0.3",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2052/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2051",
      "id": 3741424845,
      "node_id": "I_kwDOOje-Bs7fAZzN",
      "number": 2051,
      "title": "docstrings and signatures in hovers should fallback to base classes",
      "user": {
        "login": "KeepNoob",
        "id": 101505765,
        "node_id": "U_kgDOBgza5Q",
        "avatar_url": "https://avatars.githubusercontent.com/u/101505765?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KeepNoob",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-18T04:38:19Z",
      "updated_at": "2025-12-18T12:45:42Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nCurrently, ty only support doc string star with \"\"\", but in some case the package author use `___doc___` instead. For example, class `Cov2d` in Pytorch use `__doc__` which could not display within ty.\n\n<img width=\"2424\" height=\"742\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/9ad6e5fa-3fb3-4433-adc7-c1c961d635e8\" />\n\nTy result:\n<img width=\"1166\" height=\"222\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/91b7d782-f9c9-475c-9a1b-7913d6291251\" />\n\nAnd in Pyrefly and Pylance, it also render function signature.\n\nPyrefly:\n<img width=\"924\" height=\"646\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/2486f795-b9cb-4cf3-a4de-c6dcdf1ad468\" />\n\n\n\n \n\n### Version\n\nVS Code Ty extension 2025.74.0",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2051/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2045",
      "id": 3740963515,
      "node_id": "I_kwDOOje-Bs7e-pK7",
      "number": 2045,
      "title": "Handle \"deep\" mutual typevar constraints",
      "user": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-18T00:42:15Z",
      "updated_at": "2025-12-18T00:42:30Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Pulling this out from https://github.com/astral-sh/ruff/pull/21551#discussion_r2566717765 into a standalone issue.\n\nNow that we're using the new constraint solver for `Callable` types, we can create constraint sets with an interesting pattern that we don't yet support. The failing mdtest is:\n\n```py\ndef invoke[A, B](fn: Callable[[A], B], value: A) -> B:\n    return fn(value)\n\ndef head[T](xs: list[T]) -> T:\n    return xs[0]\n\n# TODO: this should be `Unknown | int`\nreveal_type(invoke(head, [1, 2, 3]))\n```\n\nWe end up inferring this constraint set when comparing `head` to `Callable[[A], B]`:\n\n```\n(B@invoke ≤ T@head) ∧ (list[T@head] ≤ A@invoke)\n```\n\nWe then try to remove `T@head` from the constraint set by calculating\n\n```\n∃T@head ⋅ (B@invoke ≤ T@head) ∧ (list[T@head] ≤ A@invoke)\n```\n\nWe should be able to pick `T@head = B@invoke` and simplify that to\n\n```\n(B@invoke = *) ∧ (list[B@invoke] ≤ A@invoke)\n```\n\nwhich would then be enough to propagate through the return type to discharge this TODO. This will require adding more derived facts to the sequent map.\n\nFor co- and contravariant uses of the typevar, this will be straightforward, because the subtyping will carry through monotonically. For invariant uses, we will probably need a new `Type` variant to encode/remember the constraints from the abstracted-away typevar.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2045/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2044",
      "id": 3740840966,
      "node_id": "I_kwDOOje-Bs7e-LQG",
      "number": 2044,
      "title": "Consider behavior when `VIRTUAL_ENV` is set to a missing directory",
      "user": {
        "login": "zanieb",
        "id": 2586601,
        "node_id": "MDQ6VXNlcjI1ODY2MDE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2586601?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zanieb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-12-17T23:37:33Z",
      "updated_at": "2025-12-18T17:29:00Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is pulled out of https://github.com/astral-sh/ty/issues/2031 which I'd prefer to keep scoped to the panic in the language server. A couple thoughts were expressed there, e.g., https://github.com/astral-sh/ty/issues/2031#issuecomment-3667543854\n\nToday, we error when `VIRTUAL_ENV` refers to a missing path. There's not a clear consensus on whether or not we should continue to other methods of Python environment discovery. If we ignore an invalid `VIRTUAL_ENV` value, we should probably warn?\n\nI don't think we need to act on this urgently, but I'd like to have a central place for discussion.\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2044/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2043",
      "id": 3740830068,
      "node_id": "I_kwDOOje-Bs7e-Il0",
      "number": 2043,
      "title": "`<TypedDict> |= {}` fails with `unsupported-operator`",
      "user": {
        "login": "zanieb",
        "id": 2586601,
        "node_id": "MDQ6VXNlcjI1ODY2MDE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2586601?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zanieb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "ibraheemdev",
          "id": 34988408,
          "node_id": "MDQ6VXNlcjM0OTg4NDA4",
          "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ibraheemdev",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-17T23:30:54Z",
      "updated_at": "2026-01-09T05:29:22Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://play.ty.dev/3c2f6220-f3ad-48ed-b960-d80d9d611de2\n\n```python\nfrom typing_extensions import TypedDict\n\nclass ModelSettings(TypedDict):\n    pass\n\nbase = ModelSettings()\noverrides = ModelSettings()\nbase |= overrides # ok\nbase |= {} # error\n```\n\nBriefly discussed in the [dev channel](https://discord.com/channels/1039017663004942429/1343690517745111081/1450991812138369168)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2043/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2041",
      "id": 3740568753,
      "node_id": "I_kwDOOje-Bs7e9Iyx",
      "number": 2041,
      "title": "Type Narrowing on match with multiple case",
      "user": {
        "login": "Polandia94",
        "id": 73709191,
        "node_id": "MDQ6VXNlcjczNzA5MTkx",
        "avatar_url": "https://avatars.githubusercontent.com/u/73709191?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Polandia94",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-17T21:27:50Z",
      "updated_at": "2026-01-08T19:06:47Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nType Narrowing on a match class with multiple cases is not working correctly. \nIf there is only one case is working fine. On pylance, and mypy the same example works\n\nplayground link https://play.ty.dev/30d20c1a-1fd3-4fdc-a495-675c0eb2dee8\non mypy https://mypy-play.net/?mypy=latest&python=3.12&gist=c5e206614ccee154996e4363afe72549\n\n```py\nclass BaseClass: ...\nclass Implementation(BaseClass): ...\nclass ImplementationWithValue(BaseClass):\n   value: int\nclass OtherImplementationWithValue(BaseClass):\n   value: int\ndef get_instance() -> BaseClass:\n    return ImplementationWithValue()\ninstance = get_instance()\nmatch instance:\n    case ImplementationWithValue():\n        pass\n    case OtherImplementationWithValue():\n        pass\n    case _:\n        raise Exception()\nreveal_type(instance) # BaseClass on ty, but ImplementationWithValue | OtherImplementationWithValue on pylance and mypy\ninstance.value # Object of type BaseClass has no attribute value\nmatch instance:\n    case ImplementationWithValue():\n        pass\n    case _:\n        raise Exception()\nreveal_type(instance) # ImplementationWithValue\ninstance.value # works\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2041/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2039",
      "id": 3740489758,
      "node_id": "I_kwDOOje-Bs7e81ge",
      "number": 2039,
      "title": "Stack overflow with recursive callables",
      "user": {
        "login": "correctmost",
        "id": 134317971,
        "node_id": "U_kgDOCAGHkw",
        "avatar_url": "https://avatars.githubusercontent.com/u/134317971?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/correctmost",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        },
        "2": {
          "id": 9775918749,
          "node_id": "LA_kwDOOje-Bs8AAAACRrCunQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fuzzer",
          "name": "fuzzer",
          "color": "cf5f2e",
          "default": false,
          "description": "Issues surfaced by fuzzing ty"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-17T21:09:55Z",
      "updated_at": "2026-01-08T17:49:01Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nty crashes when checking this code:\n\n```python\nfrom typing import Callable\n\ndef fn[**T, U](c: Callable[T, U]) -> Callable[T, U]:\n    return c\n\nfn(fn)\n```\n\n```\nthread '<unknown>' (2580764) has overflowed its stack\nfatal runtime error: stack overflow, aborting\n```\n\n### Version\n\na15bc9c249 w/ astral-sh/ruff@b36ff75a2",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2039/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2034",
      "id": 3740386726,
      "node_id": "I_kwDOOje-Bs7e8cWm",
      "number": 2034,
      "title": "Server: Project in nested directory",
      "user": {
        "login": "ColemanDunn",
        "id": 42652642,
        "node_id": "MDQ6VXNlcjQyNjUyNjQy",
        "avatar_url": "https://avatars.githubusercontent.com/u/42652642?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ColemanDunn",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-12-17T20:40:20Z",
      "updated_at": "2026-01-10T09:03:48Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nGiven a project structure like this: \n\n```\nmy_repo\n├── backend\n│   ├── pyproject.toml\n│   ├── .venv\n│   └── app\n├── frontend\n└── README.md\n```\n\nThe ty extension is both able to find the executable in my `.venv` folder (although I suspect this is because it is the chosen environment for my vscode (cursor) project) and support go to definition for both first and third party modules.\n\nHowever, rule configuration in my `pyproject.toml` are not respected and first party module auto imports do not work. I suspect both of these are due to the ty extension not discovering my `pyproject.toml` file. \n\nIf I do \n```toml\n[tool.ty.rules]\nunsupported-operator = \"ignore\"\n```\nor set it to `warn`, `a = 10 + \"test\"` still shows as an error.\n\n\nRuff configuration still works however without me having to point it to the toml file via some setting. \n\nA lot if not most linter extensions have some sort of \"path to config file\" setting (including the (now old) ruff extension on pycharm), though given how ruff auto-discovers it just fine, perhaps a setting like this is not needed and it this could be a bug in `ty` if not a missing feature. \n\nThanks! Excited to use `ty` in vscode\n\n### Version\n\n0.0.2",
      "closed_by": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2034/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2032",
      "id": 3740252121,
      "node_id": "I_kwDOOje-Bs7e77fZ",
      "number": 2032,
      "title": "Feature: Support for setting virtual environment path in LSP settings",
      "user": {
        "login": "joshzcold",
        "id": 36175703,
        "node_id": "MDQ6VXNlcjM2MTc1NzAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/36175703?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/joshzcold",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        },
        "1": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "2": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 8,
      "created_at": "2025-12-17T19:55:39Z",
      "updated_at": "2025-12-31T15:43:54Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nSupport for setting the virtual env path via lsp settings aswell as `VIRTUAL_ENV`\n\n`basepyright` supports this in the form of \n\n> python.venvPath [path]: Path to folder with subdirectories that contain virtual environments. The python.pythonPath setting is recommended over this mechanism for most users. For more details, refer to the [import resolution](https://docs.basedpyright.com/v1.23.1/usage/import-resolution/#configuring-your-python-environment) documentation.\n\nhttps://docs.basedpyright.com/v1.23.1/configuration/language-server-settings/\n\nWhat this allows is editors to have the ability to configure the path to virtual environment dynamically instead of having to set it in the OS environment and restarting the lsp server.\n\nSee my plugins interaction with `basedpyright` for details.\nhttps://github.com/joshzcold/python.nvim/blob/main/lua/python/lsp/init.lua#L23\n\n### Version\n\nty 0.0.2",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2032/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2030",
      "id": 3740115011,
      "node_id": "I_kwDOOje-Bs7e7aBD",
      "number": 2030,
      "title": "Generics inference fails for @contextmanagers with TypeVars.",
      "user": {
        "login": "amol-mandhane",
        "id": 1002513,
        "node_id": "MDQ6VXNlcjEwMDI1MTM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1002513?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/amol-mandhane",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-17T19:06:59Z",
      "updated_at": "2026-01-05T19:36:11Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nRepro:\n\n```py\nfrom contextlib import contextmanager\nfrom collections.abc import Generator\n\nclass Base:\n    pass\n\nclass Derived(Base):\n    pass\n\n\ndef factory[T: Base](cls: type[T]) -> T:\n    return cls()\n\nd = factory(Derived)\n\n@contextmanager\ndef yielder[T: Base](cls: type[T]) -> Generator[T]:\n    yield cls()\n\nwith yielder(Derived) as d:  # error [invalid-argument-type] \"Argument is incorrect: Expected `type[T@yielder]`, found `<class 'Derived'>`! \n    print(d)\n```\n\nhttps://play.ty.dev/b74578ac-adaf-4c71-a316-e813c7ad701c\n\nCalling `yielder(Derived)` should infer `T` as `Derived` (since `Derived` is a subclass of `Base`), matching the behavior of the regular function `factory(Derived)`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2030/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2029",
      "id": 3740075448,
      "node_id": "I_kwDOOje-Bs7e7QW4",
      "number": 2029,
      "title": "Autocomplete prioritizes nested classes over properties",
      "user": {
        "login": "steved-stripe",
        "id": 92450106,
        "node_id": "U_kgDOBYKtOg",
        "avatar_url": "https://avatars.githubusercontent.com/u/92450106?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/steved-stripe",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-17T18:55:01Z",
      "updated_at": "2025-12-31T15:43:32Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nwhen trying to autocomplete the fields on `stripe.Subscription`\n\nI see:\n\n<img width=\"535\" height=\"254\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/39eaee13-252b-4b12-8e77-9426bb5d157d\" />\n\nwhich are the various nested classes (not super useful to me)\n\nIdeally I'd see the properties first:\n\n\n<img width=\"537\" height=\"256\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/8ae3c87e-ad24-433e-8370-d7fa0be63660\" />\n\n### Version\n\nastral-sh.ty 2025.72.0",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2029/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2028",
      "id": 3740048836,
      "node_id": "I_kwDOOje-Bs7e7J3E",
      "number": 2028,
      "title": "Go to Definition not working for stringified nested class",
      "user": {
        "login": "steved-stripe",
        "id": 92450106,
        "node_id": "U_kgDOBYKtOg",
        "avatar_url": "https://avatars.githubusercontent.com/u/92450106?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/steved-stripe",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-17T18:46:55Z",
      "updated_at": "2026-01-09T09:32:44Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```python\nclass Foo:\n    class Bar:\n        customer: str\ndef f(p: \"Foo.Bar\"): ...\n#             ^^^ goto-def doesn't work\nf(Foo.Bar())\n```\n\nhttps://play.ty.dev/5f9d19ff-1647-4de6-98b9-bee5b961ec1f\n\n### Version\n\n30c3f9aaf",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2028/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2024",
      "id": 3739841249,
      "node_id": "I_kwDOOje-Bs7e6XLh",
      "number": 2024,
      "title": "error[invalid-type-arguments] for TypeAlias involving ParamSpec Concatentate",
      "user": {
        "login": "GalHorowitz",
        "id": 7957292,
        "node_id": "MDQ6VXNlcjc5NTcyOTI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7957292?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/GalHorowitz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-17T17:43:35Z",
      "updated_at": "2025-12-17T18:15:25Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nExample code:\n```python\nfrom typing import Callable, Concatenate, ParamSpec, TypeAlias, TypeVar\n\nT = TypeVar(\"T\")\nP = ParamSpec(\"P\")\n\nA: TypeAlias = Callable[Concatenate[bool, P], T]\nB: TypeAlias = T | A[P, T]\nC: TypeAlias = B[T, []]\n```\n\nResult of running `ty check`:\n```\nerror[invalid-type-arguments]: No type argument provided for required type variable `T`\n --> ty_test.py:8:16\n  |\n6 | A: TypeAlias = Callable[Concatenate[bool, P], T]\n7 | B: TypeAlias = T | A[P, T]\n8 | C: TypeAlias = B[T, []]\n  |                ^^^^^^^^\n  |\ninfo: rule `invalid-type-arguments` is enabled by default\n```\n\n### Version\n\nty 0.0.2 (42835578d 2025-12-16)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2024/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2015",
      "id": 3739198856,
      "node_id": "I_kwDOOje-Bs7e36WI",
      "number": 2015,
      "title": "Inconsistent type inference for `tuple[int, ...]` when using `type` and `TypeAlias`",
      "user": {
        "login": "tomasr8",
        "id": 8739637,
        "node_id": "MDQ6VXNlcjg3Mzk2Mzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/8739637?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tomasr8",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 9807383197,
          "node_id": "LA_kwDOOje-Bs8AAAACSJDKnQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20aliases",
          "name": "type aliases",
          "color": "ebd684",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-17T14:44:17Z",
      "updated_at": "2026-01-05T14:50:31Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWasn't sure how to describe this exactly but here's a small reproducer. Notice that `foo_slice` is either inferred to be `tuple[int, int]` or `tuple[int, ...]` depending on how `Version` is defined:\n\n#### Using `TypeAlias`\n\n```python\nVersion: TypeAlias = tuple[int, int, int]\n\ndef foo() -> Version:\n    return (1, 2, 3)\n\n# Inferred as tuple[int, int]\nfoo_slice = foo()[:2]\n```\n\n#### Using `type` keyword\n\n```python\ntype Version = tuple[int, int, int]\n\ndef foo() -> Version:\n    return (1, 2, 3)\n\n# Inferred as tuple[int, ...]\nfoo_slice = foo()[:2]\n```\n\nI'd expect both to behave the same, ruff even recommends to use the latter..\n\nplayground link: https://play.ty.dev/d8cdb949-9e7e-48e5-8866-f41eac402931\n\n### Version\n\nty 0.0.2",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2015/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2003",
      "id": 3738693456,
      "node_id": "I_kwDOOje-Bs7e1-9Q",
      "number": 2003,
      "title": "Add more documentation to special forms in `ty_extensions.pyi` stub",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-12-17T12:25:40Z",
      "updated_at": "2025-12-17T19:56:03Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It's easy for users to jump to these definitions in the stub file from inlay hints. It will be even easier to jump to these definitions if something like https://github.com/astral-sh/ty/issues/1575 is implemented.\n\nWe should add more docstrings/comments to the stub file so that users have a better experience when they land there. Ideally we would also show this documentation on hover, so that users can easily learn about what the `Unknown` type means and represents, for example.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2003/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2001",
      "id": 3738596333,
      "node_id": "I_kwDOOje-Bs7e1nPt",
      "number": 2001,
      "title": "Rename `invalid-method-override` rule",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-17T11:58:23Z",
      "updated_at": "2025-12-17T11:58:23Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We have lots of rules that complain about invalid method overrides of one sort or another, and we'll be adding more in the future. The `invalid-method-override` rule is specifically about Liskov violations, but its name doesn't reflect that currently. `unsound-method-override` might be better, though it's still not great. Maybe `incompatible-method-override`?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2001/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1998",
      "id": 3738331261,
      "node_id": "I_kwDOOje-Bs7e0mh9",
      "number": 1998,
      "title": "ty hangs on combination of self-ref Union, dataclass and Protocol",
      "user": {
        "login": "sinon",
        "id": 146272,
        "node_id": "MDQ6VXNlcjE0NjI3Mg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/146272?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sinon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8608317604,
          "node_id": "LA_kwDOOje-Bs8AAAACARiApA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/hang",
          "name": "hang",
          "color": "b60205",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "mtshiba",
          "id": 45118249,
          "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
          "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mtshiba",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-17T10:40:24Z",
      "updated_at": "2025-12-26T12:25:35Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nAn attempt at an MRE for a hang we are seeing on one of our repos:\nRun with: `uv tool run ty check mre.py`\n```py\nfrom __future__ import annotations  # removing this cause it not to hang\nimport dataclasses\n\nfrom typing import (\n    Protocol,\n    Union,\n)\n\n\n@runtime_checkable\nclass Traceable(Protocol):\n    \"\"\"Protocol for objects that provide custom trace representations.\"\"\"\n\n    def trace_repr(self) -> TraceableValue:\n        \"\"\"Return a dictionary representation suitable for tracing.\"\"\"\n        ...\n\n\nTraceableValue = Union[\n    Traceable,\n    bool,  # removing bool causes it to not hang\n    # One of the following self-referential types are needed to hang\n    # list[\"TraceableValue\"],\n    # dict[str, \"TraceableValue\"],\n    tuple[\"TraceableValue\", ...],\n]\n\n\n@dataclasses.dataclass\nclass FilledOutfit:\n    def trace_repr(self) -> TraceableValue:\n        return False\n\n```\n\nNo play.ty.dev link as it causes a fun failure state:\n\n<img width=\"1251\" height=\"893\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/b4917ca3-5953-463b-9ac6-10d7e0a30cad\" />\n\n### Version\n\nty 0.0.2 (42835578d 2025-12-16)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1998/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1997",
      "id": 3738315080,
      "node_id": "I_kwDOOje-Bs7e0ilI",
      "number": 1997,
      "title": "Improve diagnostics for bad `__getitem__` calls",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-17T10:35:56Z",
      "updated_at": "2025-12-17T10:35:56Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis (seen on https://github.com/astral-sh/ruff/pull/22019#issuecomment-3664706394) is horrible UX for a diagnostic message:\n\n```\n+ pandera/engines/pandas_engine.py:1390:25: error[invalid-argument-type] Method `__getitem__` of type `Overload[(idx: int | signedinteger[_64Bit] | integer[Any] | signedinteger[_8Bit]) -> Unknown, (idx: Index[Any] | Series[Any] | slice[Any, Any, Any] | ndarray[tuple[Any, ...], dtype[integer[Any]]]) -> Series[Unknown], (idx: str | bytes | date | ... omitted 10 union elements) -> Unknown, (idx: Series[builtins.bool] | ndarray[tuple[Any, ...], dtype[numpy.bool[builtins.bool]]] | list[builtins.bool] | ... omitted 7 union elements) -> Series[Unknown]]` cannot be called with key of type `Series[bool] | DataFrame` on object of type `Series[Unknown]`\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1997/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1995",
      "id": 3738221477,
      "node_id": "I_kwDOOje-Bs7e0Lul",
      "number": 1995,
      "title": "Invalid assignability for a generic type using `ParamSpec`",
      "user": {
        "login": "tudoroancea",
        "id": 61800691,
        "node_id": "MDQ6VXNlcjYxODAwNjkx",
        "avatar_url": "https://avatars.githubusercontent.com/u/61800691?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tudoroancea",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-17T10:09:34Z",
      "updated_at": "2025-12-23T05:26:22Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHello there,\n\nI have noticed the following weird behavior in `assert_type` when instantiating a generic class using a `ParamSpec` type variable: the type of the resulting instance of the class is correctly inferred, but the assertion ignores it. \n\nConsider the minimal example below:\n```python\nfrom typing import Callable, assert_type, reveal_type\n\n\nclass C[T, **P]:\n  def __init__(self, fn: Callable[P, T]):\n    self.fn = fn\n\n\ndef f0(x: int) -> int:\n  return x\n\n\n# correctly passes\nassert_type((x := C(f0)), C[int, [int]])\nreveal_type(x)\n\n# correctly fails\nassert_type((x := C(f0)), C[str, [int]])\nreveal_type(x)\n\n# passing but shouldn't\nassert_type((x := C(f0)), C[int, [str]])\nreveal_type(x)\n```\nwhich gives the following output when running `ty check assert_type_ignores_paramspec.py` with a Python 3.13 \n```\ninfo[revealed-type]: Revealed type\n  --> assert_type_ignores_paramspec.py:15:13\n   |\n13 | # correctly passes\n14 | assert_type((x := C(f0)), C[int, [int]])\n15 | reveal_type(x)\n   |             ^ `C[int, (x: int)]`\n16 |\n17 | # correctly fails\n   |\n\nerror[type-assertion-failure]: Argument does not have asserted type `C[str, (int, /)]`\n  --> assert_type_ignores_paramspec.py:18:1\n   |\n17 | # correctly fails\n18 | assert_type((x := C(f0)), C[str, [int]])\n   | ^^^^^^^^^^^^^----------^^^^^^^^^^^^^^^^^\n   |              |\n   |              Inferred type is `C[int, (x: int)]`\n19 | reveal_type(x)\n   |\ninfo: `C[str, (int, /)]` and `C[int, (x: int)]` are not equivalent types\ninfo: rule `type-assertion-failure` is enabled by default\n\ninfo[revealed-type]: Revealed type\n  --> assert_type_ignores_paramspec.py:19:13\n   |\n17 | # correctly fails\n18 | assert_type((x := C(f0)), C[str, [int]])\n19 | reveal_type(x)\n   |             ^ `C[int, (x: int)]`\n   |\n\ninfo[revealed-type]: Revealed type\n  --> assert_type_ignores_paramspec.py:24:13\n   |\n22 | # passing but shouldn't\n23 | assert_type((x := C(f0)), C[int, [str]])\n24 | reveal_type(x)\n   |             ^ `C[int, (x: int)]`\n   |\n\nFound 4 diagnostics\n```\n\nYou can see that the type of each instance of `C` is correctly inferred (as shown with the `reveal_type`) but only changing the output type makes the assertion fail, not the input paramspec type.\n\nThank you in advance for your help.\n\n### Version\n\nty 0.0.2 (42835578d 2025-12-16)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1995/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1991",
      "id": 3738121771,
      "node_id": "I_kwDOOje-Bs7ezzYr",
      "number": 1991,
      "title": "goto-declaration to go to import instead of definition",
      "user": {
        "login": "sirfz",
        "id": 4741099,
        "node_id": "MDQ6VXNlcjQ3NDEwOTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4741099?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sirfz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-17T09:40:44Z",
      "updated_at": "2025-12-18T09:20:29Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Congrats on the Beta release!\n\nThis is a feature that existed forever in jedi since before LSPs existed and it's something that I've been missing (A LOT tbh) since moving on with (based)pyright which don't implement this LSP feature at all (iirc).\n\nBasically, if I call goto-declaration (not goto-definition) on an imported class/object/etc, it would jump to the import statement in the same file instead of the source definition.\n\nPyrefly already added this feature after I mentioned it on HN, which was cool. Would be great to also have it in Ty if possible (it already works in Zuban, which is the successor of Jedi).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1991/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1990",
      "id": 3737986189,
      "node_id": "I_kwDOOje-Bs7ezSSN",
      "number": 1990,
      "title": "don't emit diagnostics about \"shadowing\" when assignment target is not a local variable",
      "user": {
        "login": "SerTetora",
        "id": 95703687,
        "node_id": "U_kgDOBbRShw",
        "avatar_url": "https://avatars.githubusercontent.com/u/95703687?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SerTetora",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 7,
      "created_at": "2025-12-17T09:02:16Z",
      "updated_at": "2025-12-18T23:18:57Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```python\nfrom configparser import ConfigParser\n\ncfgparser = ConfigParser()\ncfgparser.optionxform = str  # <--- Should be allowed, per Python docs\n``` \nRef. https://docs.python.org/3/library/configparser.html#configparser.ConfigParser.optionxform\n\n### ty\n\n```\nImplicit shadowing of function `optionxform` (invalid-assignment) [Ln 4, Col 1]\n``` \n\n### pyrefly\n\n\n```\nERROR sandbox.py:4:25-28: `type[str]` is not assignable to attribute `optionxform` with type `BoundMethod[ConfigParser, (self: ConfigParser, optionstr: str) -> str]` [[bad-assignment](https://pyrefly.org/en/docs/error-kinds/#bad-assignment)]\n  Positional parameter name mismatch: got `object`, want `optionstr`\n``` \n\n### pyright\n\n```\nCannot assign to attribute \"optionxform\" for class \"ConfigParser\"\n  No overloaded function matches type \"(optionstr: str) -> str\"  (reportAttributeAccessIssue)\n``` \n\n### mypy\n\n```\nmain.py:4: error: Cannot assign to a method  [method-assign]\nmain.py:4: error: Incompatible types in assignment (expression has type \"type[str]\", variable has type \"Callable[[str], str]\")  [assignment]\nFound 2 errors in 1 file (checked 1 source file)\n``` \n\n### Version\n\n0.0.2",
      "closed_by": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1990/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1988",
      "id": 3737945782,
      "node_id": "I_kwDOOje-Bs7ezIa2",
      "number": 1988,
      "title": "Improve visibility of what ty version the extension is using",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-17T08:49:55Z",
      "updated_at": "2025-12-17T08:50:44Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "A common issue is that the extension uses a much older ty version than the bundled version without users noticing. Can we make it easier for users to notice when the extension uses the wrong ty version? Should we show the version in the status bar? Can we improve the ty discovery?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1988/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1986",
      "id": 3737928813,
      "node_id": "I_kwDOOje-Bs7ezERt",
      "number": 1986,
      "title": "LSP: pytest support",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-17T08:45:14Z",
      "updated_at": "2026-01-01T01:51:42Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "* Code lense to run test\n* List tests in the test explorer\n* Fixtures support?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1986/reactions",
        "total_count": 8,
        "+1": 7,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1985",
      "id": 3737907179,
      "node_id": "I_kwDOOje-Bs7ey-_r",
      "number": 1985,
      "title": "Wrong function argument inlay hint for overloaded function",
      "user": {
        "login": "benruijl",
        "id": 280089,
        "node_id": "MDQ6VXNlcjI4MDA4OQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/280089?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/benruijl",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-17T08:37:56Z",
      "updated_at": "2025-12-31T15:47:21Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis small script gives a wrong type hint for the argument `x` and `y` which should be part of `*names` but are interpreted as the value for `name` and the `is_symmetric` argument of another overloaded variant:\n\n```python\nfrom typing import overload, Optional, Sequence\n\n@overload\ndef S(name: str, is_symmetric: Optional[bool] = None) -> str:\n    pass\n\n@overload\ndef S(*names: str, is_symmetric: Optional[bool] = None) -> Sequence[str]:\n    pass\n\ndef S():\n    pass\n\nb = S('x', 'y') # argument hints for the wrong overloaded variant, return type is correct\n```\n\n<img width=\"426\" height=\"27\" alt=\"Wrong type hint\" src=\"https://github.com/user-attachments/assets/c45523c8-e389-484d-8bb3-41a15d72fc90\" />\n\nHere is the playground link:\n\nhttps://play.ty.dev/0a5f6d13-1e2d-4fca-adef-80af38cf120f\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1985/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1977",
      "id": 3737435904,
      "node_id": "I_kwDOOje-Bs7exL8A",
      "number": 1977,
      "title": "Generic type parameter incorrectly inferred from `Callable[[S], T | None]` as `T | None` instead of `T`",
      "user": {
        "login": "fadedDexofan",
        "id": 4462103,
        "node_id": "MDQ6VXNlcjQ0NjIxMDM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4462103?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/fadedDexofan",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-17T05:47:08Z",
      "updated_at": "2025-12-17T07:45:03Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Summary\n\nWhen a generic class has two parameters that share a type variable `T`:\n- `extractor: Callable[[S], T | None]`\n- `inner: Specification[T]`\n\nty incorrectly infers `T` from the Callable's return type as `T | None`, ignoring the concrete `T` from the `Specification[T]` argument.\n\n**Expected:** `T = int` (from `GreaterThanSpec` which is `Specification[int]`)\n**Actual:** `T = int | None` (from `Callable[[Container], int | None]`)\n\nmypy correctly infers `T = int`.\n\n## Minimal Reproduction\n[Ty playground link](https://play.ty.dev/dc5ccb2a-a953-4fa2-bef6-96cdd466a1bb)\n[MyPy playground link](https://mypy-play.net/?mypy=latest&python=3.14&flags=strict&gist=a1a4f9b57096163feedf6302549b4e69)\n\n```python\nfrom abc import ABC, abstractmethod\nfrom collections.abc import Callable\n\n\nclass Specification[T](ABC):\n    @abstractmethod\n    def is_satisfied_by(self, candidate: T, /) -> bool:\n        pass\n\n    def via[S](self, extractor: Callable[[S], T | None]) -> Specification[S]:\n        return LiftSpec(extractor, self)\n\n\nclass LiftSpec[S, T](Specification[S]):\n    def __init__(\n        self,\n        extractor: Callable[[S], T | None],\n        inner: Specification[T],\n    ) -> None:\n        self._extractor = extractor\n        self._inner = inner\n\n    def is_satisfied_by(self, candidate: S, /) -> bool:\n        extracted = self._extractor(candidate)\n        return extracted is not None and self._inner.is_satisfied_by(extracted)\n\n\nclass GreaterThanSpec(Specification[int]):\n    def __init__(self, threshold: int) -> None:\n        self._threshold = threshold\n\n    def is_satisfied_by(self, candidate: int, /) -> bool:\n        return candidate > self._threshold\n\n\nclass Container:\n    def __init__(self, value: int | None) -> None:\n        self.value = value\n\n\ndef extract_value(c: Container) -> int | None:\n    return c.value\n\n\n# All three should work - T should be inferred as `int` from GreaterThanSpec\nspec1 = LiftSpec(extract_value, GreaterThanSpec(5))  # ty error\nspec2 = GreaterThanSpec(10).via(extract_value)       # ty error  \nspec3 = LiftSpec[Container, int](extract_value, GreaterThanSpec(5))  # works with explicit params\n\nreveal_type(spec1)\nreveal_type(spec2)\nreveal_type(spec3)\n```\n\n## ty output\n\n```\nerror[invalid-argument-type]: Argument to bound method `__init__` is incorrect\n  --> repro.py:26:16\n   |\n25 |     def via[S](self, extractor: Callable[[S], T | None]) -> Specification[S]:\n26 |         return LiftSpec(extractor, self)\n   |                         ^^^^^^^^^ Expected `(S@via, /) -> None`, found `(S@via, /) -> T@Specification | None`\n\nerror[invalid-argument-type]: Argument to bound method `__init__` is incorrect\n  --> repro.py:26:27\n   |\n26 |         return LiftSpec(extractor, self)\n   |                                    ^^^^ Expected `Specification[None]`, found `Self@via`\n\nerror[invalid-argument-type]: Argument to bound method `__init__` is incorrect\n  --> repro.py:51:32\n   |\n51 | spec1 = LiftSpec(extract_value, GreaterThanSpec(5))\n   |                                 ^^^^^^^^^^^^^^^^^^ Expected `Specification[int | None]`, found `GreaterThanSpec`\n```\n\n## mypy output\n\nPasses with no errors. `reveal_type` shows correct inference:\n```\nRevealed type is \"LiftSpec[Container, int]\"\n```\n\n## Version\n\n```\nPython 3.14.2\nty 0.0.2 (42835578d 2025-12-16)\nmypy 1.19.1\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1977/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1976",
      "id": 3737413857,
      "node_id": "I_kwDOOje-Bs7exGjh",
      "number": 1976,
      "title": "LSP: Support callHierarchy/incomingCalls and callHierarchy/outgoingCalls",
      "user": {
        "login": "sr0lle",
        "id": 111277375,
        "node_id": "U_kgDOBqH1Pw",
        "avatar_url": "https://avatars.githubusercontent.com/u/111277375?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sr0lle",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-17T05:36:06Z",
      "updated_at": "2025-12-17T07:59:29Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "According to the [docs](https://docs.astral.sh/ty/features/language-server/#feature-reference), neither of the [callHierarchy methods](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#callHierarchy_incomingCalls) is supported yet. Both methods are incredibly helpful when navigating or refactoring large projects, so it would be fantastic to have support for both and bring the LSP closer to being feature-complete.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1976/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1972",
      "id": 3737066297,
      "node_id": "I_kwDOOje-Bs7evxs5",
      "number": 1972,
      "title": "False-positive `unsupported-operator` errors for value-constrained type variable",
      "user": {
        "login": "varchasgopalaswamy",
        "id": 2359219,
        "node_id": "MDQ6VXNlcjIzNTkyMTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2359219?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/varchasgopalaswamy",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-17T02:21:09Z",
      "updated_at": "2026-01-08T16:05:44Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI'm probably doing something wrong, but I can't figure it out. Here's a simple example of what I'm trying to do\n\n```python \nfrom typing import * \n\nScalar = TypeVar(\"Scalar\", int,float)\n\ndef test(a:Scalar) -> Scalar: \n    return a * 2\n\nreveal_type(test(10.0)) # should be float \nreveal_type(test(10)) # should be int \n```\n\n[Pyright](https://pyright-play.net/?code=GYJw9gtgBALgngBwJYDsDmUkQWEMoAqiApgGoCGIANFCMQG7HkA2A%2BvAsQFBcDKAxi0pQAvIRIUQACgBEAoSBk1UMKsGZhyMAJQ8AJsWCxiAZxhTyALnnNK2qAFoAfFBuVLULlG%2B1iMAK4gKFDkUABUUABMPHSMLOwkUjCm5gCMAAwAdOnaurFMbBzESSlSGblAA) works fine. \n\nMypy works, though I can't find a way to share a link to a playground. \n\n[pyrefly](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEALqcROgOZ0Q3G6UN0AqOgB10ogMoBjVFFSU6AXjoAVZjABqcgBTCQUmXN0AaTugZGwUXKgYBKUaMwwwjeAy2pE%2B2ZVt0AtAB8dN5yiCLodFF0lDAMAK6UkaiCdABMDuixAG4wMgD6TMQwWgxuWgCMAAyEVbb2WTC5BUUlZXDu1fUgRiDxDNBwJOSIIADEdACqA1AQTHRg8eiSA7jocJlOLmC8NDb56PE02DCUWvjhrHYBwR2UiKLRMXGJkWC6AHJHJ-d0wPgAX10oh6IDIsUspEIDFoUAoEwACqQIVBSHQ0Fg8Pg6JI1pA2IkbBA1oRRBNxDAYHQABYMBjEOCIAD0TPBzlRhF4bCZMHQTMwuEkcCZuPQ%2BMJqz5C14dFQ2VQ0FQ2FgOLxEAJlCJazouGIkqGojIDGpa38uUocGJkSUugAzIQKhkQCCAb1UCsILkAGLQGAUDE4AjDEAAoA) has no trouble with the operator, but thinks it's a bad return type. However, it's able to correctly infer the return types. \n\n[ty](https://play.ty.dev/f46e6884-cb9d-438e-a359-fdf38388ddc6) gives an unsupported operator error, and says the type of `test(10.0)` is `float | int`. Is there a more correct way to do what I'm trying to do? \n\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1972/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1971",
      "id": 3737063325,
      "node_id": "I_kwDOOje-Bs7evw-d",
      "number": 1971,
      "title": "Consider assuming that untyped decorators pass through the signature unchanged",
      "user": {
        "login": "afonsotrepa",
        "id": 33555779,
        "node_id": "MDQ6VXNlcjMzNTU1Nzc5",
        "avatar_url": "https://avatars.githubusercontent.com/u/33555779?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/afonsotrepa",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        },
        "1": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        },
        "2": {
          "id": 8645345133,
          "node_id": "LA_kwDOOje-Bs8AAAACA01_bQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type-inference",
          "name": "type-inference",
          "color": "442A97",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 9,
      "created_at": "2025-12-17T02:19:44Z",
      "updated_at": "2025-12-18T23:02:56Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI ran into this problem where ty wouldn't catch a mistyped return type but pyright would. Narrowed it down to a decorator I'm using.\nSorry if this is a known issue (a quick search didn't find another open issue for this) or limitation.\n\n### Example\n```Python\ndef deco(_):\n    def inner(func):\n        return func\n    return inner\n\n\n@deco(0)\ndef f() -> str:\n    return \"\"\n\n\ndef g() -> float:\n    return f()\n```\n\nExpected to get \"error[invalid-return-type]\" (which is indeed what we see if we remove the decorator) but instead got all checks passing.\n\n\n### Version\n\n0.0.2\n\n\nP.S.: Still loving ty and ruff, keep up the good work!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1971/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1970",
      "id": 3737018850,
      "node_id": "I_kwDOOje-Bs7evmHi",
      "number": 1970,
      "title": "`no-matching-overload` with list/sorted and `map`/`filter`",
      "user": {
        "login": "AA-Turner",
        "id": 9087854,
        "node_id": "MDQ6VXNlcjkwODc4NTQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/9087854?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AA-Turner",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-17T01:59:33Z",
      "updated_at": "2026-01-09T15:29:27Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nError is new in ty 0.0.2, not present in 0.0.1a35. Seems to occur when `map` / `filter` are put into `list`/`sorted`. Oddly, the first error goes away when directly returning the function call instead of using the temp variable.\n\nA\n\nPlayground link: https://play.ty.dev/10c125c1-9480-475a-a076-861ade84c805\n\nReproducer:\n\n```python\nimport re\nfrom collections.abc import Iterable\nfrom typing import Any\n\ndef func(obj: Any) -> list[str | Any]:\n    if isinstance(obj, (list, tuple, set, frozenset)):\n        lst = sorted(map(func, obj), key=str) # No overload of function `sorted` matches arguments (no-matching-overload) [Ln 7, Col 15]\n        return lst\n    return [obj]\n\ndef patfilter(names: Iterable[str], pat: str) -> list[str]:\n    match = re.compile(pat).match\n    return list(filter(match, names))  # No overload of function `__new__` matches arguments (no-matching-overload) [Ln 13, Col 17]\n```\n\nOriginal output:\n\n```\nerror[no-matching-overload]: No overload of function `sorted` matches arguments\n  --> sphinx\\util\\_serialise.py:49:16\n   |\n47 |     if isinstance(obj, (list, tuple, set, frozenset)):\n48 |         # Convert to a sorted list\n49 |         return sorted(map(_stable_str_prep, obj), key=str)\n   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n50 |     if isinstance(obj, (type, types.FunctionType)):\n51 |         # The default repr() of functions includes the ID, which is not ideal.\n   |\ninfo: First overload defined here\n    --> stdlib\\builtins.pyi:4312:5\n     |\n4311 |   @overload\n4312 |   def sorted(\n     |  _____^\n4313 | |     iterable: Iterable[SupportsRichComparisonT], /, *, key: None = None, reverse: bool = False\n4314 | | ) -> list[SupportsRichComparisonT]:\n     | |__________________________________^\n4315 |       \"\"\"Return a new list containing all items from the iterable in ascending order.\n     |\ninfo: Possible overloads for function `sorted`:\ninfo:   (iterable: Iterable[SupportsRichComparisonT@sorted], *, /, key: None = None, reverse: bool = False) -> list[SupportsRichComparisonT@sorted]\ninfo:   (iterable: Iterable[_T@sorted], *, /, key: (_T@sorted, /) -> SupportsDunderLT[Any] | SupportsDunderGT[Any], reverse: bool = False) -> list[_T@sorted]\ninfo: rule `no-matching-overload` is enabled by default\n\nerror[no-matching-overload]: No overload of function `__new__` matches arguments\n   --> sphinx\\util\\matching.py:112:17\n    |\n110 |         _pat_cache[pat] = re.compile(_translate_pattern(pat))\n111 |     match = _pat_cache[pat].match\n112 |     return list(filter(match, names))\n    |                 ^^^^^^^^^^^^^^^^^^^^\n    |\ninfo: First overload defined here\n    --> stdlib\\builtins.pyi:3623:9\n     |\n3622 |     @overload\n3623 |     def __new__(cls, function: None, iterable: Iterable[_T | None], /) -> Self: ...\n     |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n3624 |     @overload\n3625 |     def __new__(cls, function: Callable[[_S], TypeGuard[_T]], iterable: Iterable[_S], /) -> Self: ...\n     |\ninfo: Possible overloads for function `__new__`:\ninfo:   (cls, function: None, iterable: Iterable[_T@filter | None], /) -> Self@__new__\ninfo:   (cls, function: (_S@__new__, /) -> @Todo, iterable: Iterable[_S@__new__], /) -> Self@__new__\ninfo:   (cls, function: (_S@__new__, /) -> TypeIs[_T@filter], iterable: Iterable[_S@__new__], /) -> Self@__new__\ninfo:   (cls, function: (_T@filter, /) -> Any, iterable: Iterable[_T@filter], /) -> Self@__new__\ninfo: rule `no-matching-overload` is enabled by default\n\nFound 2 diagnostics\n```\n\n\n### Version\n\nty 0.0.2 (42835578d 2025-12-16)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1970/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1967",
      "id": 3736772099,
      "node_id": "I_kwDOOje-Bs7eup4D",
      "number": 1967,
      "title": "Prefer *-stubs when finding packages",
      "user": {
        "login": "Boon-in-Oz",
        "id": 50002053,
        "node_id": "MDQ6VXNlcjUwMDAyMDUz",
        "avatar_url": "https://avatars.githubusercontent.com/u/50002053?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Boon-in-Oz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 11,
      "created_at": "2025-12-16T23:42:39Z",
      "updated_at": "2025-12-27T19:31:19Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Hi, this is going to be a hand-wavy issue, sorry.\n\nI'm excited to try ty over Pylance in VS Code. I've immediately run into an issue though.\n\nI run VS Code, and my module, in a Rez environment. I have a wrapped C++ package (a binary called ape.pyd) that I use a lot, which has custom stubs package called ape-stubs. In the Rez environment, PYTHONPATH contains the directories for both the package containing the ape.pyd, and the directory containing ape-stubs, but the pyd directory comes first.\n\nWith Pyright/Pylance this used to work. ape-stubs was used for autocompletion etc. However ty appears to be using ape.pyd, and it's not finding any of the useful information in the stubs.\n\nI set the log level to \"trace\" and saw this in the output (I'm filtering by \"ape\", and I've condensed the file paths. Also as you can see I have a directory junction from C to S):\n\n```\n2025-12-17 10:22:04.872486000 DEBUG ty:main ty_project::metadata::options: Adding `c:\\path_to_pyd\\packages\\ape\\1.0\\python-3.10` from the `PYTHONPATH` environment variable to `extra_paths`\n2025-12-17 10:22:04.872533100 DEBUG ty:main ty_project::metadata::options: Adding `c:\\path_to_stubs` from the `PYTHONPATH` environment variable to `extra_paths`\n...\n2025-12-17 10:22:04.876326600 DEBUG ty:main ty_python_semantic::module_resolver::resolver: Adding extra search-path `S:\\path_to_pyd\\packages\\ape\\1.0\\python-3.10`\n2025-12-17 10:22:04.876435300 DEBUG ty:main ty_python_semantic::module_resolver::resolver: Adding extra search-path `S:\\path_to_stubs`\n...\n2025-12-17 10:22:04.882233300 DEBUG ty:main ruff_db::files::file_root: Adding new file root 'S:\\path_to_pyd\\packages\\ape\\1.0\\python-3.10' of kind LibrarySearchPath\n2025-12-17 10:22:04.882242200 DEBUG ty:main ruff_db::files::file_root: Adding new file root 'S:\\path_to_stubs' of kind LibrarySearchPath\n...\n2025-12-17 10:22:04.885231400 DEBUG ty:main ty_python_semantic::module_resolver::resolver: Adding editable installation to module resolution path S:\\path_above_stubs\n2025-12-17 10:22:04.885242800 DEBUG ty:main ruff_db::files::file_root: Adding new file root 'S:\\path_above_stubs' of kind LibrarySearchPath\n```\n\nI _think_ the language server should see that it has a package called `ape` in a search path, and `ape-stubs` in a later search path, and prefer `ape-stubs` even though it found `ape` first.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1967/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1964",
      "id": 3736650005,
      "node_id": "I_kwDOOje-Bs7euMEV",
      "number": 1964,
      "title": "Is it possible to shorten/truncate inlay type hints for unions (in Zed)?",
      "user": {
        "login": "toddpocuca",
        "id": 175446079,
        "node_id": "U_kgDOCnUYPw",
        "avatar_url": "https://avatars.githubusercontent.com/u/175446079?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/toddpocuca",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-16T23:01:32Z",
      "updated_at": "2025-12-16T23:33:26Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nI work with JAX and often libraries in the ecosystem will accept/return many objects because of types like `ArrayTree` or `ArrayLike`, which are long unions and produce type hints like:\n\n<img width=\"959\" height=\"97\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/abc2e13e-cae4-4b5a-890b-74773330b457\" />\n\nIs there any way to shorten the number of union elements included in the inlay hints?\n\n### Version\n\nty 0.0.2 (42835578d 2025-12-16)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1964/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1959",
      "id": 3736241792,
      "node_id": "I_kwDOOje-Bs7esoaA",
      "number": 1959,
      "title": "Autocomplete for PEP692 Unpack[TypedDict]",
      "user": {
        "login": "mflova",
        "id": 67102627,
        "node_id": "MDQ6VXNlcjY3MTAyNjI3",
        "avatar_url": "https://avatars.githubusercontent.com/u/67102627?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mflova",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-16T20:36:15Z",
      "updated_at": "2026-01-06T13:12:15Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 1,
        "total_blocked_by": 1,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "PEP 692 allows typing **kwargs using TypedDict and Unpack:\n\n```py\nfrom typing import TypedDict, Unpack\n\nclass Movie(TypedDict):\n    name: str\n    year: int\n\ndef foo(**kwargs: Unpack[Movie]) -> None: ... \n```\n\nWhen calling `foo`, the LSP could detect that the allowed `kwargs` are those defined by `Movie` (name, year). If that's the case, autocompletion to `name=` and `year=` could be provided.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1959/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1950",
      "id": 3735886133,
      "node_id": "I_kwDOOje-Bs7erRk1",
      "number": 1950,
      "title": "find-references on a definition should be find-uses (not include self)",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-12-16T18:27:53Z",
      "updated_at": "2025-12-16T19:24:18Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```\nx = 1\nprint(x)\n```\n\nIf you find-references on the second x it goes to the first (good!)\nIf you find-references on the first x it shows both itself *and* the second (bad, not helpful, should only be the second).\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1950/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1948",
      "id": 3735711673,
      "node_id": "I_kwDOOje-Bs7eqm-5",
      "number": 1948,
      "title": "Warn on (accidentally) unreachable code blocks",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8677454701,
          "node_id": "LA_kwDOOje-Bs8AAAACBTdzbQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/unreachable-code",
          "name": "unreachable-code",
          "color": "666666",
          "default": false,
          "description": ""
        },
        "1": {
          "id": 8760037609,
          "node_id": "LA_kwDOOje-Bs8AAAACCiOQ6Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/lint",
          "name": "lint",
          "color": "a3b2aa",
          "default": false,
          "description": "Label for features that we would implement as lint rules, not core type checker features"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-16T17:36:25Z",
      "updated_at": "2025-12-16T18:42:51Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Mypy and pyright both offer opt-in lints which, when enabled, cause them to complain about the `else` branch in this snippet:\n\n```py\ndef f(x: int | str):\n    if isinstance(x, int):\n        print(\"It's an int\")\n    elif isinstance(x, str):\n        print(\"It's a string\")\n    else:\n        print(\"It's something else\")\n```\n\nThey can both detect that the `else` branch is unreachable, and that this is probably an accident, indicating a logic error somewhere in the function. Mypy's version can be opted into using `--warn-unreachable` on the command line; pyright's version requires `reportUnreachable=true`.\n\nFor feature parity with these tools, we should aim to provide a similar lint.\n\nNote that the lint should only complain about _accidentally_ unreachable code. There's a lot of code that ty infers as being unreachable that is nonetheless _deliberately_ unreachable, which we should _not_ complain about:\n- Any unreachable branches that consist solely of a `raise` statement should not be reported\n- Any unreachable branches that consist solely of an `assert_never()` call should not be reported\n- Any branches that are unreachable due to a `sys.version_info`, `sys.platform`, or `if TYPE_CHECKING` check should not be reported",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1948/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1932",
      "id": 3734919118,
      "node_id": "I_kwDOOje-Bs7enlfO",
      "number": 1932,
      "title": "ty cannot find packages in the python environment lib subfolder when l is lowercase",
      "user": {
        "login": "martinResearch",
        "id": 18285382,
        "node_id": "MDQ6VXNlcjE4Mjg1Mzgy",
        "avatar_url": "https://avatars.githubusercontent.com/u/18285382?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/martinResearch",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568529382,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlh5g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-mre",
          "name": "needs-mre",
          "color": "463BEF",
          "default": false,
          "description": "Needs more information for reproduction"
        },
        "1": {
          "id": 8568542955,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmW6w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/windows",
          "name": "windows",
          "color": "0078d4",
          "default": false,
          "description": "Specific to the Windows platform"
        },
        "2": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-16T14:01:40Z",
      "updated_at": "2025-12-16T15:38:54Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI When I create Python environments with conda, the subfolder is named \"lib\" (lowercase), but ty expects it to start with a capital \"L\". This prevents ty from finding the Python packages. It would help if ty could recognize the \"lib\" folder regardless of case.\n\n### Version\n\n 0.0.1-alpha.34 (ef3d48ac4 2025-12-12)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1932/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1927",
      "id": 3734809235,
      "node_id": "I_kwDOOje-Bs7enKqT",
      "number": 1927,
      "title": "Emit diagnostic on unsound call to abstract `@classmethod` or `@staticmethod` with trivial body, when accessed on the class object itself",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-16T13:31:49Z",
      "updated_at": "2025-12-16T20:34:53Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Both [pyright](https://pyright-play.net/?pyrightVersion=1.1.405&pythonVersion=3.13&reportUnreachable=true&code=GYJw9gtgBAhgRgYygSwgBzCALrOBnLEGBLCAUywAswATAKDoQBsY88oAxALjqj6gACzVnnJVavfgPgEiJMdXr8oNMsCgLaACmZ4AlFAC0APhQA7LFygA6WwxBkAbmRhMA%2BlgCeaMlo7XNGi09PTogA) and [pyrefly](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEq2AxnRDcbpQC4PZxeVUTLjRhcAFrkwAddLKZRUcOHQBiiWXS10AAgqVxREqZu07G-QcKOSZ6bXUwwwdG1IAUCuAEo6AWgA%2BVnQuRDpCCNlZShgANxhUKAB9LlJiGHdVQjdMd29vWRAAGhAAVy5oOBJyRBAAYjoAVQqoCFS6MFL0YQhcdDgorGcOzhpULiT0UppsGEp3fDCIEN9AuksNe20YrlLKezBpEAA5adnKMOB8AF8jwpKyGLAoUkIuWigKBoAFUieX9YYHAEOhMPqQADme3GvXQhFkDQAyjAYHRxFwuMQ4IgAPQ4x7OF6ETgQnEwdA4zC4JhwHFg9CQ6EVPo4kaUBixVDQRiwUHgiBQwTM%2By4YjCqqyMjGdB%2BeKUOCwugAXjoRwAzIQAIwAJju6BA1xKQgq8VU0BgFDQWDwRDIBqAA) detect the unsoundness here, though [mypy](https://mypy-play.net/?mypy=latest&python=3.12&gist=cf7dbf1c58f50ff7fb4528abfceed39d) does not. We should also detect this as unsound and reject it:\n\n```py\nfrom abc import abstractmethod\n\nclass F:\n    @classmethod\n    @abstractmethod\n    def method(cls) -> int: ...\n\n# pyright: Method \"method\" cannot be called because it is abstract and unimplemented  (reportAbstractUsage)\nreveal_type(F.method())\n```\n\nPyright and pyrefly do however allow the classmethod to be called via `type[F]`. You could argue that this is unsound, since you do not know whether or not you're dealing with a concrete subclass of `F` or not. But `type[]` types are generally unsound, and mypy's lint attempting to enforce similar soundness checks for `type[]` types has proved [very unpopular](https://github.com/python/mypy/issues/4717). So I think we should also allow this:\n\n```py\nfrom abc import abstractmethod\n\nclass F:\n    @classmethod\n    @abstractmethod\n    def method(cls) -> int: ...\n\ndef _(x: type[F]):\n    reveal_type(x.method())\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1927/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1923",
      "id": 3734652865,
      "node_id": "I_kwDOOje-Bs7emkfB",
      "number": 1923,
      "title": "Emit diagnostic on unsound `super()` call to abstract method with trivial body",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-16T12:47:25Z",
      "updated_at": "2025-12-16T16:16:33Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "[Mypy](https://mypy-play.net/?mypy=latest&python=3.12&gist=2cc45538a0bb162f1f4ecd996515d985), [pyright](https://pyright-play.net/?pyrightVersion=1.1.405&pythonVersion=3.13&reportUnreachable=true&code=GYJw9gtgBAhgRgYygSwgBzCALrOBnLEGBLCAUywAswATAKDoQBsY88oAxALjqj6gAC8AkRLkqtXvxplgUcdRoAKPGSbAAlFAC0APhQA7LFygA6cw2at2AcSUcNPflBlyFtFWs079yI0%2Bd%2BEAoAVxADKDwQtDIQJQ1Td2UNOiA) and [pyrefly](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEq2AxnRDcbpQC4PZxeVUTLjRhcAFrkwAddLKZRUcOHQBiiWXS10AAo36DhoiVM3bMMMHWOTMACjgwoYAJR0AtAD5W6LojqEgbLyisp0AOJ2qi4a6Np0FlY2Ug5Orh7eEL6x8fGUYgCulHFwBcQwlHYuhMn2LiAANCAFXNBwJOSIIADEdACqrVAQXKR0YAXowhC46HDBWJZjnDSoXAD66AU02BV2%2BP5ZXG5edAY52vlcRXFg0iAAcls7lP7A%2BAC%2Bd7KNIGT5YFBSIQuLQoBRegAFUj-QGnDA4Ah0JgzSAAcyKq2m6EIsl6AGUYDA6OIuFxiHBEAB6Sl-SyAwicVGUmDoSmYXBMOCU5HoNEY1ozSlLSgMABuqGgjFgSJREHRggFcVwxEV7VkZBM6HcooqcCxdAAvHQ7gBmQgARgATF90CB3k0hK0dapoDAKGgsHgiGQ7UA) all detect the unsoundness here. We should too:\n\n```py\nfrom abc import abstractmethod\n\nclass F:\n    @abstractmethod\n    def method(self) -> int: ...\n\nclass G(F):\n    def method(self) -> int:\n        # mypy: error: Call to abstract method \"method\" of \"F\" with trivial body via super() is unsafe  [safe-super]\n        return super().method()\n```\n\nThis is similar to, but distinct from, https://github.com/astral-sh/ty/issues/1877.\n\nWe should ensure that abstract properties are also covered, e.g.\n\n```py\nfrom abc import abstractmethod\n\nclass F:\n    @property\n    @abstractmethod\n    def prop(self) -> int: ...\n\nclass G(F):\n    @property\n    def prop(self) -> int:\n        # mypy: error: Call to abstract method \"method\" of \"F\" with trivial body via super() is unsafe  [safe-super]\n        return super().prop\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1923/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1922",
      "id": 3734592768,
      "node_id": "I_kwDOOje-Bs7emV0A",
      "number": 1922,
      "title": "Split error for empty function body into its own error code",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-16T12:30:48Z",
      "updated_at": "2025-12-16T14:30:04Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Pyright allows functions to unsoundly have empty bodies even if they have a non-`None` return type, and mypy used to allow this too. As a result, we've seen several instances of users being confused by the fact that we do not allow this. For example:\n\n```py\ndef foo() -> int: ...  # error[invalid-return-type]\n```\n\nIt's a deliberate decision from us to be more strict than pyright here, since this function obviously does not return an `int` at runtime. We already have a [subdiagnostic](https://github.com/astral-sh/ruff/blob/5b1d3ac9b9c458448e388075945869a4d49296a9/crates/ty_python_semantic/src/types/diagnostic.rs#L2676-L2679) message that explains the specific conditions in which we do allow functions to have empty bodies. However, splitting this into a separate `empty-body` error code would allow users who are heavily impacted by this inconsistency to switch it off on their codebase (even just temporarily while they work down the number of errors). This would also match mypy's behaviour (mypy has a dedicated `empty-body` error code.\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1922/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1921",
      "id": 3734485874,
      "node_id": "I_kwDOOje-Bs7el7ty",
      "number": 1921,
      "title": "ty check takes very long time with generic protocols",
      "user": {
        "login": "n-gao",
        "id": 9084670,
        "node_id": "MDQ6VXNlcjkwODQ2NzA=",
        "avatar_url": "https://avatars.githubusercontent.com/u/9084670?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/n-gao",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "2": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-16T11:59:05Z",
      "updated_at": "2026-01-09T13:44:03Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis is a follow up to #1874.\n\nI cannot pin point exactly what causes this issue but the following code takes a very long time to check\n```py\nfrom __future__ import annotations\nfrom typing import Any, Callable, Protocol\n\n\nclass M[R](Protocol):\n    def __call__(self, r: R, /) -> R: ...\n\n\nclass A[S, R](Protocol):\n    def get(self, s: S) -> R: ...\n    def set(self, s: S, r: R) -> S: ...\n    def bind(self, s: S) -> B[S, R]: ...\n    def merge[R2](self, other: A[S, R2]) -> A[S, tuple[R, R2]]: ...\n    def nest[U](self, inner: A[R, U]) -> A[S, U]: ...\n    def at(self, idx: Any) -> A[S, R]: ...\n    def apply(self, s: S, modifier: M[R]) -> S: ...\n\n\nclass B[S, R](Protocol):\n    def focus[R2](self, where: Callable[[R], R2]) -> B[S, R2]: ...\n    def get(self, s: S) -> R: ...\n    def set(self, s: S, r: R) -> S: ...\n    def apply(self, s: S, modifier: M[R]) -> S: ...\n    def at(self, idx: Any) -> B[S, R]: ...\n    def merge[R2](self, other: A[S, R2]) -> B[S, tuple[R, R2]]: ...\n\n\nclass Impl[S, R](A[S, R]):\n    def apply(self, s: S, modifier: M[R]) -> S:\n        return self.set(s, modifier(self.get(s)))\n\n```\nOutput:\n```\ntime uv run ty check ./test.py\nAll checks passed!\nuv run ty check ./test.py  3.06s user 0.19s system 97% cpu 3.349 total\n```\nRemoving the `apply` function from the definition of `Impl` results in a huge speedup:\n```\ntime uv run ty check ./test.py\nAll checks passed!\nuv run ty check ./test.py  0.02s user 0.02s system 39% cpu 0.122 total\n```\n\nFor our whole codebase this slowdown makes `ty` unusable as it freezes. This was a minimal example where I could narrow the slower type checking times.\n\n### Version\n\nty 0.0.1-alpha.35 (3188a56be 2025-12-16)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1921/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1910",
      "id": 3732332929,
      "node_id": "I_kwDOOje-Bs7eduGB",
      "number": 1910,
      "title": "ty: ignore[unresolved-import] fails for multi-line import",
      "user": {
        "login": "riklopfer",
        "id": 413300,
        "node_id": "MDQ6VXNlcjQxMzMwMA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/413300?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/riklopfer",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568539448,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmJOA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/suppression",
          "name": "suppression",
          "color": "705393",
          "default": false,
          "description": "Related to supression of violations e.g. ty:ignore"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-15T22:16:46Z",
      "updated_at": "2025-12-31T15:42:43Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nExpected this to work per https://docs.astral.sh/ty/suppression/#ty-suppression-comments\n\n```python\ndef main():\n    # ignore works\n    from java.util import LinkedList, ArrayList  # ty: ignore[unresolved-import]\n\n    # ingore works\n    from java.util import (  # ty: ignore[unresolved-import]\n        LinkedList,\n        ArrayList,\n    )\n\n    # ingore fails\n    from java.util import (\n        LinkedList,\n        ArrayList,\n    )  # ty: ignore[unresolved-import]\n\n```\n\n### Version\n\nty 0.0.1-alpha.34 (ef3d48ac4 2025-12-12)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1910/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1898",
      "id": 3731657278,
      "node_id": "I_kwDOOje-Bs7ebJI-",
      "number": 1898,
      "title": "typevars considered inferable when they shouldn't be",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-15T18:35:52Z",
      "updated_at": "2025-12-15T21:45:48Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "```py\nclass Container[T]:\n    def method(self, x: T) -> T:\n        return x\n\n    def try_assign[U](self, x: U) -> U:\n        result = self.method(x)  # false negative here\n        reveal_type(result)  # revealed: `T@Container`\n        return result  # we correctly emit a diagnostic here\n```\n\nhttps://play.ty.dev/8b3bb7c8-d7a7-447a-9318-7ff50e896f90\n\nI think the `self.method(x)` call should be a type error, but currently is not. `U` and `T` are independent type variables, and neither of them is inferable in the context of this call. `T` is already bound because we are in a method of `Container`; `U` is bound because we are inside `try_assign` method.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1898/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1897",
      "id": 3731596812,
      "node_id": "I_kwDOOje-Bs7ea6YM",
      "number": 1897,
      "title": "`typing.Self` in staticmethods and metaclasses should be rejected",
      "user": {
        "login": "stefanboca",
        "id": 45266795,
        "node_id": "MDQ6VXNlcjQ1MjY2Nzk1",
        "avatar_url": "https://avatars.githubusercontent.com/u/45266795?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/stefanboca",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-15T18:16:39Z",
      "updated_at": "2025-12-15T18:20:47Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "According to the typing documentation, [`Self` in staticmethods and metaclasses is rejected](https://typing.python.org/en/latest/spec/generics.html#self:~:text=Note%20that%20we%20reject%20Self%20in%20staticmethods%2E%20Self).\n```python\nfrom typing import Self, Any\n\nclass Base:\n    @staticmethod\n    def make() -> Self:  # should be rejected\n        ...\n\n    @staticmethod\n    def return_parameter(foo: Self) -> Self:  # should be rejected\n        ...\n\nclass MyMetaclass(type):\n    def __new__(cls, *args: Any) -> Self:  # should be rejected\n        return super().__new__(cls, *args)\n\n    def __mul__(cls, count: int) -> list[Self]:  # should be rejected\n        return [cls()] * count\n\nclass Foo(metaclass=MyMetaclass): ...\n```\nhttps://play.ty.dev/017c6126-8d90-4619-a721-51eeff356725",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1897/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1891",
      "id": 3731077229,
      "node_id": "I_kwDOOje-Bs7eY7ht",
      "number": 1891,
      "title": "Allow to disable a specific rule for a whole file",
      "user": {
        "login": "lypwig",
        "id": 1665542,
        "node_id": "MDQ6VXNlcjE2NjU1NDI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1665542?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/lypwig",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568539448,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmJOA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/suppression",
          "name": "suppression",
          "color": "705393",
          "default": false,
          "description": "Related to supression of violations e.g. ty:ignore"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-12-15T15:55:32Z",
      "updated_at": "2025-12-30T02:22:18Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nTo disable a rule on a line, I could do:\n\n```py\nfoo() # ty: ignore[call-non-callable]\n```\n\nI can also disable type checking on the whole file by adding on the beginning of the file:\n\n```py\n# type: ignore\n```\n\nIt could be very practical allow a mix of both behaviors: disabling a specific rule for a whole file, by adding on the beginning of the file:\n\n```py\n# ty: ignore[call-non-callable]\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1891/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1889",
      "id": 3730386371,
      "node_id": "I_kwDOOje-Bs7eWS3D",
      "number": 1889,
      "title": "Type system feature overview",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": true,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-15T13:10:30Z",
      "updated_at": "2026-01-04T21:54:41Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "# Type system features\n\nThis issue summarizes the support for various type system features in ty. Sections are organized to follow the structure of the [Python typing specification](https://typing.python.org/en/latest/spec/), with some additional sections at the end.\n\nIf a top-level item is marked completed without any sub-items, you can generally expect that feature to be fully implemented (and we value any bug reports in case you find issues). If a top-level item is marked completed with open sub-items, the feature is generally working, but there might be some open issues — including but not limited to the ones listed (in this case, we also value any bug reports, but please search the issue tracker before doing so). If a top-level item is not checked, the feature is not implemented yet (it's probably not helpful to report bugs, but feel free to upvote the tracking issue or comment if you have useful information).\n\n## Special types and type qualifiers\n\n[Official documentation](https://typing.python.org/en/latest/spec/special-types.html)\n\n**tests:** [`any.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/annotations/any.md), [`never.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/annotations/never.md), [`int_float_complex.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/annotations/int_float_complex.md), [`final.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/type_qualifiers/final.md), [`classvar.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/type_qualifiers/classvar.md), [`annotated.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/annotations/annotated.md), [`union.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/annotations/union.md), [`instance_layout_conflict.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/instance_layout_conflict.md)\n\n- [x] `Any`\n- [x] `None`\n- [x] `NoReturn`, `Never`\n- [x] `object`\n- [x] `Literal[...]` (strings, ints, bools, enum, None)\n- [x] `LiteralString`\n- [x] `type[C]`\n- [x] `float`/`complex` special cases (`float` means `int | float`)\n- [x] `Final`, `Final[T]`\n    - [ ] Diagnostic: subclass overrides `Final` attribute #871\n    - [ ] Diagnostic: `Final` without binding #872\n- [x] `@final` decorator\n- [x] `@disjoint_base` decorator\n- [x] `ClassVar`, `ClassVar[T]`\n    - [ ] Diagnostic: `ClassVar` with type variable #518\n- [x] `InitVar[T]` (see Dataclasses)\n- [x] `Annotated[T, ...]`\n- [x] `Required[T]`, `NotRequired[T]` (see TypedDict)\n- [x] `ReadOnly[T]` (see TypedDict)\n- [x] `Union[X, Y]`, `X | Y`\n- [x] `Optional[X]`\n- [ ] `type()` functional syntax #740\n\n## Generics\n\n[Official documentation](https://typing.python.org/en/latest/spec/generics.html)\n\n**tests:** [`pep695/`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/generics/pep695/), [`legacy/`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/generics/legacy/), [`self.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/annotations/self.md), [`scoping.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/generics/scoping.md)\n\n- [x] `TypeVar` (legacy syntax)\n- [x] `TypeVar` (PEP 695 syntax: `def f[T]()`)\n- [x] `TypeVar` upper bound (`bound=`)\n- [x] `TypeVar` constraints\n- [x] `TypeVar` defaults (PEP 696)\n- [x] `TypeVar` variance (`covariant`, `contravariant`)\n- [x] `TypeVar` variance inference (`infer_variance`)\n- [x] Generic classes (legacy and PEP 695 syntax)\n- [x] Generic functions (legacy and PEP 695 syntax)\n- [x] Generic type aliases (PEP 695)\n    - [ ] Some limitations #1851\n- [x] `ParamSpec` (legacy and PEP 695 syntax)\n    - [ ] `ParamSpec` usage validation #1861\n- [x] `ParamSpec.args`, `ParamSpec.kwargs`\n- [x] `ParamSpec` defaults\n- [x] `Self`\n    - [ ] `Self` in attribute annotations #1124\n    - [ ] https://github.com/astral-sh/ty/issues/1897\n- [ ] Solve type variables in all cases #623\n    - [x] Generic classes\n    - [x] Unions\n    - [ ] `Callable`s\n    - [ ] Generic protocols #1714\n    - [ ] Generic bounds/constraints on type variables #1839\n- [ ] Support `TypeVarTuple` #156\n\n## Protocols\n\n[Official documentation](https://typing.python.org/en/latest/spec/protocol.html)\n\n**tests:** [`protocols.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/protocols.md)\n\n- [x] `Protocol` class definition\n- [x] Generic protocols (legacy and PEP 695 syntax)\n- [x] Structural subtyping / assignability\n- [x] Protocol inheritance\n- [x] `is_protocol()`, `get_protocol_members()`\n- [x] `@runtime_checkable` decorator\n- [x] Protocol instantiation restriction\n- [x] Non-protocol class inheritance restriction\n- [x] `@property` members\n    - [ ] Partial support #1379\n- [x] Modules as protocol implementations\n  - [ ] Method members have some issues #931\n- [ ] `@classmethod` and `@staticmethod` members #1381\n- [ ] `ClassVar` members #1380\n- [ ] `type[SomeProtocol]` #903\n- [ ] `issubclass()` on protocols with non-methods #1878\n\n## Type narrowing\n\n[Official documentation](https://typing.python.org/en/latest/spec/narrowing.html)\n\n**tests:** [`narrow/`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/narrow/), [`type_guards.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/narrow/type_guards.md)\n\n- [x] `isinstance()` / `issubclass()` narrowing\n- [x] `is None` / `is not None` narrowing\n- [x] `is` / `is not` identity narrowing\n- [x] Truthiness narrowing\n- [x] `assert` narrowing\n- [x] `match` statement narrowing\n- [x] `hasattr()` narrowing\n- [x] `callable()` narrowing\n- [x] Assignment narrowing\n- [x] `TypeIs[…]` user-defined type guards\n- [x] `TypeGuard[…]` user-defined type guards #117\n- [x] `TypeIs`/`TypeGuard` as method #1569\n- [ ] Tuple length checks #560\n- [ ] Tuple match case narrowing #561\n- [ ] Narrowing after calls to functions returning `Never`/`NoReturn` https://github.com/astral-sh/ty/issues/690\n\n## Tuples\n\n[Official documentation](https://typing.python.org/en/latest/spec/tuples.html)\n\n**tests:** [`subscript/tuple.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/subscript/tuple.md), [`comparison/tuples.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/comparison/tuples.md), [`binary/tuples.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/binary/tuples.md)\n\n- [x] `tuple[X, Y, Z]` heterogeneous tuples\n- [x] `tuple[X, ...]` homogeneous tuples\n- [x] `tuple[()]` empty tuple\n- [x] Mixed tuples (`tuple[X, *tuple[Y, ...]]`)\n- [x] Indexing with literal integers\n- [x] Diagnostic: index out of bounds\n- [x] Slicing tuples\n- [x] Tuple subclasses\n- [x] `typing.Tuple` (deprecated alias)\n- [x] Covariant element types\n- [x] Tuple inheritance\n- [x] Unpacking in assignments\n- [x] `*args` unpacking in calls\n- [ ] Diagnostic: invalid comparisons for non-fixed-length tuples #1741\n- [ ] `TypeVarTuple` / `Unpack` #156\n- [x] #1978\n\n## `NamedTuple`\n\n[Official documentation](https://typing.python.org/en/latest/spec/namedtuples.html)\n\n**tests:** [`named_tuple.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/named_tuple.md)\n\n- [x] Class syntax (`class Foo(NamedTuple): ...`)\n- [x] Field access by name and index, slicing, unpacking\n- [x] Default values, diagnostic for non-default after default\n- [x] Read-only fields (assignment rejected)\n- [x] Inheritance, generic `NamedTuple`s\n- [x] Multiple inheritance restriction\n- [x] Underscore field name restriction\n- [x] Prohibited attribute override check (`_asdict`, `_make`, …)\n- [x] `_fields`, `_field_defaults`, `_make`, `_asdict`, `_replace`\n- [x] Subtype of `tuple[...]`\n- [x] `super()` restriction in `NamedTuple` methods\n- [x] `NamedTuple` in type expressions\n- [x] `type[NamedTuple]` in type expressions\n    - [ ] Not fully supported\n- [ ] Functional syntax (`NamedTuple(\"Foo\", [...])`) #1049\n- [ ] `collections.namedtuple`: not tested\n- [ ] Subclass field conflicting with base class field: not tested\n\n## `TypedDict`\n\n[Official documentation](https://typing.python.org/en/latest/spec/typeddict.html)\n\n**tests:** [`typed_dict.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/typed_dict.md)\n\n- [x] Class syntax (`class Foo(TypedDict): ...`)\n- [x] Key access by literal string, `Final` constants\n- [x] Constructor validation (missing keys, invalid types)\n- [x] `total` parameter\n- [x] `Required[…]`, `NotRequired[…]`\n- [x] `ReadOnly[…]`\n- [x] Inheritance, generic `TypedDict`s\n- [x] Recursive `TypedDict`\n- [x] Structural assignability and equivalence\n- [x] Methods (`get`, `pop`, `setdefault`, `keys`, `values`, `copy`)\n- [x] `__total__`, `__required_keys__`, `__optional_keys__`\n- [ ] Functional syntax (`TypedDict(\"Foo\", {...})`) #154\n- [ ] `closed`, `extra_items` (PEP 728) #154\n- [ ] `Unpack` for `**kwargs` typing #1746\n- [ ] Tagged union narrowing #1479\n- [ ] Diagnostic: Invalid `isinstance()` check on `TypedDict`: not tested\n\n## Enums\n\n[Official documentation](https://typing.python.org/en/latest/spec/enums.html)\n\n**tests:** [`enums.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/enums.md), [`comparison/enums.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/comparison/enums.md)\n\n- [x] `Enum`, `IntEnum`, `StrEnum`\n- [x] `Literal[EnumMember]` types\n- [x] `.name`, `.value` inference\n- [x] `auto()` value inference\n- [x] `member()`, `nonmember()`\n  - [x] #1974\n- [x] Enum aliases\n- [x] `_ignore_` attribute\n    - [ ] List form not fully supported\n- [x] Implicitly final (subclassing restriction)\n- [x] Exhaustiveness checking (`if`/`match`)\n- [x] Custom `__eq__`/`__ne__` methods\n- [x] Iteration over enum members\n    - [ ] `list(Enum)` returns `list[Unknown]`\n- [ ] Functional syntax (`Enum(\"Name\", [...])`) #876\n- [ ] `enum.Flag` expansion handling #876\n- [ ] Custom `__new__` or `__init__` methods #876\n- [ ] `_generate_next_value_` support #876\n- [ ] Value-based member retrieval (`Color(\"red\")`) #876\n- [ ] Narrowing with custom `__eq__` in `match` #1454\n\n## Literals\n\n[Official documentation](https://typing.python.org/en/latest/spec/literal.html)\n\n**tests:** [`literal.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/annotations/literal.md), [`literal_string.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/annotations/literal_string.md)\n\n- [x] `Literal[0]` (integer literals)\n- [x] `Literal[\"a\"]` (string literals)\n- [x] `Literal[b\"a\"]` (bytes literals)\n- [x] `Literal[True]` (boolean literals)\n- [x] `Literal[Color.RED]` (enum literals)\n- [x] `Literal[None]`\n- [x] Nested `Literal` flattening\n- [x] Union of literals simplification\n- [x] `Literal` with type aliases\n- [x] Invalid form diagnostics\n- [x] `LiteralString`\n- [x] `LiteralString` assignability\n- [x] `LiteralString` narrowing\n- [x] `LiteralString` cannot be parameterized\n- [x] `LiteralString` cannot be subclassed\n\n## Callables\n\n[Official documentation](https://typing.python.org/en/latest/spec/callables.html)\n\n**tests:** [`callable.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/annotations/callable.md), [`callable_instance.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/call/callable_instance.md)\n\n- [x] `Callable[[X, Y], R]` syntax\n- [x] `Callable[..., R]` gradual form\n- [x] `Callable` with `ParamSpec`\n- [x] Callback protocols (`__call__` method)\n- [x] Callable assignability (contra/covariance)\n- [x] Nested `Callable` types\n- [x] `Callable` in unions/intersections\n- [x] Invalid form diagnostics\n- [ ] `Concatenate` #1535\n- [ ] `Unpack` for `**kwargs` typing #1746\n\n## Overloads\n\n[Official documentation](https://typing.python.org/en/latest/spec/overload.html)\n\n**tests:** [`overloads.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/overloads.md), [`call/overloads.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/call/overloads.md)\n\n- [x] `@overload` decorator\n- [x] Overload resolution\n- [x] Generic overloads\n- [x] Methods, constructors, `@staticmethod`, `@classmethod`\n- [x] Version-specific overloads\n- [x] Diagnostic: at least two overloads required\n- [x] Diagnostic: missing implementation (non-stub)\n- [x] Diagnostic: inconsistent decorators\n- [x] Diagnostic: `@final`/`@override` placement\n- [ ] Variadic parameters with generics #1825\n- [ ] Unannotated implementation validation: not tested #1232\n- [ ] Diagnostic: overlapping overloads #103\n- [ ] Implementation consistency check #109\n- [ ] `@overload` with other decorators #1675\n\n## Dataclasses\n\n[Official documentation](https://typing.python.org/en/latest/spec/dataclasses.html)\n\n**tests:** [`dataclasses.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/dataclasses/dataclasses.md), [`fields.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/dataclasses/fields.md)\n\n- [x] `@dataclass` decorator (`init`, `repr`, `eq`, `order`, `frozen`, `match_args`, `kw_only`, `slots`, `weakref_slot`, `unsafe_hash`)\n- [x] `field()` (`default`, `default_factory`, `init`, `kw_only`, `doc`, `repr`, `hash`, `compare`)\n- [x] `InitVar[…]`, `ClassVar[…]` exclusion, `KW_ONLY` sentinel\n- [x] `fields()`, `__dataclass_fields__`\n- [x] `Final` fields\n- [x] Inheritance, generic dataclasses, descriptor-typed fields\n- [x] `replace()`, `__replace__`\n    - [ ] `replace()` returns `Unknown`\n- [x] `asdict()`\n    - [ ] Incorrectly accepts class objects\n- [x] Diagnostic: frozen/non-frozen dataclass inheritance\n- [ ] Diagnostic: non-default field after default field #111\n- [ ] Diagnostic: `order=True` with custom comparison methods #111\n- [ ] Diagnostic: `frozen=True` with `__setattr__`/`__delattr__` #111\n- [ ] `__post_init__` signature validation #111\n- [ ] Diagnostic: unsound subclassing of `order=True` dataclasses #1681\n- [ ] `astuple()`: not tested\n- [ ] `make_dataclass()`, `is_dataclass()`: not tested\n\n## `dataclass_transform`\n\n[Official documentation](https://typing.python.org/en/latest/spec/dataclasses.html#dataclass-transform)\n\n**tests:** [`dataclass_transform.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/dataclasses/dataclass_transform.md)\n\n- [x] Function-based transformers (decorator functions)\n- [x] Metaclass-based transformers\n- [x] Base-class-based transformers (`__init_subclass__`)\n- [x] `eq_default` parameter\n- [x] `order_default` parameter\n- [x] `kw_only_default` parameter\n- [x] `frozen_default` parameter\n    - [ ] Metaclass override not working\n- [x] `field_specifiers` (`init`, `default`, `default_factory`, `factory`, `kw_only`, `alias`)\n    - [ ] `converter` parameter #1327\n- [x] Other dataclass parameters (`slots`, etc.)\n- [x] Overloaded dataclass-like decorators\n- [x] Nested dataclass-transformers\n- [x] Combining with `@dataclass` (Home Assistant pattern)\n- [x] https://github.com/astral-sh/ty/issues/1987\n\n## Constructors\n\n[Official documentation](https://typing.python.org/en/latest/spec/constructors.html)\n\n**tests:** [`constructor.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/call/constructor.md)\n\n- [x] `__init__` signature inference\n- [x] `__new__` signature inference\n- [x] Constructor inheritance from superclass\n- [x] Both `__new__` and `__init__` present\n- [x] Descriptor-based `__new__`/`__init__`\n- [x] Generic class constructor inference\n- [x] Type variable solving from constructor params\n- [ ] Custom `__new__` return type #281\n- [ ] Custom metaclass `__call__` #2288\n- [ ] `__new__`/`__init__` consistency validation\n- [ ] Diagnostic: explicit `__init__` on instance #1016\n\n## Type aliases\n\n[Official documentation](https://typing.python.org/en/latest/spec/aliases.html)\n\n**tests:** [`pep695_type_aliases.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/pep695_type_aliases.md), [`pep613_type_aliases.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/pep613_type_aliases.md), [`implicit_type_aliases.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/implicit_type_aliases.md)\n\n- [x] Implicit type aliases (`Alias = int`)\n- [x] PEP 613 `TypeAlias` annotation\n    - [ ] Fully stringified RHS not supported\n- [x] PEP 695 `type` statement\n- [x] Generic type aliases (PEP 695)\n    - [ ] Limitations #1851\n- [x] Generic implicit/PEP 613 aliases\n    - [ ] Partial support #1739\n- [x] `TypeAliasType` introspection (`__name__`, `__value__`)\n- [ ] Self-referential generic aliases #1738\n\n## Type checker directives\n\n[Official documentation](https://typing.python.org/en/latest/spec/directives.html)\n\n**tests:** [`directives/`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/directives/)\n\n- [x] `cast(T, value)`\n- [x] Redundant `cast` diagnostic\n- [x] `assert_type(value, T)`\n- [x] `assert_never(value)`\n- [x] `reveal_type(value)`\n- [x] `TYPE_CHECKING` constant\n- [x] `@no_type_check` decorator\n- [x] `type: ignore` comments\n- [x] `ty: ignore` comments\n- [x] `@deprecated` decorator\n- [x] `@override` decorator\n    - [ ] Diagnostic: override without `@override` decorator #155\n\n## Module resolution, imports, packages\n\n[Official documentation](https://typing.python.org/en/latest/spec/distributing.html)\n\n**tests:** [`import/`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/import/)\n\n- [x] Stub files (`.pyi`)\n- [x] Stub packages (`<package>-stubs`)\n- [x] Partial stub packages (`py.typed` with `partial`)\n- [x] Namespace packages (PEP 420)\n- [x] Relative imports\n- [x] `__all__` declarations\n- [x] `__all__` mutations (`.append`, `.extend`, `+=`)\n- [x] `__all__` with submodule `__all__`\n- [x] Wildcard (`*`) imports\n- [x] Wildcard imports in stubs re-export\n- [x] Re-export conventions (`import X as X`)\n- [x] Conditional re-exports in stub files\n- [x] Reachability constraints in imports\n- [x] Cyclic imports\n- [x] `py.typed` marker files\n- [x] `conftest.py` resolution (pytest)\n- [x] conda/pixi environment support\n- [ ] PEP 723 inline script metadata #691\n- [x] Custom builtins (`__builtins__.pyi`) #374\n- [ ] Mono-repository support #819\n- [ ] Compiled extensions (`.so` files) #487\n- [ ] Per-library import suppression #1354\n\n## Control flow analysis\n\n**tests:** [`terminal_statements.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/terminal_statements.md), [`exhaustiveness_checking.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/exhaustiveness_checking.md), [`unreachable.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/unreachable.md), [`exception/control_flow.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/exception/control_flow.md)\n\n- [x] Terminal statements (`return`, `raise`)\n- [x] Loop control flow (`break`, `continue`)\n- [x] `for`/`while` loop analysis\n- [x] `try`/`except`/`else`/`finally` control flow\n    - [ ] `finally` limitations #233\n- [x] `Never`/`NoReturn` function propagation\n- [x] Exhaustiveness checking (`if`/`elif`/`else`)\n- [x] Exhaustiveness checking (`match`)\n- [ ] Advanced `match` pattern inference #887\n- [x] `assert_never()`\n- [x] `sys.version_info` comparisons\n- [x] `sys.platform` checks\n- [x] Statically known branches\n- [ ] Return type inference #128\n- [ ] Walrus operator in boolean expressions #626\n- [ ] Cyclic control flow (loop back edges) #232\n- [ ] Gray out unreachable code #784\n- [ ] Opt-in rule enforcing exhaustive `match` statements https://github.com/astral-sh/ty/issues/1060\n- [ ] Opt-in equivalent of mypy's strict-equality check https://github.com/astral-sh/ty/issues/576\n- [ ] #1948\n\n## Invalid overrides\n\n(Liskov Substitution Principle checks, etc)\n\n**tests:** [`liskov.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/liskov.md), [`override.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/override.md)\n\n- [x] Covariant return types\n- [x] Contravariant parameter types\n- [x] Invariant mutable attributes\n- [x] Full class hierarchy checked\n- [x] Positional/keyword parameter kind changes\n- [x] Additional optional parameters\n- [x] `*args`/`**kwargs` compatibility\n- [x] `@staticmethod` and `@classmethod` overrides\n- [x] Synthesized method overrides (dataclasses)\n- [ ] Method overridden by non-method https://github.com/astral-sh/ty/issues/2156\n- [ ] Non-method overridden by non-method https://github.com/astral-sh/ty/issues/2158\n\n## Abstract base classes\n\n**tests:** [`return_type.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/function/return_type.md), [`overloads.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/overloads.md)\n\n- [x] `@abstractmethod` decorator\n- [x] Empty body allowed for abstract methods\n- [x] `@abstractmethod` with `@overload` validation\n- [ ] #1877\n- [ ] https://github.com/astral-sh/ty/issues/1923\n- [ ] https://github.com/astral-sh/ty/issues/1927\n\n## `__slots__`\n\n**tests:** [`instance_layout_conflict.md`](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/instance_layout_conflict.md)\n\n- [x] `__slots__` (string or tuple of strings)\n- [ ] `__slots__` (list, dict, set literals)\n- [ ] Attribute resolution from `__slots__` #1268\n- [ ] Diagnostic: access outside `__slots__` #1268\n- [ ] Diagnostic: class variable shadowing `__slots__` name #1268\n- [ ] `__dict__`/`__weakref__` presence validation #1268\n- [ ] Diagnostic: non-empty `__slots__` on builtin subclasses #1268\n\n## Special library features\n\nStandard library:\n\n- [ ] `@cached_property` #1446\n- [ ] `functools.partial` #1536\n- [ ] `functools.total_ordering` #1202\n\nThird-party library support (currently not decided how far we want to go here):\n\n- [ ] Pydantic #291\n- [ ] Django #291\n- [ ] `attrs` #291\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1889/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1888",
      "id": 3730385657,
      "node_id": "I_kwDOOje-Bs7eWSr5",
      "number": 1888,
      "title": "False positive when assigning to Final instance attribute in __init__ and adding generics",
      "user": {
        "login": "AndreuCodina",
        "id": 30506301,
        "node_id": "MDQ6VXNlcjMwNTA2MzAx",
        "avatar_url": "https://avatars.githubusercontent.com/u/30506301?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AndreuCodina",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-15T13:10:23Z",
      "updated_at": "2025-12-16T01:25:59Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nSimilar to the closed https://github.com/astral-sh/ty/issues/1409, but when adding generics.\n\n```python\nimport asyncio\nfrom typing import Final\n\n\nclass AsyncConcurrentDictionary[TKey, TValue]:\n    _dict: Final[dict[TKey, TValue]]\n    _lock: Final[asyncio.Lock]\n\n    def __init__(self) -> None:\n        self._dict = {}  # error[invalid-assignment]: Cannot assign to final attribute `_dict` on type `Self@__init__`\n        self._lock = asyncio.Lock()  # error[invalid-assignment]: Cannot assign to final attribute `_lock` on type `Self@__init__`\n```\n\nhttps://play.ty.dev/2cb2f484-013d-4da2-a7f4-32a0144f5273\n\nAfter some experiments, I figured out that if you remove the generics or repeat the type hints in `__init__`, the errors disappear, i.e.:\n\n```python\nimport asyncio\nfrom typing import Final\n\n\nclass AsyncConcurrentDictionary:\n    _dict: Final[dict[int, int]]\n    _lock: Final[asyncio.Lock]\n\n    def __init__(self) -> None:\n        self._dict = {}\n        self._lock = asyncio.Lock()\n\n# or\n\nclass AsyncConcurrentDictionary[TKey, TValue]:\n    _dict: Final[dict[TKey, TValue]]\n    _lock: Final[asyncio.Lock]\n\n    def __init__(self) -> None:\n        self._dict: dict[TKey, TValue] = {}\n        self._lock: asyncio.Lock = asyncio.Lock()\n```\n\n### Version\n\n0.0.1a34",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1888/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1887",
      "id": 3729956467,
      "node_id": "I_kwDOOje-Bs7eUp5z",
      "number": 1887,
      "title": "`discord.py`: Checking `audit_logs.py` takes very long",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-15T11:18:04Z",
      "updated_at": "2026-01-09T00:01:56Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Checking `audit_logs.py` dominates the entire type-checking time:\n\n* wall-time: 380ms\n* [`audit_logs.py`](https://github.com/Rapptz/discord.py/blob/master/discord/audit_logs.py): `/home/micha/astral/discord.py/discord/audit_logs.py` took more than 100ms (340.341158ms)\n\nI haven't looked into what's special about `audit_logs.py` (or something it imports), that explains its long type-checking time.\n\n\nThere are some other \"slow\" files but none takes as long as `audit_logs.py`:\n\n```\nINFO Checking file `/home/micha/astral/discord.py/discord/ext/commands/bot.py` took more than 100ms (104.770849ms)\nINFO Checking file `/home/micha/astral/discord.py/discord/client.py` took more than 100ms (121.575732ms)\nINFO Checking file `/home/micha/astral/discord.py/discord/http.py` took more than 100ms (117.107697ms)\nINFO Checking file `/home/micha/astral/discord.py/discord/guild.py` took more than 100ms (124.385833ms)\nINFO Checking file `/home/micha/astral/discord.py/discord/message.py` took more than 100ms (147.963634ms)\nINFO Checking file `/home/micha/astral/discord.py/discord/state.py` took more than 100ms (103.881121ms)\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1887/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1884",
      "id": 3727643039,
      "node_id": "I_kwDOOje-Bs7eL1Gf",
      "number": 1884,
      "title": "Subheadings not rendered in `invalid-method-override` documentation",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239594,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/documentation",
          "name": "documentation",
          "color": "0075ca",
          "default": true,
          "description": "Improvements or additions to documentation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-12-14T16:07:20Z",
      "updated_at": "2025-12-15T05:23:28Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Our [docs for `invalid-method-override`](https://docs.astral.sh/ty/reference/rules/#invalid-method-override) are longer than the docs for most of our rules. I wanted to make them high-quality, because I expect that many users won't have heard of the Liskov Substitution Principle, and it's useful to have a good explanation of why it's important for us to link to.\n\nAs part of the documentation, I added a [\"Common issues\" section](https://github.com/astral-sh/ruff/blob/8bc753b842967b53dc2698fdff8e1a410ffafa46/crates/ty_python_semantic/src/types/diagnostic.rs#L2170-L2188), with the idea that I'd be able to link directly to it or subsections in it if users brought up a question that we'd already written up an answer to. Currently, however, the `## Common issues` heading is the same font size as the `### Why does ty complain about my `__eq__` method?` heading immediately below it. I also can't link directly to any subsections in the docs for this rule currently.\n\nWe should either find a way to fix this, or I should rewrite the docs for this rule to not use subheadings 🙃",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1884/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1883",
      "id": 3727391938,
      "node_id": "I_kwDOOje-Bs7eK3zC",
      "number": 1883,
      "title": "Do not expand PEP-613 type aliases on hover",
      "user": {
        "login": "hamdanal",
        "id": 93259987,
        "node_id": "U_kgDOBY8I0w",
        "avatar_url": "https://avatars.githubusercontent.com/u/93259987?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/hamdanal",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9807383197,
          "node_id": "LA_kwDOOje-Bs8AAAACSJDKnQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20aliases",
          "name": "type aliases",
          "color": "ebd684",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-14T13:46:02Z",
      "updated_at": "2025-12-19T12:10:50Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "They could become unwieldy especially for large unions. See these two examples\n\n<img width=\"996\" height=\"157\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/be7bb139-2ca2-44e7-86a4-436c2492f01b\" />\nWhere the tuple is defined using a type alias in the stub and\n\n<img width=\"839\" height=\"281\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/8fdeac9b-426d-4846-b2ca-5b8e941efae8\" />\nWhere the type of `value` is defines as `Scalar | ListLikeU | None` in pandas-stubs.\n\nIn both cases displaying the name of the type alias would make the signature more readable. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1883/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1882",
      "id": 3727370142,
      "node_id": "I_kwDOOje-Bs7eKyee",
      "number": 1882,
      "title": "Default parameter values should be expressions, not types",
      "user": {
        "login": "hamdanal",
        "id": 93259987,
        "node_id": "U_kgDOBY8I0w",
        "avatar_url": "https://avatars.githubusercontent.com/u/93259987?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/hamdanal",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-12-14T13:36:07Z",
      "updated_at": "2025-12-18T00:47:50Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nNotice the default values of `Literal[False]` instead of `False`. Also `…`, which is a very common default parameter value in stub files, is rendered as `EllipsisType`.\n\n<img width=\"461\" height=\"221\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/104b7f2c-5a96-4706-b28a-d34c094ce300\" />\n\n### Version\n\nLatest VSCode extension and ty version 0.0.1-alpha.34",
      "closed_by": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1882/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1881",
      "id": 3726880839,
      "node_id": "I_kwDOOje-Bs7eI7BH",
      "number": 1881,
      "title": "\"Go to Definition\" for keyword arguments in function call",
      "user": {
        "login": "injust",
        "id": 3387175,
        "node_id": "MDQ6VXNlcjMzODcxNzU=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3387175?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/injust",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-12-14T06:47:44Z",
      "updated_at": "2025-12-15T06:30:57Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 1,
        "total_blocked_by": 1,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "basedpyright (I tested in Zed) supports \"Go to Definition\" (cmd-click or F12) for argument names in a function call.\n\nIn ty, this is currently a no-op, so you have to use \"Go to Definition\" on the function, and then find the parameter in its type signature.\n\nSupporting argument names is useful for this pattern, which is used in types-boto3:\n\n```python\nclass BarTypeDef(TypedDict):\n    thing: str\n\n\ndef foo(**kwargs: Unpack[BarTypeDef]) -> None:\n    pass\n\n\nfoo(thing=\"abcd\")\n#   ^^^^^ cmd-click here\n```\n\nIn basedpyright, \"Go to Definition\" on `thing` takes you to its definition in `BarTypeDef`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1881/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1880",
      "id": 3726762453,
      "node_id": "I_kwDOOje-Bs7eIeHV",
      "number": 1880,
      "title": "Type `list[...]` containing negated type is not iterable",
      "user": {
        "login": "mattgiles",
        "id": 4960227,
        "node_id": "MDQ6VXNlcjQ5NjAyMjc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4960227?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mattgiles",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-14T04:57:42Z",
      "updated_at": "2025-12-19T15:08:09Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI am seeing not-iterable complaints like:\n\n```\nObject of type `list[Thing | ~str | Unknown]` is not iterable (not-iterable)\n```\n\nAs in this [example](https://play.ty.dev/f8cf1369-0e71-4034-bfde-8c718941d6eb).\n\n### Version\n\nty 0.0.1-alpha.34 (ef3d48ac4 2025-12-12)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1880/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1878",
      "id": 3725947107,
      "node_id": "I_kwDOOje-Bs7eFXDj",
      "number": 1878,
      "title": "Emit diagnostic on issubclass calls against protocols with non-method members",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-13T13:09:19Z",
      "updated_at": "2025-12-13T13:09:19Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "```pycon\n>>> from typing import Protocol, runtime_checkable\n>>> @runtime_checkable\n... class X(Protocol):\n...     y: int\n...     \n>>> issubclass(int, X)\nTraceback (most recent call last):\n  File \"<string>\", line 1, in <module>\n  File \"/var/containers/Bundle/Application/55202DCD-E142-4072-8C28-8E3DDC7B66E2/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/abc.py\", line 124, in __subclasscheck__\n    return _abc_subclasscheck(cls, subclass)\n  File \"/var/containers/Bundle/Application/55202DCD-E142-4072-8C28-8E3DDC7B66E2/Pythonista3.app/Frameworks/Py3Kit.framework/pylib/typing.py\", line 1570, in _proto_hook\n    raise TypeError(\"Protocols with non-method members\"\nTypeError: Protocols with non-method members don't support issubclass()\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1878/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1877",
      "id": 3725937441,
      "node_id": "I_kwDOOje-Bs7eFUsh",
      "number": 1877,
      "title": "Emit diagnostic on constructor call to class with abstract methods",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-13T13:00:59Z",
      "updated_at": "2025-12-22T14:08:12Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "```py\nfrom abc import abstractmethod\n\nclass Base:\n    @abstractmethod\n    def f(self): ...\n\nclass BadChild(Base): ...\n\nclass GoodChild(Base):\n    def f(self): ...  # concrete override\n\nBase()  # ❌ has abstract methods\nBadChild()  # ❌ has abstract methods\nGoodChild()  # ✅ abstract methods were overridden\n\nclass OtherBase:\n    @property\n    @abstractmethod\n    def prop(self) -> int:\n        return 42\n\nOtherBase()  # ❌ has abstract methods\n\nclass ThirdBase:\n    @property\n    def prop(self) -> int:\n        return 42\n\n    @prop.setter\n    @abstractmethod\n    def prop(self, x: int) -> None: ...\n\nThirdBase()  # ❌ has abstract methods\n```\n\nThe runtime only enforces this rule if the class has `abc.ABCMeta` (or a subclass) as its metaclass. But other type checkers also enforce it even if the decorator is used on a method in a class that does not have that metaclass. That's useful in stubs: there are situations where you want to indicate that you're meant to override a method (so you add the decorator), but the runtime version of the class doesn't have `ABCMeta` as the metaclass and you don't want to lie about the class's metaclass in the stub file.\n\nMypy's tests for this feature are at https://github.com/python/mypy/blob/master/test-data/unit/check-abstract.test",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1877/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1872",
      "id": 3725155044,
      "node_id": "I_kwDOOje-Bs7eCVrk",
      "number": 1872,
      "title": "Equivalence of generic callables",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "2": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-12-12T23:46:54Z",
      "updated_at": "2025-12-12T23:47:59Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We understand assignability and subtyping of generic functions/callables reasonably well, but not equivalence:\n\n```py\nfrom ty_extensions import CallableTypeOf, static_assert, is_subtype_of, is_assignable_to, is_equivalent_to\nfrom typing import TypeVar\n\ndef f[T](x: T) -> T:\n    return x\n\ndef g[T](x: T) -> T:\n    return x\n\n_: CallableTypeOf[g] = f\n_: CallableTypeOf[f] = g\n\n\nstatic_assert(is_equivalent_to(CallableTypeOf[g], CallableTypeOf[f]))\nstatic_assert(is_subtype_of(CallableTypeOf[g], CallableTypeOf[f]))\nstatic_assert(is_subtype_of(CallableTypeOf[f], CallableTypeOf[g]))\nstatic_assert(is_assignable_to(CallableTypeOf[g], CallableTypeOf[f]))\nstatic_assert(is_assignable_to(CallableTypeOf[f], CallableTypeOf[g]))\n\nT = TypeVar(\"T\")\nU = TypeVar(\"U\")\n\ndef h(x: T) -> T:\n    return x\n\ndef i(x: U) -> U:\n    return x\n\n_: CallableTypeOf[h] = i\n_: CallableTypeOf[i] = h\n\nstatic_assert(is_equivalent_to(CallableTypeOf[h], CallableTypeOf[i]))\nstatic_assert(is_subtype_of(CallableTypeOf[h], CallableTypeOf[i]))\nstatic_assert(is_subtype_of(CallableTypeOf[i], CallableTypeOf[h]))\nstatic_assert(is_assignable_to(CallableTypeOf[h], CallableTypeOf[i]))\nstatic_assert(is_assignable_to(CallableTypeOf[i], CallableTypeOf[i]))\n```\n\nhttps://play.ty.dev/913c181c-03d3-4c0c-98bf-05e9622395b8\n\nAll of those assertions should pass. Currently all of them pass except the two `is_equivalent_to` assertions. But mutual subtyping implies equivalence!\n\nI suspect with our current implementation of equivalence, this will require `normalized` also normalizing typevars by reusing a standard set of typevars.\n\nOr the other approach would be to fix this by switching to an implementation of equivalence based on mutual subtyping (of top/bottom materializations, for gradual types).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1872/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1870",
      "id": 3725002756,
      "node_id": "I_kwDOOje-Bs7eBwgE",
      "number": 1870,
      "title": "Memory allocation failure with large tuple operations",
      "user": {
        "login": "correctmost",
        "id": 134317971,
        "node_id": "U_kgDOCAGHkw",
        "avatar_url": "https://avatars.githubusercontent.com/u/134317971?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/correctmost",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        },
        "2": {
          "id": 9775918749,
          "node_id": "LA_kwDOOje-Bs8AAAACRrCunQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fuzzer",
          "name": "fuzzer",
          "color": "cf5f2e",
          "default": false,
          "description": "Issues surfaced by fuzzing ty"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-12T22:23:13Z",
      "updated_at": "2025-12-12T23:21:34Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nty crashes when checking this fuzzed code:\n```python\nfor a in ('a', 'b'):\n    a + (a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a, a)\n```\n\n```\nmemory allocation of 2199023255552 bytes failed\n```\n\n### Version\n\nty 0.0.1a34",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1870/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1867",
      "id": 3723698491,
      "node_id": "I_kwDOOje-Bs7d8yE7",
      "number": 1867,
      "title": "panic: `index out of bounds: the len is 8 but the index is 16479`",
      "user": {
        "login": "correctmost",
        "id": 134317971,
        "node_id": "U_kgDOCAGHkw",
        "avatar_url": "https://avatars.githubusercontent.com/u/134317971?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/correctmost",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        },
        "2": {
          "id": 9775918749,
          "node_id": "LA_kwDOOje-Bs8AAAACRrCunQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fuzzer",
          "name": "fuzzer",
          "color": "cf5f2e",
          "default": false,
          "description": "Issues surfaced by fuzzing ty"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-12-12T14:52:25Z",
      "updated_at": "2025-12-13T18:49:02Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nty crashes when checking this fuzzed code:\n\n```python\n__next__ = next\n@staticmethod\ndef __next__\n```\n\n```\nerror[panic]: Panicked at crates/ruff_db/src/parsed.rs:210:13 when checking `/home/user/a.py`: `index out of bounds: the len is 8 but the index is 16479`\n```\n\n### Version\n\n5e31bc9 w/ astral-sh/ruff@bc8efa2fd86",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1867/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1866",
      "id": 3723643726,
      "node_id": "I_kwDOOje-Bs7d8ktO",
      "number": 1866,
      "title": "Consider sharding py-fuzzer CI job to run with multiple Python versions",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568513779,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkk8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/ci",
          "name": "ci",
          "color": "905251",
          "default": false,
          "description": "Related to internal CI tooling"
        },
        "1": {
          "id": 9775918749,
          "node_id": "LA_kwDOOje-Bs8AAAACRrCunQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fuzzer",
          "name": "fuzzer",
          "color": "cf5f2e",
          "default": false,
          "description": "Issues surfaced by fuzzing ty"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-12T14:34:48Z",
      "updated_at": "2025-12-12T14:35:00Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "> I'd be inclined to hard code the Python version to 3.8 or shard the benchmark to check multiple versions (both seem equally likely to catch bugs IMO because we default to an old Python version in mdtests)\r\n\r\n_Originally posted by @MichaReiser in https://github.com/astral-sh/ruff/pull/21844#pullrequestreview-3552259205_\r\n\r\nI did the first bit of this suggestion in https://github.com/astral-sh/ruff/pull/21844 (the `--python-version` argument for the fuzzer is currently hardcoded to 3.9, typeshed's lowest supported Python version). But we could consider doing the second suggestion as well: we could run two instances of the fuzzer script on every PR. Once with `--python-version=3.9`, and once with `--python-version=3.14`",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1866/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1861",
      "id": 3722840892,
      "node_id": "I_kwDOOje-Bs7d5gs8",
      "number": 1861,
      "title": "Validate more usages of `ParamSpec`, `P.args`, `P.kwargs`",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-12T10:13:12Z",
      "updated_at": "2025-12-12T10:13:12Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://github.com/astral-sh/ruff/pull/21445 did not focus much on validating whether `ParamSpec`, `P.args` and `P.kwargs` were used correctly.\n\nThis issue is to keep track of the remaining work. Most of these cases should have an existing TODO in [`generics/legacy/paramspec.md`](https://github.com/astral-sh/ruff/blob/2d0681da082b6678f342d768b2c84cac15d829e9/crates/ty_python_semantic/resources/mdtest/generics/legacy/paramspec.md) and [`generics/pep695/paramspec.md`](https://github.com/astral-sh/ruff/blob/2d0681da082b6678f342d768b2c84cac15d829e9/crates/ty_python_semantic/resources/mdtest/generics/pep695/paramspec.md) but if not then new tests should be added.\n\n- [ ] `ParamSpec` is only valid as the first element to `Callable` or the final element to `Concatenate` (requires #1535), we should raise a `invalid-type-form` for other places\n- [ ] When both `P.args` and `P.kwargs` aren't defined in the function signature e.g., `def foo(*args: P.args): ...` and `def foo(**kwargs: P.kwargs): ...`\n- [ ] When there's an additional parameter between `*args: P.args` and `**kwargs: P.kwargs` e.g., `def foo(*args: P.args, x: int, **kwargs: P.kwargs): ...`\n- [ ] When it's used to annotate anything other than `*args` and `**kwargs` like variable, instance or class attribute, etc.\n- [ ] On the argument side, we validate when there's a type mismatch between a `ParamSpec` components and the argument type but we also need to enforce that arguments for a `ParamSpec` are required to be passed in certain scenarios like https://github.com/astral-sh/ruff/blob/2d0681da082b6678f342d768b2c84cac15d829e9/crates/ty_python_semantic/resources/mdtest/generics/pep695/paramspec.md?plain=1#L184-L188",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1861/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1859",
      "id": 3720791438,
      "node_id": "I_kwDOOje-Bs7dxsWO",
      "number": 1859,
      "title": "Reconsider fallback type (and singleton-ness) for Type::GenericAlias",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-11T20:07:13Z",
      "updated_at": "2025-12-11T20:07:13Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "@AlexWaygood observes:\n\n> I think we fallback to `types.GenericAlias` in a bunch of places for operations on `Type::GenericAlias` types (the meta-type, I think? Maybe attribute access?). I don't think that's correct anymore now that we consider some class-literal types subtypes of some generic-alias types. We should probably fallback to a `type|types.GenericAlias` union instead?\n\n> Also, we incorrectly consider generic-alias types to be singleton types. I think that was always wrong, but it's even more wrong now with the recent subtyping changes",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1859/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1858",
      "id": 3720733788,
      "node_id": "I_kwDOOje-Bs7dxeRc",
      "number": 1858,
      "title": "support calls to intersection types",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        },
        "1": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-11T19:45:46Z",
      "updated_at": "2025-12-16T21:08:34Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Right now we infer a todo type, which suppresses false positives. But intersections arise reasonably frequently in narrowing, and often don't simplify (especially with negative or dynamic elements). So this can lead to a lot of false negatives.\n\nThe algorithm here isn't particularly hard. We should try to call each element of the intersection. We can probably short-circuit some cases (most negative intersection elements will simply fallback to `object`, and we know `object` is not callable). If calls to any element(s) succeed, the return type is the intersection of their returns, and we should ignore errors from those that failed. If all fail, we probably want to discard errors from some very general types (the same cases we considered short-circuiting above) and display the other errors. (Handling the diagnostics is probably the most complex piece of this issue.)\n\nWe could also do a very simple initial version here where we try to short-circuit negative elements and if that reduces the intersection to a single type, call it normally. That would already improve things a lot for narrowing cases.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1858/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1857",
      "id": 3720427057,
      "node_id": "I_kwDOOje-Bs7dwTYx",
      "number": 1857,
      "title": "Auto-import can show redundant completions when the same item is exposed from multiple modules",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "BurntSushi",
          "id": 456674,
          "node_id": "MDQ6VXNlcjQ1NjY3NA==",
          "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/BurntSushi",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-11T18:03:36Z",
      "updated_at": "2026-01-09T15:06:58Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "A good example of this is `read_csv` from Pandas. The first result is the one we want:\n\nhttps://github.com/user-attachments/assets/2ae60909-ff2c-4279-b371-c2c07593eff5\n\nBut it also shows `read_csv` from a bunch of other sub-modules. Indeed, these are all the same symbol. They all share the same definition in `pandas/io/parsers/readers.py`.\n\nI think we should show only _one_ of them, and probably the one from the top-most module. This seems to be what pylance does:\n\nhttps://github.com/user-attachments/assets/ce075b94-3db8-44a6-84fd-6b7b420fdc88",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1857/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1851",
      "id": 3718500869,
      "node_id": "I_kwDOOje-Bs7do9IF",
      "number": 1851,
      "title": "Cannot solve generics involving PEP 695 type aliases",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 9807383197,
          "node_id": "LA_kwDOOje-Bs8AAAACSJDKnQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20aliases",
          "name": "type aliases",
          "color": "ebd684",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-11T09:16:04Z",
      "updated_at": "2026-01-08T18:55:36Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We currently do not support generic PEP 695 aliases in the solver:\n\n```py\ntype MyList[T] = list[T]\n\ndef head[T](my_list: MyList[T]) -> T:\n    return my_list[0]\n\nreveal_type(head([1, 2]))  # Unknown!\n```\nhttps://play.ty.dev/b453601a-9d2d-4a51-bde8-38f9c8de7d62\n\n\n(it works fine with implicit and PEP 613 type aliases)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1851/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1849",
      "id": 3717413691,
      "node_id": "I_kwDOOje-Bs7dkzs7",
      "number": 1849,
      "title": "Improve scope based completions in eager enclosed scopes",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-11T02:04:35Z",
      "updated_at": "2025-12-11T17:42:35Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Specifically, [from @carljm](https://github.com/astral-sh/ruff/pull/21872#issuecomment-3639670356):\n\n> For eager enclosed scopes (scopes that are executed immediately at the point of definition, like class bodies or comprehensions) we do better in type inference, because in that case we do know precisely where in the enclosing scope the nested scope executed. (If you wanted, I think you could use those same \"eager nested scope snapshots\" from the semantic index for more precision here as well, but I think that could be a separate follow-up change.)\n\nRef https://github.com/astral-sh/ruff/pull/21872\n\nRef https://github.com/astral-sh/ty/issues/1294",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1849/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1846",
      "id": 3716653262,
      "node_id": "I_kwDOOje-Bs7dh6DO",
      "number": 1846,
      "title": "don't discard \"unused\" typevars from generic context of simplified generic type alias",
      "user": {
        "login": "cmp0xff",
        "id": 5564164,
        "node_id": "MDQ6VXNlcjU1NjQxNjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5564164?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/cmp0xff",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 9807383197,
          "node_id": "LA_kwDOOje-Bs8AAAACSJDKnQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20aliases",
          "name": "type aliases",
          "color": "ebd684",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 8,
      "created_at": "2025-12-10T20:21:43Z",
      "updated_at": "2025-12-14T10:07:01Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n## Summary\n\nHi, the following code snippet causes `invalid-type-arguments` in current `ty`, see [the playground](https://play.ty.dev/5e7a9db4-c5cc-4b6e-87a5-46789473576a):\n\n```py\nfrom collections.abc import Hashable, Sequence\nfrom typing import TypeAlias, TypeVar\n\nHashableT = TypeVar(\"HashableT\", bound=Hashable)\n\nVType: TypeAlias = Hashable | Sequence[HashableT]\n\ndef foo(p: VType[Hashable]) -> None: ...   # Too many type arguments: expected 0, got 1 (invalid-type-arguments) [Ln 8, Col 18]\n```\n\nIt passes the check of `mypy` and `pyright`.\n\nThe issue arose from pandas-dev/pandas-stubs#1537.\n\n## Version\n\n5dc0079e7\n\n### Version\n\n_No response_",
      "closed_by": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1846/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1844",
      "id": 3716333541,
      "node_id": "I_kwDOOje-Bs7dgr_l",
      "number": 1844,
      "title": "workspace symbols request failing",
      "user": {
        "login": "insane-dreamer",
        "id": 25834,
        "node_id": "MDQ6VXNlcjI1ODM0",
        "avatar_url": "https://avatars.githubusercontent.com/u/25834?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/insane-dreamer",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568528024,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlcmA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-info",
          "name": "needs-info",
          "color": "FBCA04",
          "default": false,
          "description": "More information is needed from the issue author"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "2": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 9,
      "created_at": "2025-12-10T18:30:48Z",
      "updated_at": "2025-12-31T15:41:25Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen using the \"search symbol\" feature in `zed` no results are shown, and `ty` panics with: \n```\n2025-12-10T10:15:56-08:00 INFO  [lsp] starting language server process. binary path: \"/home/sean/.local/share/zed/languages/ty/ty-0.0.1-alpha.33/ty-x86_64-unknown-linux-gnu/ty\", working directory: \"/home/sean/dev/cpe\", args: [\"server\"]\n2025-12-10T10:16:01-08:00 ERROR [crates/project/src/lsp_store.rs:7620] workspace symbols request\n\nCaused by:\n    request handler panicked at crates/ruff_source_file/src/line_index.rs:198:44:\n    byte index 40962 is out of bounds of `\"\"\"\n    import os\n    import logging\n    from ...engine import *\n    import numpy as np\n    \n    from .channel_space import internalize_coo`[...]\n    run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n```\n\nthe issue isn't specific to the above file. If I remove that file and restart the server, it errors on the next file it hits:\n```\n2025-12-10T10:21:31-08:00 ERROR [crates/project/src/lsp_store.rs:7620] workspace symbols request\n\nCaused by:\n    request handler panicked at crates/ruff_source_file/src/line_index.rs:198:44:\n    byte index 12080 is out of bounds of `import unittest\n    import logging\n    import numpy as np\n    from neuropype.engine import *\n    from neuropype.nodes import ROIActivations, ROIsToVertices\n    from neuropype.utilities.testing import expect_exception\n    \n    \n    logger = logging.getLogger(__name__)\n    \n    \n    class ROIsTestCase`[...]\n    run with `RUST_BACKTRACE=1` environment variable to display a backtrace\n```\n\nIn both cases the trace shows a backtick on the last line  ``` that is not in the actual code. \n\n\n\n### Version\n\n0.0.1-alpha.33, on Ubuntu 24.04",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1844/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1843",
      "id": 3715911386,
      "node_id": "I_kwDOOje-Bs7dfE7a",
      "number": 1843,
      "title": "Explore and possibly fix variance for `ParamSpec`",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-10T16:22:28Z",
      "updated_at": "2025-12-10T16:22:49Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "See the discussion here: https://github.com/astral-sh/ruff/pull/21883#discussion_r2607247451\n\nAnd the failing tests here: https://github.com/astral-sh/ruff/blob/951766d1fbce5bfa6758f81876ae26124892f33e/crates/ty_python_semantic/resources/mdtest/type_of/generics.md?plain=1#L404-L453",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1843/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1840",
      "id": 3715001944,
      "node_id": "I_kwDOOje-Bs7dbm5Y",
      "number": 1840,
      "title": "Return value of generic data descriptors not infered correctly",
      "user": {
        "login": "mflova",
        "id": 67102627,
        "node_id": "MDQ6VXNlcjY3MTAyNjI3",
        "avatar_url": "https://avatars.githubusercontent.com/u/67102627?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mflova",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-10T12:28:24Z",
      "updated_at": "2025-12-10T16:54:32Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nTher eturn value of `__get__` method is not infered properly for the following case. Mypy and pyright label them correct. I could not find this issue reported, but maybe is related to the incoming improvements for type variable inference for generic classes.\n\nHere is a quick example:\n\n```py\nfrom collections.abc import Callable\nfrom typing import Any, Generic, TypeVar\n\nfrom typing_extensions import reveal_type\n\nValue_co = TypeVar(\"Value_co\", covariant=True)\n\n\nclass classproperty(Generic[Value_co]):  # noqa: N801\n    def __init__(self, method: Callable[[Any], Value_co]) -> None:\n        ...\n\n    def __get__(self, instance: Any | None, owner: type[Any]) -> Value_co:\n        ...\n\n\nclass MyClass:\n    @classproperty\n    def my_class_property(cls) -> str:\n        return \"Hello, World!\"\n\nreveal_type(MyClass.my_class_property)  # Expected: str, got: Unknown\n```\n\n### Version\n\nty 0.0.1-alpha.33 (35e23aa48 2025-12-09)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1840/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1839",
      "id": 3715001674,
      "node_id": "I_kwDOOje-Bs7dbm1K",
      "number": 1839,
      "title": "Bounds and constraints of type variables cannot be generic",
      "user": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "mtshiba",
          "id": 45118249,
          "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
          "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mtshiba",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-10T12:28:20Z",
      "updated_at": "2025-12-13T02:45:23Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIn the current Python type specification, bounds and constraints for type variables must be concrete types and cannot contain type variables (even though it's possible at runtime).\n\n[peps.python.org/pep-0695#type-parameter-scopes](https://peps.python.org/pep-0695/#type-parameter-scopes)\n\nSo, all of the following cases should be reported as errors:\n\n```py\nfrom typing import TypeVar\n\n# OK\nT1 = TypeVar(\"T1\", bound=list[int])\nT2 = TypeVar(\"T2\", list[int], str)\n\nU = TypeVar(\"U\")\n# error\nT3 = TypeVar(\"T3\", bound=U)\n# error\nT4 = TypeVar(\"T4\", bound=list[U])\n# error\nT5 = TypeVar(\"T5\", bound=list[\"T5\"])\n# error\nT6 = TypeVar(\"T6\", U, str)\n# error\nT7 = TypeVar(\"T7\", list[\"T7\"], str)\n```\n\n```py\n# OK\ndef _[T: list[int]](): ...\ndef _[T: (list[int], str)](): ...\n\n# error\ndef _[U, T: U](): ...\n# error\ndef _[U, T: list[U]](): ...\n# error\ndef _[T: list[T]](): ...\n# error\ndef _[U, T: (U, str)](): ...\n# error\ndef _[T: (list[T], str)](): ...\n```\n\nHowever, this is difficult to implement straightforwardly in the current implementation of ty, because bounds/constraints on type variables are lazily evaluated.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1839/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1838",
      "id": 3714992100,
      "node_id": "I_kwDOOje-Bs7dbkfk",
      "number": 1838,
      "title": "Resolve `ParamSpec` with the matching overload",
      "user": {
        "login": "leddy231",
        "id": 2323691,
        "node_id": "MDQ6VXNlcjIzMjM2OTE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2323691?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/leddy231",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        },
        "2": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-10T12:25:56Z",
      "updated_at": "2025-12-10T12:49:19Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nUpgraded from 0.0.1a26 to 0.0.1a33 and noticed issues with asyncio.to_thread in combination with overloaded functions. Initially noticed with `open` but can be reduced to some simple example:\n\n```python\nimport asyncio\nfrom typing import overload\n\n\ndef normal(a: str) -> None:\n    pass\n\n\n@overload\ndef overloaded(a: str) -> None:\n    pass\n\n\n@overload\ndef overloaded(a: int) -> None:\n    pass\n\n\ndef overloaded(a: str | int) -> None:\n    pass\n\n\nt1 = normal(\"test\")\nt2 = overloaded(\"test\")\nt3 = asyncio.to_thread(normal, \"test\")\nt4 = asyncio.to_thread(overloaded, \"test\")\n```\n`ty check` gives:\n```\nerror[invalid-argument-type]: Argument to function `to_thread` is incorrect\n  --> test.py:26:36\n   |\n24 | t2 = overloaded(\"test\")\n25 | t3 = asyncio.to_thread(normal, \"test\")\n26 | t4 = asyncio.to_thread(overloaded, \"test\")\n   |                                    ^^^^^^ Expected `Overload[(a: str) -> Unknown, (a: int) -> Unknown]`, found `Literal[\"test\"]`\n   |\ninfo: Function defined here\n  --> stdlib/asyncio/threads.pyi:12:11\n   |\n10 | _R = TypeVar(\"_R\")\n11 |\n12 | async def to_thread(func: Callable[_P, _R], /, *args: _P.args, **kwargs: _P.kwargs) -> _R:\n   |           ^^^^^^^^^                            -------------- Parameter declared here\n13 |     \"\"\"Asynchronously run function *func* in a separate thread.\n   |\ninfo: rule `invalid-argument-type` is enabled by default\n```\n\n\n### Version\n\nty 0.0.1a33",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1838/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1836",
      "id": 3714600213,
      "node_id": "I_kwDOOje-Bs7daE0V",
      "number": 1836,
      "title": "Reconsider imports as type declarations",
      "user": {
        "login": "zsol",
        "id": 66740,
        "node_id": "MDQ6VXNlcjY2NzQw",
        "avatar_url": "https://avatars.githubusercontent.com/u/66740?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zsol",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-10T10:34:31Z",
      "updated_at": "2026-01-04T20:10:58Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen a `with` statement binds to a name that has already been declared, an `invalid-assignment` error is raised (as expected?), but future references to the name are associated with the declared type, not the type that the context manager yields.\n\nA simple repro: https://play.ty.dev/6a08fc89-50e6-4de9-bd6d-b9f9e52412dd\n\n### Version\n\n0.0.1-alpha.27",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1836/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1835",
      "id": 3714273837,
      "node_id": "I_kwDOOje-Bs7dY1It",
      "number": 1835,
      "title": "Consolidate handling of dataclass-params and dataclass-transformer-params",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592544541,
          "node_id": "LA_kwDOOje-Bs8AAAACACfTHQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/dataclasses",
          "name": "dataclasses",
          "color": "1d76db",
          "default": false,
          "description": "Issues relating to dataclasses and dataclass_transform"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-10T09:10:07Z",
      "updated_at": "2025-12-23T00:42:17Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The goal of this ticket is to consolidate and clean up our handling of dataclass-params and dataclass-transformer-params for all different kinds of dataclasses: \"standard\" `dataclasses.dataclass` dataclasses, decorator-based dataclass transformers, base-class-based dataclass transformers, and metaclass-based dataclass transformers.\n\nFor more context, see [this comment](https://github.com/astral-sh/ruff/pull/21820#issuecomment-3629221765). In particular, this part:\n\n> I think we never properly added support for default_* params on base-class and metaclass-based transformers, but some contributors added partial support when synthesizing __init__. Instead of that partial support, we should either have generalized methods for querying dataclass params (from anywhere) which always fall back to the dataclass-transformer-params, or we should ensure that dataclass_params on the class itself are always already initialized with values from the transformer param defaults. (It looks like this currently happens for function dataclass transforms but not for metaclass or base-class ones.) It also looks like we store dataclass_transformer_params on the class, but this also isn't currently set for metaclass or base-class transformers. So this special-cased support for base-class and metaclass transformers that was added to __init__ synthesis ought to be generalized, and if that happened this PR wouldn't need to explicitly check the transformer params.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1835/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1825",
      "id": 3711309569,
      "node_id": "I_kwDOOje-Bs7dNhcB",
      "number": 1825,
      "title": "Correctly handle variadic parameters for overload step 5 filtering",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-09T14:56:40Z",
      "updated_at": "2025-12-10T16:53:58Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nhttps://github.com/astral-sh/ruff/pull/21859 doesn't correctly fix the underlying issue and there are multiple TODOs in the test: https://github.com/astral-sh/ruff/blob/b21d520f067f1add859bf6494e28a3c5c7a020f4/crates/ty_python_semantic/resources/mdtest/call/overloads.md#varidic-argument-with-generics that needs to be resolved.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1825/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1824",
      "id": 3711083420,
      "node_id": "I_kwDOOje-Bs7dMqOc",
      "number": 1824,
      "title": "simplify intersections of overlapping covariant generic protocols",
      "user": {
        "login": "danielpopescu",
        "id": 3674804,
        "node_id": "MDQ6VXNlcjM2NzQ4MDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3674804?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/danielpopescu",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "2": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-09T14:04:07Z",
      "updated_at": "2026-01-08T18:52:09Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nType error in this code\n\n```py\ndef fold_left[T, U](lst: Iterable[T], init: U, f: Callable[[U, T], U]) -> U:\n    def fold_left_it(it: Iterator[T], init: U, f: Callable[[U, T], U]) -> U:\n        elem: T | None = next(it, None)\n        return fold_left_it(it, f(init, elem), f) if elem is not None else init\n\n    if isinstance(lst, Iterator):\n        it: Iterator[T] = lst\n\n        return fold_left_it(it, init, f)\n    return fold_left_it(iter(lst), init, f)\n\n```\n\nerror ty     invalid-assignment    Object of type `Iterable[T@fold_left] & Iterator[object]` is not assignable to `Iterator[T@fold_left]`\n\nmypy and pyright work fine ....\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1824/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1823",
      "id": 3710464385,
      "node_id": "I_kwDOOje-Bs7dKTGB",
      "number": 1823,
      "title": "await in jupyter notebooks marked as invalid-syntax",
      "user": {
        "login": "bvolkmer",
        "id": 7070761,
        "node_id": "MDQ6VXNlcjcwNzA3NjE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7070761?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/bvolkmer",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568528024,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlcmA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-info",
          "name": "needs-info",
          "color": "FBCA04",
          "default": false,
          "description": "More information is needed from the issue author"
        },
        "1": {
          "id": 9412245782,
          "node_id": "LA_kwDOOje-Bs8AAAACMQN5Fg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/notebook",
          "name": "notebook",
          "color": "af5117",
          "default": false,
          "description": "support for Jupyter (or similar) notebooks"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "ntBre",
        "id": 36778786,
        "node_id": "MDQ6VXNlcjM2Nzc4Nzg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/36778786?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ntBre",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "ntBre",
          "id": 36778786,
          "node_id": "MDQ6VXNlcjM2Nzc4Nzg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/36778786?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ntBre",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 6,
      "created_at": "2025-12-09T11:31:07Z",
      "updated_at": "2025-12-14T16:00:24Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n`await` statements are flagged as `error[invalid-syntax]: `await` outside of an asynchronous function` even though it is allowed in Jupyter cells.\n\n### Version\n\nty 0.0.1-alpha.32",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1823/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1822",
      "id": 3709772610,
      "node_id": "I_kwDOOje-Bs7dHqNC",
      "number": 1822,
      "title": "Promote literals in unannotated module globals",
      "user": {
        "login": "JanFontanet",
        "id": 9483993,
        "node_id": "MDQ6VXNlcjk0ODM5OTM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/9483993?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/JanFontanet",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-09T08:24:58Z",
      "updated_at": "2025-12-24T13:04:04Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI've a 3rd party library that exposes some configuration through module variables, so I've to overwrite them in order for the library to work as I want. But when I run `ty check` on my code I got an error that can be reproduced with the minimal example below.\n\na.py:\n```python\nMY_VAR=1\n```\nmain.py\n```python\nimport a\n\na.MY_VAR=2\n```\n\nI got the following error:\n```\nObject of type `Literal[2]` is not assignable to attribute `MY_VAR` of type `Literal[1]` (invalid-assignment) [Ln 3, Col 1]\n```\n\n\n\n### Version\n\nty 0.0.1-alpha.32",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1822/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1816",
      "id": 3708607602,
      "node_id": "I_kwDOOje-Bs7dDNxy",
      "number": 1816,
      "title": "consider type weakening some inlay-hints",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-12-09T00:38:26Z",
      "updated_at": "2025-12-09T00:49:40Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "`Literal` inlay hints are often extremely verbose and not what you would ever want to bake. We could consider applying a \"weakening\" transform to some of them:\n\n* Literal[\"foo\"] -> str\n* Literal[1] -> int\n\netc.\n\n(Writing this down before I forget about it)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1816/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1815",
      "id": 3708565302,
      "node_id": "I_kwDOOje-Bs7dDDc2",
      "number": 1815,
      "title": "Instantiating a `list` or `set` loses literal generic type information",
      "user": {
        "login": "Avasam",
        "id": 1350584,
        "node_id": "MDQ6VXNlcjEzNTA1ODQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1350584?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Avasam",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "ibraheemdev",
          "id": 34988408,
          "node_id": "MDQ6VXNlcjM0OTg4NDA4",
          "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ibraheemdev",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-09T00:22:17Z",
      "updated_at": "2025-12-20T01:57:02Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nFeel free to rename or mark as duplicate if there's a pre-existing issue that better describes the root cause. The closest related I found was maybe https://github.com/astral-sh/ty/issues/1648 / https://github.com/astral-sh/ty/issues/1576\n\nPassing a list of literals to `list` or `set` loses type information with ty. Whereas both mypy and pyright keep the literal generic types:\n- https://mypy-play.net/?gist=698f5d996f794a1a02536cebb8fe47a1\n- https://play.ty.dev/7f70524b-6288-4669-8627-62926ed7bad5\n- [pyright playground](https://pyright-play.net/?code=GYJw9gtgBALgngBwJYDsDmUkQWEMoAySMApiAIYA2ANFCCQG4lUD68CJAsAFAAmJwKCwAUADwBcUSkgDOMANpFSFSvIBE5NbTUAjLVDUBjNQF0TASnE8oNuo2aU2iEmPPXb9Jq3Yvpc127ctnZejj7CMiQwATxAA)\n<img width=\"501\" height=\"272\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/65b7c5ed-9c08-44ce-bf0c-99e19b3113c0\" />\n\n### Version\n\nty 0.0.1-alpha.32",
      "closed_by": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1815/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1813",
      "id": 3708308448,
      "node_id": "I_kwDOOje-Bs7dCEvg",
      "number": 1813,
      "title": "LSP mdtests?",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        },
        "1": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-08T22:46:57Z",
      "updated_at": "2026-01-09T03:28:41Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe amount of snapshot tests we have inline in the code for ty_ide is getting a bit absurd, and makes me wonder if we could extend/ape mdtests. But at this point there's literally over 900 tests so... Oof.\n\nAlso I'm not sure if mdtests are really the right format, snapshot tests do feel like the right approach for these...\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1813/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1811",
      "id": 3708213293,
      "node_id": "I_kwDOOje-Bs7dBtgt",
      "number": 1811,
      "title": "ty extension: The ty language server exited with a panic",
      "user": {
        "login": "daltunay",
        "id": 95445246,
        "node_id": "U_kgDOBbBg_g",
        "avatar_url": "https://avatars.githubusercontent.com/u/95445246?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/daltunay",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568528024,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlcmA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-info",
          "name": "needs-info",
          "color": "FBCA04",
          "default": false,
          "description": "More information is needed from the issue author"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "2": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-08T22:15:50Z",
      "updated_at": "2025-12-31T15:40:37Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "First, thank you all for uv, ruff and ty!\n\n### Summary\n\nWhile working with either Cursor or new [Antigravity IDE](https://antigravity.google/), I often get the following error:\n> ```\n> The ty language server exited with a panic. See the logs for more details.\n> ```\n\nI am not sure exactly what's triggering it, but I feel like this happens while the agent is modifying files.\n\nHere are the logs of the last time it happened to me:\n\n<details><summary>ty output - 1</summary>\n<p>\n\n```\n2025-12-08 13:52:12.100145000  INFO Checking file `/Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/pipeline.py` took more than 100ms (109.510792ms)\n2025-12-08 13:52:15.179335000  INFO Checking file `/Users/daltunay/GitHub/bc_core_api/utils/edi/x12/utils/datetime.py` took more than 100ms (142.548792ms)\n2025-12-08 13:53:07.532756000  INFO Defaulting to python-platform `darwin`\n2025-12-08 13:53:07.534350000  INFO Python version: Python 3.11, platform: darwin\n2025-12-08 13:53:07.564521000  INFO Indexed 3969 file(s) in 0.025s\n2025-12-08 13:53:08.809034000  INFO Defaulting to python-platform `darwin`\n2025-12-08 13:53:08.812397000  INFO Python version: Python 3.11, platform: darwin\n2025-12-08 13:53:09.016086000  INFO Indexed 3969 file(s) in 0.083s\n2025-12-08 13:53:13.982949000  INFO Defaulting to python-platform `darwin`\n2025-12-08 13:53:13.983778000  INFO Python version: Python 3.11, platform: darwin\n2025-12-08 13:53:14.006984000  INFO Indexed 3969 file(s) in 0.021s\n2025-12-08 13:53:51.322352000  INFO Checking file `/Users/daltunay/GitHub/bc_core_api/invoice_manager/services/invoice_activity_event_service.py` took more than 100ms (194.254625ms)\n2025-12-08 13:53:51.565877000  INFO Checking file `/Users/daltunay/GitHub/bc_core_api/users/migrations/0141_alter_billing_disputable_amount_cents_limit_squashed_0209_companysettings_isolated_data_alter_company_settings.py` took more than 100ms (137.03375ms)\n2025-12-08 13:53:51.582140000  INFO Checking file `/Users/daltunay/GitHub/bc_core_api/utils/edi/x12/utils/datetime.py` took more than 100ms (168.828458ms)\n2025-12-08 13:53:51.605898000  INFO Checking file `/Users/daltunay/GitHub/bc_core_api/common/factory_helpers.py` took more than 100ms (184.362833ms)\n2025-12-08 13:54:03.909385000  INFO Defaulting to python-platform `darwin`\n2025-12-08 13:54:03.910012000  INFO Python version: Python 3.11, platform: darwin\n2025-12-08 13:54:03.935289000  INFO Indexed 3969 file(s) in 0.024s\n2025-12-08 13:54:08.456916000  INFO Defaulting to python-platform `darwin`\n2025-12-08 13:54:08.458341000  INFO Python version: Python 3.11, platform: darwin\n2025-12-08 13:54:08.484814000  INFO Indexed 3969 file(s) in 0.025s\n2025-12-08 13:54:39.585661000  INFO Checking file `/Users/daltunay/GitHub/bc_core_api/users/constants.py` took more than 100ms (3.480041542s)\n2025-12-08 13:54:54.752225000  INFO Checking file `/Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/pipeline.py` took more than 100ms (158.447083ms)\n2025-12-08 13:55:11.960075000  WARN Ignoring request id=71673 method=textDocument/diagnostic because Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/pipeline.py is not open in the session\n[Error - 1:55:11 PM] Request textDocument/diagnostic failed.\n  Message: Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/pipeline.py is not open in the session\n  Code: -32602 \n[Error - 1:55:11 PM] Document pull failed for text document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/pipeline.py\n  Message: Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/pipeline.py is not open in the session\n  Code: -32602 \n2025-12-08 13:55:19.917146000  WARN Ignoring request id=71690 method=textDocument/diagnostic because Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/create_pydantic_dataset.py is not open in the session\n[Error - 1:55:19 PM] Request textDocument/diagnostic failed.\n  Message: Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/create_pydantic_dataset.py is not open in the session\n  Code: -32602 \n[Error - 1:55:19 PM] Document pull failed for text document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/create_pydantic_dataset.py\n  Message: Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/create_pydantic_dataset.py is not open in the session\n  Code: -32602 \n2025-12-08 13:55:21.174144000  WARN Ignoring request id=71692 method=textDocument/diagnostic because Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/__init__.py is not open in the session\n[Error - 1:55:21 PM] Request textDocument/diagnostic failed.\n  Message: Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/__init__.py is not open in the session\n  Code: -32602 \n[Error - 1:55:21 PM] Document pull failed for text document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/__init__.py\n  Message: Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/__init__.py is not open in the session\n  Code: -32602 \n2025-12-08 13:55:23.279805000  WARN Ignoring request id=71694 method=textDocument/diagnostic because Document file:///Users/daltunay/GitHub/bc_core_api/ai/management/commands/evaluate_structured_parsing.py is not open in the session\n[Error - 1:55:23 PM] Request textDocument/diagnostic failed.\n  Message: Document file:///Users/daltunay/GitHub/bc_core_api/ai/management/commands/evaluate_structured_parsing.py is not open in the session\n  Code: -32602 \n[Error - 1:55:23 PM] Document pull failed for text document file:///Users/daltunay/GitHub/bc_core_api/ai/management/commands/evaluate_structured_parsing.py\n  Message: Document file:///Users/daltunay/GitHub/bc_core_api/ai/management/commands/evaluate_structured_parsing.py is not open in the session\n  Code: -32602 \n2025-12-08 13:55:26.263357000  INFO Defaulting to python-platform `darwin`\n2025-12-08 13:55:26.263777000  INFO Python version: Python 3.11, platform: darwin\n2025-12-08 13:55:26.352881000  INFO Indexed 3969 file(s) in 0.088s\n2025-12-08 13:55:31.261106000  INFO Defaulting to python-platform `darwin`\n2025-12-08 13:55:31.261812000  INFO Python version: Python 3.11, platform: darwin\n2025-12-08 13:55:31.279671000  INFO Indexed 3969 file(s) in 0.017s\n2025-12-08 13:56:34.962746000  WARN Ignoring request id=71769 method=textDocument/diagnostic because Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/models.py is not open in the session\n[Error - 1:56:34 PM] Request textDocument/diagnostic failed.\n  Message: Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/models.py is not open in the session\n  Code: -32602 \n[Error - 1:56:34 PM] Document pull failed for text document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/models.py\n  Message: Document file:///Users/daltunay/GitHub/bc_core_api/ai/structured_invoice_parsing/evaluation/models.py is not open in the session\n  Code: -32602 \n2025-12-08 13:57:59.017986000  INFO Checking file `/Users/daltunay/GitHub/bc_core_api/invoices/parsers/edi_x12_parser.py` took more than 100ms (113.07975ms)\n2025-12-08 13:58:01.158066000  WARN Propagating panic for cycle head that panicked in an earlier execution in that revision\n2025-12-08 13:58:01.158171000  WARN Propagating panic for cycle head that panicked in an earlier execution in that revision\n2025-12-08 13:58:03.452983000  WARN Propagating panic for cycle head that panicked in an earlier execution in that revision\n2025-12-08 13:58:15.043033000  INFO Checking file `/Users/daltunay/GitHub/bc_core_api/users/constants.py` took more than 100ms (3.245766166s)\n2025-12-08 13:58:43.670668000  WARN Propagating panic for cycle head that panicked in an earlier execution in that revision\n2025-12-08 13:58:43.671229000  WARN Propagating panic for cycle head that panicked in an earlier execution in that revision\n2025-12-08 13:58:46.195606000  WARN Propagating panic for cycle head that panicked in an earlier execution in that revision\n2025-12-08 13:58:46.198208000 ERROR panicked at /Users/runner/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/59aa107/src/function/backdate.rs:42:17:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n   0: __mh_execute_header\n   1: __mh_execute_header\n   2: __mh_execute_header\n   3: __mh_execute_header\n   4: __mh_execute_header\n   5: __mh_execute_header\n   6: __mh_execute_header\n   7: __mh_execute_header\n   8: __mh_execute_header\n   9: __mh_execute_header\n  10: __mh_execute_header\n  11: __mh_execute_header\n  12: __mh_execute_header\n  13: __mh_execute_header\n  14: __mh_execute_header\n  15: __pthread_cond_wait\n\npanicked at /Users/runner/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/59aa107/src/function/backdate.rs:42:17:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n   0: __mh_execute_header\n   1: __mh_execute_header\n   2: __mh_execute_header\n   3: __mh_execute_header\n   4: __mh_execute_header\n   5: __mh_execute_header\n   6: __mh_execute_header\n   7: __mh_execute_header\n   8: __mh_execute_header\n   9: __mh_execute_header\n  10: __mh_execute_header\n  11: __mh_execute_header\n  12: __mh_execute_header\n  13: __mh_execute_header\n  14: __mh_execute_header\n  15: __pthread_cond_wait\n\n2025-12-08 13:58:46.220974000 ERROR An error occurred with request ID 71982: request handler panicked at:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n[Error - 1:58:46 PM] Request textDocument/diagnostic failed.\n  Message: request handler panicked at:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n  Code: -32603 \n[Error - 1:58:46 PM] Workspace diagnostic pull failed.\n  Message: request handler panicked at:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n  Code: -32603 \n2025-12-08 13:58:48.234624000  WARN Propagating panic for cycle head that panicked in an earlier execution in that revision\n2025-12-08 13:58:48.235052000 ERROR panicked at /Users/runner/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/59aa107/src/function/backdate.rs:42:17:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n   0: __mh_execute_header\n   1: __mh_execute_header\n   2: __mh_execute_header\n   3: __mh_execute_header\n   4: __mh_execute_header\n   5: __mh_execute_header\n   6: __mh_execute_header\n   7: __mh_execute_header\n   8: __mh_execute_header\n   9: __mh_execute_header\n  10: __mh_execute_header\n  11: __mh_execute_header\n  12: __mh_execute_header\n  13: __mh_execute_header\n  14: __mh_execute_header\n  15: __pthread_cond_wait\n\npanicked at /Users/runner/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/59aa107/src/function/backdate.rs:42:17:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n   0: __mh_execute_header\n   1: __mh_execute_header\n   2: __mh_execute_header\n   3: __mh_execute_header\n   4: __mh_execute_header\n   5: __mh_execute_header\n   6: __mh_execute_header\n   7: __mh_execute_header\n   8: __mh_execute_header\n   9: __mh_execute_header\n  10: __mh_execute_header\n  11: __mh_execute_header\n  12: __mh_execute_header\n  13: __mh_execute_header\n  14: __mh_execute_header\n  15: __pthread_cond_wait\n\n2025-12-08 13:58:48.265699000 ERROR An error occurred with request ID 71983: request handler panicked at:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n[Error - 1:58:48 PM] Request textDocument/diagnostic failed.\n  Message: request handler panicked at:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n  Code: -32603 \n[Error - 1:58:48 PM] Workspace diagnostic pull failed.\n  Message: request handler panicked at:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n  Code: -32603 \n2025-12-08 13:58:50.276868000  WARN Propagating panic for cycle head that panicked in an earlier execution in that revision\n2025-12-08 13:58:50.277268000 ERROR panicked at /Users/runner/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/59aa107/src/function/backdate.rs:42:17:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n   0: __mh_execute_header\n   1: __mh_execute_header\n   2: __mh_execute_header\n   3: __mh_execute_header\n   4: __mh_execute_header\n   5: __mh_execute_header\n   6: __mh_execute_header\n   7: __mh_execute_header\n   8: __mh_execute_header\n   9: __mh_execute_header\n  10: __mh_execute_header\n  11: __mh_execute_header\n  12: __mh_execute_header\n  13: __mh_execute_header\n  14: __mh_execute_header\n  15: __pthread_cond_wait\n\npanicked at /Users/runner/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/59aa107/src/function/backdate.rs:42:17:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n   0: __mh_execute_header\n   1: __mh_execute_header\n   2: __mh_execute_header\n   3: __mh_execute_header\n   4: __mh_execute_header\n   5: __mh_execute_header\n   6: __mh_execute_header\n   7: __mh_execute_header\n   8: __mh_execute_header\n   9: __mh_execute_header\n  10: __mh_execute_header\n  11: __mh_execute_header\n  12: __mh_execute_header\n  13: __mh_execute_header\n  14: __mh_execute_header\n  15: __pthread_cond_wait\n\n2025-12-08 13:58:50.306676000 ERROR An error occurred with request ID 71984: request handler panicked at:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n[Error - 1:58:50 PM] Request textDocument/diagnostic failed.\n  Message: request handler panicked at:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n  Code: -32603 \n[Error - 1:58:50 PM] Workspace diagnostic pull failed.\n  Message: request handler panicked at:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_at\n  Code: -32603 \n```\n\n</p>\n</details> \n\nAlso while writing this and doing some code modifications, the language server crashed with another exception:\n\n<details><summary>ty output - 2</summary>\n<p>\n\n```\n2025-12-08 14:07:57.417468000 ERROR An error occurred with request ID 72818: request handler panicked at crates/ruff_python_ast/src/token/tokens.rs:182:13:\nOffset 1689 is inside a token range 1688..1692\nrun with `RUST_BACKTRACE=1` environment variable to display a backtrace\n\n[Error - 2:07:57 PM] Request textDocument/codeAction failed.\n  Message: request handler panicked at crates/ruff_python_ast/src/token/tokens.rs:182:13:\nOffset 1689 is inside a token range 1688..1692\nrun with `RUST_BACKTRACE=1` environment variable to display a backtrace\n\n  Code: -32603 \n2025-12-08 14:07:57.751671000 ERROR An error occurred with request ID 72842: request handler panicked at crates/ruff_python_ast/src/token/tokens.rs:182:13:\nOffset 1689 is inside a token range 1688..1692\nrun with `RUST_BACKTRACE=1` environment variable to display a backtrace\n\n[Error - 2:07:57 PM] Request textDocument/codeAction failed.\n  Message: request handler panicked at crates/ruff_python_ast/src/token/tokens.rs:182:13:\nOffset 1689 is inside a token range 1688..1692\nrun with `RUST_BACKTRACE=1` environment variable to display a backtrace\n\n  Code: -32603 \n```\n\n</p>\n</details> \n\nVS Code extension version: `2025.61.13371357`\nty version: `ty 0.0.1-alpha.32 (84a188116 2025-12-05)`\n\nI am also providing debug information if this can help:\n\n<details><summary>ty debug</summary>\n<p>\n\n```\nClient capabilities: ResolvedClientCapabilities(\n    WORKSPACE_DIAGNOSTIC_REFRESH | INLAY_HINT_REFRESH | PULL_DIAGNOSTICS | TYPE_DEFINITION_LINK_SUPPORT | DEFINITION_LINK_SUPPORT | DECLARATION_LINK_SUPPORT | PREFER_MARKDOWN_IN_HOVER | SIGNATURE_LABEL_OFFSET_SUPPORT | SIGNATURE_ACTIVE_PARAMETER_SUPPORT | HIERARCHICAL_DOCUMENT_SYMBOL_SUPPORT | WORK_DONE_PROGRESS | FILE_WATCHER_SUPPORT | RELATIVE_FILE_WATCHER_SUPPORT | DIAGNOSTIC_DYNAMIC_REGISTRATION | WORKSPACE_CONFIGURATION | RENAME_DYNAMIC_REGISTRATION | COMPLETION_ITEM_LABEL_DETAILS_SUPPORT,\n)\nPosition encoding: UTF16\nGlobal settings: GlobalSettings {\n    diagnostic_mode: Workspace,\n    experimental: ExperimentalSettings {\n        rename: true,\n        auto_import: true,\n    },\n}\nOpen text documents: 5\n\nWorkspace /Users/daltunay/GitHub/bc_core_api (file:///Users/daltunay/GitHub/bc_core_api)\nSettings: WorkspaceSettings {\n    disable_language_services: false,\n    inlay_hints: InlayHintSettings {\n        variable_types: true,\n        call_argument_names: true,\n    },\n    overrides: Some(\n        ProjectOptionsOverrides {\n            config_file_override: None,\n            fallback_python_version: Some(\n                PythonVersion {\n                    major: 3,\n                    minor: 11,\n                },\n            ),\n            fallback_python: Some(\n                RelativePathBuf(\n                    \"/Users/daltunay/GitHub/bc_core_api/.venv\",\n                ),\n            ),\n            options: Options {\n                environment: None,\n                src: None,\n                rules: None,\n                terminal: None,\n                overrides: None,\n            },\n        },\n    ),\n}\n\nProject at /Users/daltunay/GitHub/bc_core_api\nSettings: Settings {\n    rules: {\n        \"ambiguous-protocol-member\": Warning (Default),\n        \"byte-string-type-annotation\": Error (Default),\n        \"call-non-callable\": Error (Default),\n        \"conflicting-argument-forms\": Error (Default),\n        \"conflicting-declarations\": Error (Default),\n        \"conflicting-metaclass\": Error (Default),\n        \"cyclic-class-definition\": Error (Default),\n        \"cyclic-type-alias-definition\": Error (Default),\n        \"deprecated\": Warning (Default),\n        \"duplicate-base\": Error (Default),\n        \"duplicate-kw-only\": Error (Default),\n        \"escape-character-in-forward-annotation\": Error (Default),\n        \"fstring-type-annotation\": Error (Default),\n        \"ignore-comment-unknown-rule\": Warning (Default),\n        \"implicit-concatenated-string-type-annotation\": Error (Default),\n        \"inconsistent-mro\": Error (Default),\n        \"index-out-of-bounds\": Error (Default),\n        \"instance-layout-conflict\": Error (Default),\n        \"invalid-argument-type\": Error (Default),\n        \"invalid-assignment\": Error (Default),\n        \"invalid-attribute-access\": Error (Default),\n        \"invalid-await\": Error (Default),\n        \"invalid-base\": Error (Default),\n        \"invalid-context-manager\": Error (Default),\n        \"invalid-declaration\": Error (Default),\n        \"invalid-exception-caught\": Error (Default),\n        \"invalid-explicit-override\": Error (Default),\n        \"invalid-generic-class\": Error (Default),\n        \"invalid-ignore-comment\": Warning (Default),\n        \"invalid-key\": Error (Default),\n        \"invalid-legacy-type-variable\": Error (Default),\n        \"invalid-metaclass\": Error (Default),\n        \"invalid-method-override\": Error (Default),\n        \"invalid-named-tuple\": Error (Default),\n        \"invalid-newtype\": Error (Default),\n        \"invalid-overload\": Error (Default),\n        \"invalid-parameter-default\": Error (Default),\n        \"invalid-paramspec\": Error (Default),\n        \"invalid-protocol\": Error (Default),\n        \"invalid-raise\": Error (Default),\n        \"invalid-return-type\": Error (Default),\n        \"invalid-super-argument\": Error (Default),\n        \"invalid-syntax-in-forward-annotation\": Error (Default),\n        \"invalid-type-alias-type\": Error (Default),\n        \"invalid-type-arguments\": Error (Default),\n        \"invalid-type-checking-constant\": Error (Default),\n        \"invalid-type-form\": Error (Default),\n        \"invalid-type-guard-call\": Error (Default),\n        \"invalid-type-guard-definition\": Error (Default),\n        \"invalid-type-variable-constraints\": Error (Default),\n        \"missing-argument\": Error (Default),\n        \"missing-typed-dict-key\": Error (Default),\n        \"no-matching-overload\": Error (Default),\n        \"non-subscriptable\": Error (Default),\n        \"not-iterable\": Error (Default),\n        \"override-of-final-method\": Error (Default),\n        \"parameter-already-assigned\": Error (Default),\n        \"positional-only-parameter-as-kwarg\": Error (Default),\n        \"possibly-missing-attribute\": Warning (Default),\n        \"possibly-missing-implicit-call\": Warning (Default),\n        \"possibly-missing-import\": Warning (Default),\n        \"raw-string-type-annotation\": Error (Default),\n        \"redundant-cast\": Warning (Default),\n        \"static-assert-error\": Error (Default),\n        \"subclass-of-final-class\": Error (Default),\n        \"super-call-in-named-tuple-method\": Error (Default),\n        \"too-many-positional-arguments\": Error (Default),\n        \"type-assertion-failure\": Error (Default),\n        \"unavailable-implicit-super-arguments\": Error (Default),\n        \"undefined-reveal\": Warning (Default),\n        \"unknown-argument\": Error (Default),\n        \"unresolved-attribute\": Error (Default),\n        \"unresolved-global\": Warning (Default),\n        \"unresolved-import\": Error (Default),\n        \"unresolved-reference\": Error (Default),\n        \"unsupported-base\": Warning (Default),\n        \"unsupported-bool-conversion\": Error (Default),\n        \"unsupported-operator\": Error (Default),\n        \"useless-overload-body\": Warning (Default),\n        \"zero-stepsize-in-slice\": Error (Default),\n    },\n    terminal: TerminalSettings {\n        output_format: Full,\n        error_on_warning: false,\n    },\n    src: SrcSettings {\n        respect_ignore_files: true,\n        files: IncludeExcludeFilter {\n            include: IncludeFilter(\n                [\n                    \"**\",\n                ],\n                ..\n            ),\n            exclude: ExcludeFilter {\n                ignore: Gitignore(\n                    [\n                        IgnoreGlob {\n                            original: \"**/.bzr/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.direnv/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.eggs/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.git/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.git-rewrite/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.hg/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.mypy_cache/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.nox/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.pants.d/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.pytype/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.ruff_cache/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.svn/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.tox/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/.venv/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/__pypackages__/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/_build/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/buck-out/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/dist/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/node_modules/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                        IgnoreGlob {\n                            original: \"**/venv/\",\n                            is_allow: false,\n                            is_only_dir: true,\n                        },\n                    ],\n                    ..\n                ),\n            },\n        },\n    },\n    overrides: [],\n}\n\nMemory report:\n=======SALSA STRUCTS=======\n`Definition`                                       metadata=19.61MB  fields=27.45MB  count=490263\n`File`                                             metadata=4.29MB   fields=12.68MB  count=66988\n`IntersectionType`                                 metadata=5.12MB   fields=12.01MB  count=91349\n`FunctionType`                                     metadata=2.17MB   fields=10.37MB  count=38676\n`Type < 'db >::class_member_with_policy_::interned_arguments` metadata=9.27MB   fields=7.94MB   count=165453\n`Type < 'db >::is_redundant_with_::interned_arguments` metadata=13.40MB  fields=7.66MB   count=239308\n`Type < 'db >::member_lookup_with_policy_::interned_arguments` metadata=8.52MB   fields=7.31MB   count=152200\n`ClassLiteral < 'db >::implicit_attribute_inner_::interned_arguments` metadata=9.14MB   fields=6.53MB   count=163135\n`UnionType`                                        metadata=5.28MB   fields=5.74MB   count=94251\n`Expression`                                       metadata=11.24MB  fields=5.62MB   count=234096\n`CallableType`                                     metadata=1.37MB   fields=5.04MB   count=24542\n`Type < 'db >::apply_specialization_::interned_arguments` metadata=9.06MB   fields=3.88MB   count=161855\n`Type < 'db >::try_call_dunder_get_::interned_arguments` metadata=4.31MB   fields=3.69MB   count=76932\n`Specialization`                                   metadata=3.38MB   fields=3.58MB   count=60409\n`StringLiteralType`                                metadata=2.59MB   fields=2.56MB   count=46317\n`FileModule`                                       metadata=1.84MB   fields=2.52MB   count=32775\n`TupleType`                                        metadata=1.13MB   fields=1.65MB   count=20203\n`OverloadLiteral`                                  metadata=1.31MB   fields=1.62MB   count=23408\n`place_by_id::interned_arguments`                  metadata=3.73MB   fields=1.43MB   count=71739\n`ScopeId`                                          metadata=2.50MB   fields=1.07MB   count=89254\n`BoundMethodType`                                  metadata=2.03MB   fields=0.87MB   count=36313\n`ClassLiteral < 'db >::try_mro_::interned_arguments` metadata=2.61MB   fields=0.75MB   count=46571\n`GenericAlias`                                     metadata=2.60MB   fields=0.74MB   count=46362\n`ClassLiteral`                                     metadata=0.49MB   fields=0.61MB   count=8681\n`GenericContext`                                   metadata=0.36MB   fields=0.53MB   count=6343\n`BoundTypeVarInstance`                             metadata=1.74MB   fields=0.50MB   count=31023\n`ProtocolInterface`                                metadata=0.18MB   fields=0.40MB   count=3176\n`code_generator_of_class::interned_arguments`      metadata=1.34MB   fields=0.38MB   count=23956\n`ModuleLiteralType`                                metadata=0.94MB   fields=0.36MB   count=18042\n`TypeVarInstance`                                  metadata=0.35MB   fields=0.30MB   count=6214\n`Unpack`                                           metadata=0.26MB   fields=0.21MB   count=6460\n`ModuleNameIngredient`                             metadata=0.20MB   fields=0.19MB   count=3567\n`FunctionLiteral`                                  metadata=1.32MB   fields=0.19MB   count=23546\n`StarImportPlaceholderPredicate`                   metadata=0.26MB   fields=0.18MB   count=9225\n`TypeVarIdentity`                                  metadata=0.20MB   fields=0.15MB   count=3633\n`ExpressionWithContext`                            metadata=0.28MB   fields=0.12MB   count=5053\n`UnionTypeInstance`                                metadata=0.05MB   fields=0.08MB   count=849\n`EnumLiteralType`                                  metadata=0.12MB   fields=0.08MB   count=2186\n`Project`                                          metadata=0.00MB   fields=0.06MB   count=1\n`PatternPredicate`                                 metadata=0.02MB   fields=0.05MB   count=561\n`PropertyInstanceType`                             metadata=0.06MB   fields=0.03MB   count=1013\n`lookup_dunder_new_inner::interned_arguments`      metadata=0.11MB   fields=0.03MB   count=2002\n`BoundSuperType`                                   metadata=0.04MB   fields=0.02MB   count=717\n`is_equivalent_to_object_inner::interned_arguments` metadata=0.09MB   fields=0.02MB   count=1676\n`Program`                                          metadata=0.00MB   fields=0.02MB   count=1\n`ClassLiteral < 'db >::fields_::interned_arguments` metadata=0.03MB   fields=0.01MB   count=500\n`FieldInstance`                                    metadata=0.01MB   fields=0.01MB   count=231\n`InternedType`                                     metadata=0.01MB   fields=0.00MB   count=202\n`BytesLiteralType`                                 metadata=0.00MB   fields=0.00MB   count=51\n`TypeIsType`                                       metadata=0.00MB   fields=0.00MB   count=33\n`NamespacePackage`                                 metadata=0.00MB   fields=0.00MB   count=40\n`NewType`                                          metadata=0.00MB   fields=0.00MB   count=20\n`DataclassParams`                                  metadata=0.00MB   fields=0.00MB   count=19\n`ClassLiteral < 'db >::variance_of_::interned_arguments` metadata=0.00MB   fields=0.00MB   count=44\n`GenericAlias < 'db >::variance_of_::interned_arguments` metadata=0.00MB   fields=0.00MB   count=19\n`FileRoot`                                         metadata=0.00MB   fields=0.00MB   count=2\n`DataclassTransformerParams`                       metadata=0.00MB   fields=0.00MB   count=5\n`ManualPEP695TypeAliasType`                        metadata=0.00MB   fields=0.00MB   count=4\n`DeprecatedInstance`                               metadata=0.00MB   fields=0.00MB   count=16\n`SearchPathIngredient`                             metadata=0.00MB   fields=0.00MB   count=4\n`ModuleResolveModeIngredient`                      metadata=0.00MB   fields=0.00MB   count=3\n`list_modules::interned_arguments`                 metadata=0.00MB   fields=0.00MB   count=1\n`module_type_symbols::interned_arguments`          metadata=0.00MB   fields=0.00MB   count=1\n=======SALSA QUERIES=======\n`semantic_index -> ty_python_semantic::semantic_index::SemanticIndex<'_>`\n    metadata=20.37MB  fields=425.36MB count=5349\n`source_text -> ruff_db::source::SourceText`\n    metadata=1.51MB   fields=198.66MB count=23783\n`FunctionType < 'db >::signature_ -> ty_python_semantic::types::signatures::CallableSignature<'_>`\n    metadata=8.16MB   fields=88.11MB  count=31147\n`infer_definition_types -> ty_python_semantic::types::infer::DefinitionInference<'_>`\n    metadata=85.00MB  fields=57.39MB  count=197488\n`infer_scope_types -> ty_python_semantic::types::infer::ScopeInference<'_>`\n    metadata=24.64MB  fields=53.83MB  count=32740\n`infer_expression_types_impl -> ty_python_semantic::types::infer::ExpressionInference<'_>`\n    metadata=76.21MB  fields=34.79MB  count=145105\n`symbols_for_file_global_only -> ty_ide::symbols::FlatSymbols`\n    metadata=2.37MB   fields=11.56MB  count=22961\n`check_file_impl -> core::result::Result<alloc::boxed::Box<[ruff_db::diagnostic::Diagnostic]>, ruff_db::diagnostic::Diagnostic>`\n    metadata=0.87MB   fields=6.69MB   count=3972\n`ClassLiteral < 'db >::try_mro_ -> core::result::Result<ty_python_semantic::types::mro::Mro<'_>, ty_python_semantic::types::mro::MroError<'_>>`\n    metadata=11.14MB  fields=6.45MB   count=46571\n`Type < 'db >::class_member_with_policy_ -> ty_python_semantic::place::PlaceAndQualifiers<'_>`\n    metadata=42.49MB  fields=5.29MB   count=165453\n`ClassLiteral < 'db >::implicit_attribute_inner_ -> ty_python_semantic::types::member::Member<'_>`\n    metadata=17.52MB  fields=5.22MB   count=163135\n`Type < 'db >::member_lookup_with_policy_ -> ty_python_semantic::place::PlaceAndQualifiers<'_>`\n    metadata=40.95MB  fields=4.87MB   count=152200\n`line_index -> ruff_source_file::line_index::LineIndex`\n    metadata=0.20MB   fields=4.53MB   count=3774\n`infer_deferred_types -> ty_python_semantic::types::infer::DefinitionInference<'_>`\n    metadata=4.28MB   fields=3.24MB   count=6090\n`Type < 'db >::apply_specialization_ -> ty_python_semantic::types::Type<'_>`\n    metadata=15.20MB  fields=2.59MB   count=161855\n`place_by_id -> ty_python_semantic::place::PlaceAndQualifiers<'_>`\n    metadata=6.72MB   fields=2.30MB   count=71739\n`all_narrowing_constraints_for_expression -> core::option::Option<std::collections::hash::map::HashMap<ty_python_semantic::semantic_index::place::ScopedPlaceId, ty_python_semantic::types::Type<'_>, rustc_hash::FxBuildHasher>>`\n    metadata=15.78MB  fields=2.05MB   count=25467\n`Type < 'db >::try_call_dunder_get_ -> core::option::Option<(ty_python_semantic::types::Type<'_>, ty_python_semantic::types::AttributeKind)>`\n    metadata=38.26MB  fields=1.85MB   count=76930\n`FunctionType < 'db >::last_definition_raw_signature_ -> ty_python_semantic::types::signatures::Signature<'_>`\n    metadata=1.26MB   fields=1.81MB   count=8729\n`all_submodule_names_for_package -> core::option::Option<alloc::vec::Vec<ty_python_semantic::module_resolver::module::Module<'_>>>`\n    metadata=2.27MB   fields=1.32MB   count=32469\n`overloads_and_implementation_inner -> (alloc::boxed::Box<[ty_python_semantic::types::function::OverloadLiteral<'_>]>, core::option::Option<ty_python_semantic::types::function::OverloadLiteral<'_>>)`\n    metadata=2.64MB   fields=1.23MB   count=22575\n`FunctionType < 'db >::last_definition_signature_ -> ty_python_semantic::types::signatures::Signature<'_>`\n    metadata=0.85MB   fields=1.05MB   count=4204\n`all_negative_narrowing_constraints_for_expression -> core::option::Option<std::collections::hash::map::HashMap<ty_python_semantic::semantic_index::place::ScopedPlaceId, ty_python_semantic::types::Type<'_>, rustc_hash::FxBuildHasher>>`\n    metadata=4.42MB   fields=0.99MB   count=11360\n`enum_metadata -> core::option::Option<ty_python_semantic::types::enums::EnumMetadata<'_>>`\n    metadata=3.33MB   fields=0.66MB   count=7450\n`suppressions -> ty_python_semantic::suppression::Suppressions`\n    metadata=0.25MB   fields=0.59MB   count=3969\n`infer_unpack_types -> ty_python_semantic::types::unpacker::UnpackResult<'_>`\n    metadata=1.02MB   fields=0.59MB   count=3255\n`infer_expression_type_impl -> ty_python_semantic::types::Type<'_>`\n    metadata=2.97MB   fields=0.56MB   count=35279\n`ClassLiteral < 'db >::fields_ -> indexmap::map::IndexMap<ruff_python_ast::name::Name, ty_python_semantic::types::class::Field<'_>, core::hash::BuildHasherDefault<rustc_hash::FxHasher>>`\n    metadata=0.30MB   fields=0.44MB   count=500\n`imported_modules -> alloc::sync::Arc<std::collections::hash::set::HashSet<ty_python_semantic::module_name::ModuleName, rustc_hash::FxBuildHasher>>`\n    metadata=0.19MB   fields=0.43MB   count=3649\n`inferable_typevars_inner -> std::collections::hash::set::HashSet<ty_python_semantic::types::BoundTypeVarIdentity<'_>, rustc_hash::FxBuildHasher>`\n    metadata=0.25MB   fields=0.42MB   count=4741\n`ClassLiteral < 'db >::try_metaclass_ -> core::result::Result<(ty_python_semantic::types::Type<'_>, core::option::Option<ty_python_semantic::types::function::DataclassTransformerParams<'_>>), ty_python_semantic::types::class::MetaclassError<'_>>`\n    metadata=1.73MB   fields=0.38MB   count=7968\n`parsed_module -> ruff_db::parsed::ParsedModule`\n    metadata=1.81MB   fields=0.38MB   count=23783\n`code_generator_of_class -> core::option::Option<ty_python_semantic::types::class::CodeGeneratorKind<'_>>`\n    metadata=3.31MB   fields=0.29MB   count=23956\n`ClassLiteral < 'db >::explicit_bases_ -> alloc::boxed::Box<[ty_python_semantic::types::Type<'_>]>`\n    metadata=0.72MB   fields=0.26MB   count=8601\n`Type < 'db >::is_redundant_with_ -> bool`\n    metadata=23.96MB  fields=0.24MB   count=239308\n`exported_names -> alloc::boxed::Box<[ruff_python_ast::name::Name]>`\n    metadata=0.02MB   fields=0.23MB   count=269\n`use_def_map -> alloc::sync::Arc<ty_python_semantic::semantic_index::use_def::UseDefMap<'_>>`\n    metadata=0.62MB   fields=0.19MB   count=11843\n`place_table -> alloc::sync::Arc<ty_python_semantic::semantic_index::place::PlaceTable>`\n    metadata=0.99MB   fields=0.17MB   count=19096\n`ClassLiteral < 'db >::decorators_ -> alloc::boxed::Box<[ty_python_semantic::types::Type<'_>]>`\n    metadata=0.55MB   fields=0.14MB   count=7511\n`BoundMethodType < 'db >::into_callable_type_ -> ty_python_semantic::types::CallableType<'_>`\n    metadata=1.53MB   fields=0.09MB   count=11607\n`TupleType < 'db >::to_class_type_ -> ty_python_semantic::types::class::ClassType<'_>`\n    metadata=1.96MB   fields=0.08MB   count=6342\n`ClassLiteral < 'db >::pep695_generic_context_ -> core::option::Option<ty_python_semantic::types::generics::GenericContext<'_>>`\n    metadata=0.69MB   fields=0.07MB   count=8598\n`ClassLiteral < 'db >::inherited_legacy_generic_context_ -> core::option::Option<ty_python_semantic::types::generics::GenericContext<'_>>`\n    metadata=0.67MB   fields=0.07MB   count=8322\n`dunder_all_names -> core::option::Option<std::collections::hash::set::HashSet<ruff_python_ast::name::Name, rustc_hash::FxBuildHasher>>`\n    metadata=0.02MB   fields=0.06MB   count=173\n`lookup_dunder_new_inner -> core::option::Option<ty_python_semantic::place::PlaceAndQualifiers<'_>>`\n    metadata=0.94MB   fields=0.06MB   count=2002\n`symbols_for_file -> ty_ide::symbols::FlatSymbols`\n    metadata=0.00MB   fields=0.06MB   count=18\n`resolve_module_query -> core::option::Option<ty_python_semantic::module_resolver::module::Module<'_>>`\n    metadata=1.72MB   fields=0.04MB   count=3567\n`all_negative_narrowing_constraints_for_pattern -> core::option::Option<std::collections::hash::map::HashMap<ty_python_semantic::semantic_index::place::ScopedPlaceId, ty_python_semantic::types::Type<'_>, rustc_hash::FxBuildHasher>>`\n    metadata=0.08MB   fields=0.04MB   count=395\n`all_narrowing_constraints_for_pattern -> core::option::Option<std::collections::hash::map::HashMap<ty_python_semantic::semantic_index::place::ScopedPlaceId, ty_python_semantic::types::Type<'_>, rustc_hash::FxBuildHasher>>`\n    metadata=0.29MB   fields=0.03MB   count=391\n`file_settings -> ty_project::metadata::settings::FileSettings`\n    metadata=0.29MB   fields=0.03MB   count=3969\n`global_scope -> ty_python_semantic::semantic_index::scope::ScopeId<'_>`\n    metadata=0.20MB   fields=0.03MB   count=3919\n`static_expression_truthiness -> ty_python_semantic::types::Truthiness`\n    metadata=2.86MB   fields=0.03MB   count=30068\n`cached_protocol_interface -> ty_python_semantic::types::protocol_class::ProtocolInterface<'_>`\n    metadata=0.81MB   fields=0.02MB   count=2617\n`ClassLiteral < 'db >::is_typed_dict_ -> bool`\n    metadata=0.98MB   fields=0.01MB   count=8476\n`file_to_module -> core::option::Option<ty_python_semantic::module_resolver::module::Module<'_>>`\n    metadata=0.07MB   fields=0.01MB   count=631\n`ClassLiteral < 'db >::inheritance_cycle_ -> core::option::Option<ty_python_semantic::types::class::InheritanceCycle>`\n    metadata=0.74MB   fields=0.01MB   count=7402\n`TypeVarInstance < 'db >::lazy_bound_ -> core::option::Option<ty_python_semantic::types::TypeVarBoundOrConstraints<'_>>`\n    metadata=0.02MB   fields=0.00MB   count=199\n`ClassType < 'db >::into_callable_ -> ty_python_semantic::types::CallableTypes<'_>`\n    metadata=0.02MB   fields=0.00MB   count=70\n`is_equivalent_to_object_inner -> bool`\n    metadata=0.50MB   fields=0.00MB   count=1676\n`TypeVarInstance < 'db >::lazy_default_ -> core::option::Option<ty_python_semantic::types::Type<'_>>`\n    metadata=0.01MB   fields=0.00MB   count=65\n`module_type_symbols -> smallvec::SmallVec<[ruff_python_ast::name::Name; 8]>`\n    metadata=0.00MB   fields=0.00MB   count=1\n`TypeVarInstance < 'db >::lazy_constraints_ -> core::option::Option<ty_python_semantic::types::TypeVarBoundOrConstraints<'_>>`\n    metadata=0.00MB   fields=0.00MB   count=22\n`dynamic_resolution_paths -> alloc::vec::Vec<ty_python_semantic::module_resolver::path::SearchPath>`\n    metadata=0.00MB   fields=0.00MB   count=3\n`NewType < 'db >::lazy_base_ -> ty_python_semantic::types::newtype::NewTypeBase<'_>`\n    metadata=0.00MB   fields=0.00MB   count=11\n`list_modules_in -> alloc::vec::Vec<ty_python_semantic::module_resolver::module::Module<'_>>`\n    metadata=0.03MB   fields=0.00MB   count=4\n`ClassLiteral < 'db >::variance_of_ -> ty_python_semantic::types::variance::TypeVarVariance`\n    metadata=0.01MB   fields=0.00MB   count=44\n`list_modules -> alloc::vec::Vec<ty_python_semantic::module_resolver::module::Module<'_>>`\n    metadata=0.00MB   fields=0.00MB   count=1\n`GenericAlias < 'db >::variance_of_ -> ty_python_semantic::types::variance::TypeVarVariance`\n    metadata=0.00MB   fields=0.00MB   count=19\n=======SALSA SUMMARY=======\nTOTAL MEMORY USAGE: 1679.69MB\n    struct metadata = 134.94MB\n    struct fields = 137.25MB\n    memo metadata = 479.59MB\n    memo fields = 927.91MB\n```\n\n</p>\n</details> \n\nIt does not prevent me from using ty as it restarts right after the crash.\n\nPS: this has been happening for as long as I remember using ty extension (~ 2 months I believe)\n\n### Version\n\nty 0.0.1-alpha.32 (84a188116 2025-12-05)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1811/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1808",
      "id": 3706886309,
      "node_id": "I_kwDOOje-Bs7c8pil",
      "number": 1808,
      "title": "`unused-ignore-comment` diagnostics are very verbose",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-08T15:30:39Z",
      "updated_at": "2025-12-08T17:27:36Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Two `unused-ignore-comment` diagnostics are enough to take up most of my monitor with my terminal full screen. It feels like the rendering of the autofix doesn't add much on top of what the primary annotation shows:\n\n<details>\n<summary>Screenshot</summary>\n\n<img width=\"1782\" height=\"1716\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/85eb9eba-7b21-495e-a1e9-b62b7a9f3676\" />\n\n</details>\n\nBut if anything, I think I'd actually prefer to keep the autofix rendering and get rid of the primary annotation? It's definitely useful information to know that there is an autofix, and I love that the diff rendering shows me exactly how to fix the diagnostic even I don't want to opt into autofixes.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1808/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1807",
      "id": 3706506113,
      "node_id": "I_kwDOOje-Bs7c7MuB",
      "number": 1807,
      "title": "`random.choice` returns `Unknown`",
      "user": {
        "login": "danielpopescu",
        "id": 3674804,
        "node_id": "MDQ6VXNlcjM2NzQ4MDQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3674804?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/danielpopescu",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-08T13:55:39Z",
      "updated_at": "2026-01-09T03:30:33Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Summary\n\n`e` is `Unknown` in the small function below (as opposed to `float`). Also, `lst` is typed as `list[int|float]` even though is explicitly declared as `list[float]`...\n\n```py\nimport random\n\ndef foo() -> float:\n    lst: list[float] = [1.0, 2.0, 3.0]\n    e = random.choice(lst)\n    return e\n```\n\nhttps://play.ty.dev/40ae51a7-c846-4234-bd3a-53ee633c8280\n\n### Version\n\n0.0.1-alpha.32",
      "closed_by": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1807/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1806",
      "id": 3706285916,
      "node_id": "I_kwDOOje-Bs7c6W9c",
      "number": 1806,
      "title": "Inlay hints for `NewType` definitions are very verbose and somewhat fatuous",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-12-08T12:56:11Z",
      "updated_at": "2025-12-08T16:07:35Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It feels like the inlay hint here is just repeating exactly the same information that can be gleaned without any inlay:\n\n<img width=\"1978\" height=\"234\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/4b2b52b8-a84c-48de-b0d8-bfc09def9492\" />\n\n(The file has `from typing import NewType` at the top of the file.)\n\nCc. @Gankra for inlays",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1806/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1805",
      "id": 3706247557,
      "node_id": "I_kwDOOje-Bs7c6NmF",
      "number": 1805,
      "title": "No error reported from the server when changing ty configuration from a valid setting to an invalid setting",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-12-08T12:45:15Z",
      "updated_at": "2025-12-08T13:23:41Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIf you change ty's configuration from a valid setting to an invalid setting while the server is running, no diagnostic or error message is reported by the server to tell you that your configuration settings are now invalid. In the following video I've opened the `./python/py-fuzzer` directory in VSCode as its own workspace, and I'm trying to change the `environment.python` setting so that ty will pick up the installed dependencies in my virtual environment. I accidentally configure it to `python = \"./venv\"` instead of `python = \"./.venv\"`, but ty doesn't report a diagnostic informing me that this configuration is invalid; it just silently continues to not resolve any of my dependencies. A fresh run of ty from the command line with this broken configuration, meanwhile, immediately reports the error:\n\nhttps://github.com/user-attachments/assets/2960fda2-32d1-4795-9c4b-5ca672b018c4\n\nIf I quit and reopen VSCode, then this message appears:\n\n<img width=\"1220\" height=\"404\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/62dfc591-1939-44a8-a0fb-5529ebcba838\" />\n\nBut there's nothing to indicate that I need to do that if I edit the configuration while the server is running",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1805/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1797",
      "id": 3703918065,
      "node_id": "I_kwDOOje-Bs7cxU3x",
      "number": 1797,
      "title": "Confusing diagnostic for assignment with trailing comma",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-12-07T20:11:36Z",
      "updated_at": "2025-12-07T20:14:51Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://play.ty.dev/2fdc0a03-ef37-44f1-8074-f8558ff7a582\n\n```py\ncoords: tuple[int, int] = (0, 0),\n```\n\n> Object of type `tuple[tuple[Literal[0], Literal[0]]]` is not assignable to `tuple[int, int]` (invalid-assignment) \n\nI ran into this while turning a class into a `@dataclass`, and almost filed a bug about dataclasses not computing assignability correctly... and only while writing this just now did I process that that says `tuple[tuple[...`.\n\nThis message is totally correct (this value prints `((0, 0),)`) but I wonder if we could notice this situation and be like \"hey you have a trailing comma, did you... mean that?\"",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1797/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1795",
      "id": 3703624753,
      "node_id": "I_kwDOOje-Bs7cwNQx",
      "number": 1795,
      "title": "Add a CI job doing randomized daily fuzzing using the py-fuzzer script",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568513779,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkk8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/ci",
          "name": "ci",
          "color": "905251",
          "default": false,
          "description": "Related to internal CI tooling"
        },
        "1": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        },
        "2": {
          "id": 9775918749,
          "node_id": "LA_kwDOOje-Bs8AAAACRrCunQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fuzzer",
          "name": "fuzzer",
          "color": "cf5f2e",
          "default": false,
          "description": "Issues surfaced by fuzzing ty"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-07T15:39:00Z",
      "updated_at": "2025-12-08T17:44:58Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 1,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We currently have a CI job that runs the py-fuzzer script on every ty PR: https://github.com/astral-sh/ruff/blob/285d6410d3dcc0567fee1d72bc46bfe3008af36b/.github/workflows/ci.yaml#L653-L680. However, this CI job always runs ty on the same 1,000 fuzzer seeds each time. It compares the PR branch against `main`, and checks that ty does not introduce any _new_ panics on the first 1,000 seeds compared to the `main` branch.\n\nIdeally ty would be sufficiently panic-free (and stack-overflow-free) that we would be able to add a daily CI job invoking ty on _randomized_ fuzzer seeds. We already have such a CI job for the parser -- the CI job runs the parser on 1,000 randomly selected fuzzer seeds every night, and opens an issue if it found any panics: https://github.com/astral-sh/ruff/blob/main/.github/workflows/daily_fuzz.yaml.\n\nThis issue tracks adding a similar daily CI job for ty.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1795/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1791",
      "id": 3700758273,
      "node_id": "I_kwDOOje-Bs7clRcB",
      "number": 1791,
      "title": "Add inlay hints for infered types on marker special types",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-12-06T01:12:20Z",
      "updated_at": "2025-12-06T01:28:05Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "There are some special types like `Final` and `ClassVar` that are only markers and don't actually affect the type, which means even with a partial type annotation `ty` still does inference (unlike normal generic types like `list` where `x: list` means `list[Any`). It would be nice if there was an inlay hint showing the inferred type on these special statements like how `BasedPyright` does it in VSC:\n\n<img width=\"217\" height=\"32\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/6e4499fc-30f4-4e16-8f3e-9484d26f6ce7\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1791/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1790",
      "id": 3700614763,
      "node_id": "I_kwDOOje-Bs7ckuZr",
      "number": 1790,
      "title": "Add hover info for language keywords",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-05T23:15:17Z",
      "updated_at": "2025-12-06T01:29:47Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "One of my favorite features from rust-analyzer, if you hover over a keyword it shows documentation about that keyword.\n\n<img width=\"872\" height=\"136\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/b9267f07-a440-4fb6-92cd-af83ecf6ae84\" />\n\nThe main place I would find this very helpful in is with `for`/`while` loops and their `else` blocks. I use them just rarely enough I forget the exact semantics, but also go through some headache trying to figure them back out when I need to use them. Having that sort of info available in a hover would be very nice.\n\nThis also helps when learning/picking back up the language. I often go a good stretch of time between using rust, so being able to quickly pull up usage info on the language itself is very nice. I could see that same sort of benefit also translating to python.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1790/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1786",
      "id": 3700177070,
      "node_id": "I_kwDOOje-Bs7cjDiu",
      "number": 1786,
      "title": "Rename does not consider all `def/class` statements when rebinding a name",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-12-05T19:51:36Z",
      "updated_at": "2025-12-05T20:07:26Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI saw #1784 so decided to mess around with renaming a bit, and was able to find this edge case where I think the wrong set of things is being renamed:\n```py\nA = \"\"\nclass A: ...\ndef A(): ...\nprint(A)\n```\n\nThis is a bit of an odd case since it's a top level name rebinding, where the current behavior of ty is inconsistent:\n- Cursor on the `A = \"\"` or `print(A)` renames only those two:\n\n<img width=\"232\" height=\"142\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/28e9d295-8e6c-4181-909e-87174cb9ffca\" />\n\n<img width=\"271\" height=\"136\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/e857b078-c978-45f7-9257-b46929060caf\" />\n\n- Cursor on the `class A` renames the `class A`, `A = \"\"`, and `print(A)`, but not the `def A`:\n\n<img width=\"276\" height=\"146\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/76cacc41-02b8-4192-969b-307018f978fe\" />\n\n- Cursor on the `def A` renames the `def A`, `A = \"\"`, and `print(A)`, but not the `class A`:\n\n<img width=\"261\" height=\"143\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/53b61564-2180-49cb-a617-0ba6c3d6fd34\" />\n\nIdeally ty would not rename a different set of items depending on where you rename from.\n\n(On the playground I couldn't figure out how to enable renaming, but you can still see the same inconsistent set of symbols are considered equivalent by placing the cursor on the different `A`s and seeing which others are highlighted.)\n\n### Version\n\nty VSCode 2025.63.13380910 / playground ef45c97da",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1786/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1781",
      "id": 3699855923,
      "node_id": "I_kwDOOje-Bs7ch1Iz",
      "number": 1781,
      "title": "Server: renaming a property getter should also cause the setter and deleter to be renamed (if they're present)",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-05T18:00:28Z",
      "updated_at": "2025-12-22T12:53:49Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nFor this class:\n\n```py\nclass Foo:\n    @property\n    def bar(self) -> str:\n        return \"baz\"\n    \n    @bar.setter\n    def bar(self, value: str) -> None:\n        pass\n\n    @bar.deleter\n    def bar(self) -> None:\n        pass\n```\n\nIf you have Pylance disabled in VSCode and the ty-vscode extension installed, right-clicking on the first `bar` function and renaming it to `spam` will apply this diff to your code:\n\n```diff\n  class Foo:\n      @property\n-     def bar(self) -> str:\n+     def spam(self) -> str:\n          return \"baz\"\n    \n-     @bar.setter\n+     @spam.setter\n      def bar(self, value: str) -> None:\n          pass\n\n-     @bar.deleter\n+     @spam.deleter\n      def bar(self) -> None:\n          pass\n```\n\nBut if you enable Pylance and do the rename, then this edit is applied instead from the same operation:\n\n```diff\n  class Foo:\n      @property\n-     def bar(self) -> str:\n+     def spam(self) -> str:\n          return \"baz\"\n    \n-     @bar.setter\n-     def bar(self, value: str) -> None:\n+     @spam.setter\n+     def spam(self, value: str) -> None:\n          pass\n\n-     @bar.deleter\n-     def bar(self) -> None:\n+     @spam.deleter\n+     def spam(self) -> None:\n          pass\n```\n\nThe Pylance behaviour is how I would want a property rename to work; the ty behaviour should match that.\n\nFailing tests for this were added in https://github.com/astral-sh/ruff/pull/21810; a fix for this issue should aim to resolve the TODOs added in that PR.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1781/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1780",
      "id": 3699833158,
      "node_id": "I_kwDOOje-Bs7chvlG",
      "number": 1780,
      "title": "Support rewriting relative image URLs to absolute in docstrings?",
      "user": {
        "login": "mflova",
        "id": 67102627,
        "node_id": "MDQ6VXNlcjY3MTAyNjI3",
        "avatar_url": "https://avatars.githubusercontent.com/u/67102627?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mflova",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-12-05T17:41:24Z",
      "updated_at": "2025-12-06T18:53:33Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It would be great if VS Code could render images embedded in Python docstrings, similar to how Pylance currently does.\n\nAs a reference, Pylance currently supports:\n- Absolute paths (via `file://`)\n- Web-based URLs\n\nIt does not support relative paths, as discussed here: [Pylance issue #7755](https://github.com/microsoft/pylance-release/issues/7755).\n\nIs this something that must be done at the level of ty-vscode? Or does it have to be implemented somewhere else? Thanks!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1780/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1779",
      "id": 3699300696,
      "node_id": "I_kwDOOje-Bs7cftlY",
      "number": 1779,
      "title": "[completions] Rank symbols with the appropriate type higher after `except <CURSOR>` and `raise <EXPR> from <CURSOR>`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-05T15:00:44Z",
      "updated_at": "2025-12-05T15:00:44Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Similar to what we did for `raise <CURSOR>` in https://github.com/astral-sh/ruff/pull/21571:\n\n- The type of a symbol after `except` must be assignable to `type[BaseException] | tuple[type[BaseException], ...]`\n- The type of a symbol after `raise <EXPR> from` must be assignable to `BaseException | type[BaseException] | None`",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1779/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1778",
      "id": 3699299152,
      "node_id": "I_kwDOOje-Bs7cftNQ",
      "number": 1778,
      "title": "Consider specializing multiple `ParamSpec` using a common behavioral supertype",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-12-05T15:00:13Z",
      "updated_at": "2025-12-05T15:01:14Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "> Just as with traditional `TypeVars`, a user may include the same `ParamSpec` multiple times in the arguments of the same function, to indicate a dependency between multiple arguments. In these cases a type checker may choose to solve to a common behavioral supertype (i.e. a set of parameters for which all of the valid calls are valid in both of the subtypes), but is not obligated to do so.\n>\n> Ref: https://typing.python.org/en/latest/spec/generics.html#semantics\n\nhttps://github.com/astral-sh/ruff/pull/21445 does not add this functionality but it seems good to have.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1778/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1777",
      "id": 3699284010,
      "node_id": "I_kwDOOje-Bs7cfpgq",
      "number": 1777,
      "title": "Use signature of `__init_subclass__` of superclasses to inform keyword-argument completion suggestions inside class definitions",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-12-05T14:55:35Z",
      "updated_at": "2025-12-05T23:05:47Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In this snippet, the class definition `Bar` will fail because `Foo.__init_subclass__` states that subclasses must provide the `special_keyword` keyword argument when you inherit from `Foo`:\n\n```py\nclass Foo:\n    def __init_subclass__(cls, special_keyword):\n        pass\n\nclass Bar(Foo): ...\n```\n\nThe definition of `Bar` must instead be:\n\n```py\nclass Bar(Foo, special_keyword=42): ...\n```\n\nor similar. We could look at the `__init_subclass__` signatures of classes already in the class definition to inform autocomplete suggestions for keyword arguments in this context.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1777/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1776",
      "id": 3699266304,
      "node_id": "I_kwDOOje-Bs7cflMA",
      "number": 1776,
      "title": "[completions] Rank symbols with class-literal types higher inside class declarations",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-05T14:49:50Z",
      "updated_at": "2025-12-05T14:49:50Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "`NotImplementedError` and `NotADirectoryError` should be ranked higher than `NotImplemented` here, because it is invalid to inherit from `NotImplemented` -- `NotImplemented` is not a class\n\n<img width=\"1358\" height=\"768\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/1b90f5d0-cc8f-4cea-b06a-886c1a38f33b\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1776/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1773",
      "id": 3699193054,
      "node_id": "I_kwDOOje-Bs7cfTTe",
      "number": 1773,
      "title": "No completions offered for `import importlib; x = importlib.machi<CURSOR>`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-05T14:28:04Z",
      "updated_at": "2025-12-08T13:07:33Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I would expect auto-import to offer a completion here that would automatically add an `import importlib.machinery` import to the top of the module. But no completions are offered at all currently:\n\n```py\nimport importlib\nx = importlib.machin<CURSOR>\n```\n\nCc. @BurntSushi ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1773/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1771",
      "id": 3698914066,
      "node_id": "I_kwDOOje-Bs7cePMS",
      "number": 1771,
      "title": "Teach the `SymbolVisitor` about more statements and expressions that can define symbols",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-05T13:03:19Z",
      "updated_at": "2025-12-05T13:03:19Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The `SymbolVisitor` in the ty_ide crate is much less exhaustive than the `ExportFinder` in the ty_python_semantic crate:\n- It does not recognise that `type X = int` defines a symbol `X`\n- It does not recognise that `for x in range(42)` defines a symbol `x`\n- It does not recognise that `case bar:` in a `match` statement will define a symbol `bar`\n- It does not recognise that `with expr as whatever` will define a symbol `whatever`\n- It does not recognise that `(y := []).append(42)` defines a symbol `y`\n- (There are more)\n\nMost of these are edge cases that won't usually occur in the global scope in well-written Python code. But some of them (e.g. the `type X = int` case) are reasonable things that could well occur in well-written code. And the most important thing here, in my opinion, is for the two crates to have a consistent understanding of which symbols will be potentially imported by a `*` import. Currently `ty_python_semantic` does a much more rigorous job here at attempting to emulate the runtime semantics.\n\nCc. @BurntSushi ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1771/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1764",
      "id": 3697707878,
      "node_id": "I_kwDOOje-Bs7cZotm",
      "number": 1764,
      "title": "Support dynamic import library such as gstreamer python binding",
      "user": {
        "login": "hermeschen1116",
        "id": 108386417,
        "node_id": "U_kgDOBnXYcQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/108386417?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/hermeschen1116",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-05T06:42:57Z",
      "updated_at": "2025-12-06T04:52:10Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nMy project using gstreamer python binding under pygobject. And it uses dynamic import and ty always throws out unresolve-import.\n\nI import the gstreamer lib as below, ty can only resolve gi.\n\n```python\nfrom __future__ import annotations\n\n\nimport gi\n\n\ngi.require_version(\"Gst\", \"1.0\")\nfrom gi.repository import Gst  \n\n\nGst.init(None)\n```\n\nAnd the diagnostics\n\n```shell\nINFO Defaulting to python-platform `darwin`\nINFO Python version: Python 3.12, platform: darwin\nINFO Indexed 1 file(s) in 0.004s\nerror[unresolved-import]: Module `gi.repository` has no member `Gst`\n  --> src/stream_server/internal/stream/_GStreamer.py:15:27\n   |\n14 | gi.require_version(\"Gst\", \"1.0\")\n15 | from gi.repository import Gst\n   |                           ^^^\n   |\ninfo: rule `unresolved-import` is enabled by default\n\nFound 1 diagnostic\n```\n\nMore specific\n\n```shell\n2025-12-05 14:41:50.24026 DEBUG Version: 0.0.1-alpha.31 (51c73d687 2025-12-04)\n2025-12-05 14:41:50.246054 DEBUG Architecture: aarch64, OS: macos, case-sensitive: case-insensitive\n2025-12-05 14:41:50.246275 DEBUG Searching for a project in '/Users/hermeschen/Repo/work/stream-server'\n2025-12-05 14:41:50.248244 DEBUG Resolving requires-python constraint: `>=3.12`\n2025-12-05 14:41:50.248307 DEBUG Resolved requires-python constraint to: 3.12\n2025-12-05 14:41:50.248328 DEBUG Project without `tool.ty` section: '/Users/hermeschen/Repo/work/stream-server'\n2025-12-05 14:41:50.248345 DEBUG Searching for a user-level configuration at `/Users/hermeschen/.config/ty/ty.toml`\n2025-12-05 14:41:50.252741 INFO Defaulting to python-platform `darwin`\n2025-12-05 14:41:50.252925 DEBUG Resolving `VIRTUAL_ENV` environment variable: /Users/hermeschen/Repo/work/stream-server/.venv\n2025-12-05 14:41:50.252973 DEBUG Attempting to parse virtual environment metadata at '/Users/hermeschen/Repo/work/stream-server/.venv/pyvenv.cfg'\n2025-12-05 14:41:50.253426 DEBUG Searching for site-packages directory in sys.prefix /Users/hermeschen/Repo/work/stream-server/.venv\n2025-12-05 14:41:50.253803 DEBUG Resolved site-packages directories for this virtual environment are: [\"/Users/hermeschen/Repo/work/stream-server/.venv/lib/python3.12/site-packages\"]\n2025-12-05 14:41:50.254202 DEBUG Searching for real stdlib directory in sys.prefix /Users/hermeschen/.local/share/uv/python/cpython-3.12.12-macos-aarch64-none\n2025-12-05 14:41:50.254209 DEBUG Resolved real stdlib path for this virtual environment is: /Users/hermeschen/.local/share/uv/python/cpython-3.12.12-macos-aarch64-none/lib/python3.12\n2025-12-05 14:41:50.254214 DEBUG Including `.` and `./src` in `environment.root` because a `./src` directory exists\n2025-12-05 14:41:50.254424 DEBUG Adding first-party search path `/Users/hermeschen/Repo/work/stream-server/src`\n2025-12-05 14:41:50.254428 DEBUG Adding first-party search path `/Users/hermeschen/Repo/work/stream-server`\n2025-12-05 14:41:50.254432 DEBUG Using vendored stdlib\n2025-12-05 14:41:50.25609 DEBUG Adding site-packages search path `/Users/hermeschen/Repo/work/stream-server/.venv/lib/python3.12/site-packages`\n2025-12-05 14:41:50.256109 INFO Python version: Python 3.12, platform: darwin\n2025-12-05 14:41:50.256525 DEBUG Adding new file root '/Users/hermeschen/Repo/work/stream-server/.venv/lib/python3.12/site-packages' of kind LibrarySearchPath\n2025-12-05 14:41:50.259387 DEBUG Adding new file root '/Users/hermeschen/Repo/work/stream-server' of kind Project\n2025-12-05 14:41:50.260043 DEBUG Setting included paths: 1\n2025-12-05 14:41:50.260047 DEBUG Reloading files for project `stream-server`\n2025-12-05 14:41:50.260082 DEBUG Starting main loop\n2025-12-05 14:41:50.260087 DEBUG Waiting for next main loop message.\n2025-12-05 14:41:50.260151 DEBUG Checking all files in project 'stream-server'\n2025-12-05 14:41:50.265314 INFO Indexed 1 file(s) in 0.005s\n2025-12-05 14:41:50.266975 DEBUG Checking file '/Users/hermeschen/Repo/work/stream-server/src/stream_server/internal/stream/_GStreamer.py'\n2025-12-05 14:41:50.287359 DEBUG Resolving dynamic module resolution paths\n2025-12-05 14:41:50.309481 DEBUG Module `gi.repository.Gst` not found in search paths\n2025-12-05 14:41:50.309511 DEBUG Module `gi.repository.Gst` not found while looking in parent dirs\n2025-12-05 14:41:50.317814 DEBUG Checking all files took 0.052s\n```\n\n\n\n### Version\n\nty 0.0.1-alpha.31 (51c73d687 2025-12-04)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1764/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1762",
      "id": 3696693080,
      "node_id": "I_kwDOOje-Bs7cVw9Y",
      "number": 1762,
      "title": "Type `type[str]` does not match asserted type `<class 'str'>`",
      "user": {
        "login": "jorenham",
        "id": 6208662,
        "node_id": "MDQ6VXNlcjYyMDg2NjI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6208662?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jorenham",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "1": {
          "id": 8645345133,
          "node_id": "LA_kwDOOje-Bs8AAAACA01_bQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type-inference",
          "name": "type-inference",
          "color": "442A97",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 23,
      "created_at": "2025-12-04T21:33:58Z",
      "updated_at": "2025-12-23T00:21:49Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nhttps://play.ty.dev/a1ec52be-d9dd-4210-b4a6-d5854393201b\n\n```py\nfrom typing import assert_type\n\nassert_type(str, type[str])  # ❌\nassert_type(type(\"\"), type[str])  # ❌\nassert_type(\"\".__class__, type[str])  # ❌\n```\n\n```\nType `type[str]` does not match asserted type `<class 'str'>` (type-assertion-failure) [Ln 3, Col 1]\nType `type[str]` does not match asserted type `<class 'str'>` (type-assertion-failure) [Ln 4, Col 1]\nType `type[str]` does not match asserted type `<class 'str'>` (type-assertion-failure) [Ln 5, Col 1]\n```\n\neh?\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1762/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1760",
      "id": 3695519632,
      "node_id": "I_kwDOOje-Bs7cRSeQ",
      "number": 1760,
      "title": "Auto-import should treat `__all__` as invalid if it references a symbol that does not exist",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-04T16:54:20Z",
      "updated_at": "2025-12-04T16:54:20Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Ref https://github.com/astral-sh/ruff/pull/21779/files/d314aa859dcf9a6ffb006a594d7ca0431dd4fab2#r2589451722\n\nFor example, consider this `foo.py`:\n\n```python\n__all__ = ['__all__', 'TRICKSY']\n```\n\nAnd this `test.py`:\n\n```python\nfrom foo import *\nTRICKSY = 1\n```\n\nEven though `foo.py`'s `__all__` value is technically valid for `test.py`, `TRICKSY` itself does not exist in `foo.py`. This means `from foo import *` will fail at runtime.\n\nWe don't recognize this in auto-import, which means we'll offer an import for `TRICKSY` from `test.py`. But importing from `test.py` will result in a runtime error. So we probably shouldn't offer the import.\n\n(I think this is a low priority issue. And we should be careful about how we go about this, because if we get the check wrong and treat `__all__` as invalid when it is valid, we'll get the exported interface of a module wrong. That could be worse than potentially offering an incorrect import in the rare case that `__all__` is itself incorrect. So the decision here might indeed to leave the status quo be.)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1760/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1759",
      "id": 3695309375,
      "node_id": "I_kwDOOje-Bs7cQfI_",
      "number": 1759,
      "title": "LSP doesn't really understand `DefinitionKind::ImportFromSubmodule`",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-04T16:02:54Z",
      "updated_at": "2026-01-09T04:11:25Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis covers the implicit `subpkg = mypackage.subpkg` local assignment that `from .subpkg.whatever import blah` creates in an `__init__.py`.\n\nIn https://github.com/astral-sh/ruff/pull/21793 I added several tests for this and marked the bad results as `TODO(submodule-imports)`\n\n✅ goto-type and hover work great, because they're just asking the inference engine or correctly using the fact that hovering the LHS of import-from is always modules.\n\n🆗  goto-declaration mostly works, there's one \"hmm what SHOULD this do\" case and one \"oh I think we're just seeing broken handling of imports writ-large\" \n\n~~The span is overly broad. This is because the `Definition` actually claims the entire `from..import..` AST node. Unfortunately even if we made it only claim the LHS Identifier it would still be overly broad (`from .x.y` would highlight `x.y` instead of just `x`). So either way the LSP probably wants to special-case the span here.~~ (fixed in https://github.com/astral-sh/ruff/pull/21795)\n\n❌ find-references/rename doesn't really understand it at all.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1759/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1758",
      "id": 3695284435,
      "node_id": "I_kwDOOje-Bs7cQZDT",
      "number": 1758,
      "title": "Auto-import should probably union `__all__` definitions in some cases",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-04T15:55:59Z",
      "updated_at": "2025-12-04T15:55:59Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Ref: https://github.com/astral-sh/ruff/pull/21779/files/d314aa859dcf9a6ffb006a594d7ca0431dd4fab2#r2586995420\n\nSpecifically, the auto-import AST scanner will assume that all conditionals are true. This could lead to some symbols not being declared as exported when they ought to be.\n\nInstead, we might consider preferring false positives to false negatives by unioning `__all__` definitions in such cases. We might suggest some things incorrectly, but thisis probably better than _not_ suggesting correct symbols.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1758/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1757",
      "id": 3695232449,
      "node_id": "I_kwDOOje-Bs7cQMXB",
      "number": 1757,
      "title": "`object.attr` completions should respect `__all__` more strictly",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-04T15:42:37Z",
      "updated_at": "2025-12-04T15:42:37Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Consider this `main.py`:\n\n```\nimport bar\nbar.ZQ<CURSOR>\n```\n\nAnd this `bar.py`:\n\n```\nZQZQ1 = 1\nZQZQ2 = 1\n__all__ = ['ZQZQ1']\n```\n\nhttps://github.com/astral-sh/ruff/pull/21779 made auto-import _strictly_ respect `__all__`. But our `object.attr` completions are looser and still expose symbols that aren't part of `__all__`.\n\nI phrased the title of this issue prescriptively, but perhaps it's wrong. We could choose to make `object.attr` completions _intentionally_ looser with respect to how it handles `__all__` than auto-import. We could also make it a setting.\n\nI'm personally inclined to start strict, and then maybe loosen it up in response to user demand.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1757/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1756",
      "id": 3695199157,
      "node_id": "I_kwDOOje-Bs7cQEO1",
      "number": 1756,
      "title": "Completions should be more discriminating with symbols in stub files",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8614537247,
          "node_id": "LA_kwDOOje-Bs8AAAACAXdoHw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/stubs",
          "name": "stubs",
          "color": "006b75",
          "default": false,
          "description": "issues with understanding stub (pyi) files"
        },
        "2": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-04T15:33:50Z",
      "updated_at": "2025-12-04T15:39:21Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This came up [here](https://github.com/astral-sh/ruff/pull/21779/files/d314aa859dcf9a6ffb006a594d7ca0431dd4fab2#r2586899735).\n\n@carljm said:\n\n> I think this is the right call for Python files, but I'm not sure about stubs / typeshed. I think in the case of stubs we maybe shouldn't auto-complete non-re-exported names at all? But not totally sure, and it's not a question that has to be answered in this PR.\n\nAnd @AlexWaygood said:\n\n> You should assume that most names in a stub also exist at runtime.\n> \n> Private names in a stub (starting with a single underscore) are often things that do not in fact exist at runtime. But you can't impose a blanket rule that private names in stubs should never be considered unexported, because there are things like `os._exit` that are very much public API. The underscore there is to warn users that it's a very dangerous API to use.\n> \n> You can however have very high confidence that private names in stubs that define type aliases, protocols, type variables or typed dicts will not in fact exist at runtime. You can also have high confidence that most imported items will not exist at runtime: anything imported that is not included in `__all__`, does not refer to a submodule of the current package, and does not use the redundant alias convention. Lastly, anything decorated with `@type_check_only` in a stub file will not exist at runtime.\n\nAnd also:\n\n> I do think Carl is correct here that we should not offer `ZQZQ` as an attribute completion here at all if it's `foo.pyi` instead of `foo.py`. In the type checker, if `foo` is defined as a `pyi` file then I don't think we consider `foo` to have a `ZQZQ` attribute at all, because it's been defined in the `foo` module using an import that wasn't an explicit re-export. Stubs often import many things in modules even though they don't exist in those modules at runtime; it's often necessary to do so in order to annotate the public interfaces of those modules.\n\nWe should revise our completions to make sure we respect conventions with respect to stub files specifically.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1756/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1754",
      "id": 3694869029,
      "node_id": "I_kwDOOje-Bs7cOzol",
      "number": 1754,
      "title": "Auto-import should have some rudimentary support for evaluating conditionals",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 7,
      "created_at": "2025-12-04T14:10:50Z",
      "updated_at": "2026-01-05T14:46:11Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "At present, auto-import assumes all conditionals are always true. This means it will return symbols that may not be available in the current environment.\n\nAuto-import likely can't be as good as ty itself here since we want to avoid bringing in type machinery for this. But perhaps we can cover some obvious cases like:\n\n```python\nif True: ...\nif False: ...\nif sys.version_info >= (3, 12): ...\nif TYPE_CHECKING: ...\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1754/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1749",
      "id": 3691985568,
      "node_id": "I_kwDOOje-Bs7cDzqg",
      "number": 1749,
      "title": "fix priority of namespace vs non-namespace packages",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-03T21:33:45Z",
      "updated_at": "2025-12-03T21:37:36Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Consider a directory structure like this:\n\n```\npath-one/\n   mod/\n      sub1.py\npath-two/\n   mod/\n      __init__.py\n      sub2.py\n```\n\nWhere `path-one` and `path-two` are both import-search-path entries, in that order (e.g. `PYTHONPATH=path-one:path-two\"` should make this happen both for ty and at runtime).\n\nAt runtime, a non-namespace package _anywhere on the search path_ takes precedence over a namespace package. This means that with the above setup, `import mod.sub1` fails. Despite being first on the search path, `path-one/mod` is never considered as a candidate for the `mod` package, because `path-two/mod/__init__.py` exists.\n\nGiven `import mod` in the above scenario, we do prefer `path-two/mod/__init__.py` over the `path-one/mod` namespace package. But we wrongly allow `import mod.sub1` to succeed, resolving to the `path-one` namespace package.\n\nIn this particular case, that might seem harmless, but it can cause us to import the wrong thing in some scenarios, and it can lead to some very odd inconsistencies with relative imports, documented in `import/workspaces.md`. Allowing imports of modules in the \"should be ignored\" namespace package to just fail would allow our \"desperate resolution\" to kick in (for imports within that \"should be ignored\" namespace package) and actually give more consistent behavior.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1749/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1747",
      "id": 3691692428,
      "node_id": "I_kwDOOje-Bs7cCsGM",
      "number": 1747,
      "title": "Consider disallowing forward references to non-global names in `__future__.annotations` (for compatibility)",
      "user": {
        "login": "BHSPitMonkey",
        "id": 33672,
        "node_id": "MDQ6VXNlcjMzNjcy",
        "avatar_url": "https://avatars.githubusercontent.com/u/33672?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BHSPitMonkey",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 12,
      "created_at": "2025-12-03T19:58:15Z",
      "updated_at": "2025-12-22T17:59:59Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nExamples: https://play.ty.dev/e6628610-7be6-4090-82ca-d1cadf92e85f\n\nBeginning with the `alpha.28` release (and still happening as of `alpha.30`), ty emits `invalid-type-form` for valid types that happen to share a name with an instance method.\n\nExample involving the `set` builtin:\n\n```python\nclass Foo:\n  def set(self) -> None:\n    pass\n\n  def bar(self) -> set[int]:  # invalid-type-form\n    return {1, 2, 3}\n\n  def baz(self) -> set:       # invalid-type-form\n    return {\"hello\", \"world\"}\n```\n\n```\nInvalid subscript of object of type `def set(self) -> None` in type expression\nVariable of type `def set(self) -> None` is not allowed in a type expression\n```\n\nExample using a non-builtin type:\n\n```python\nfrom datetime import datetime\n\nclass Foo:\n  def datetime(self) -> None:\n    pass\n\n  def maybe_return_date(self) -> datetime | None:  # invalid-type-form\n    return None\n```\n\n```\nVariable of type `def datetime(self) -> None` is not allowed\n```\n\n### Version\n\nty 0.0.1-alpha.28, ty 0.0.1-alpha.29, ty 0.0.1-alpha.30",
      "closed_by": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1747/reactions",
        "total_count": 2,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1746",
      "id": 3691651143,
      "node_id": "I_kwDOOje-Bs7cCiBH",
      "number": 1746,
      "title": "Support `typing.Unpack`",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-03T19:43:52Z",
      "updated_at": "2025-12-11T10:43:40Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 3,
        "total_blocking": 3
      },
      "body": null,
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1746/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1742",
      "id": 3690068612,
      "node_id": "I_kwDOOje-Bs7b8fqE",
      "number": 1742,
      "title": "Support for attrs private fields",
      "user": {
        "login": "pwuertz",
        "id": 1819283,
        "node_id": "MDQ6VXNlcjE4MTkyODM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1819283?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/pwuertz",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592544541,
          "node_id": "LA_kwDOOje-Bs8AAAACACfTHQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/dataclasses",
          "name": "dataclasses",
          "color": "1d76db",
          "default": false,
          "description": "Issues relating to dataclasses and dataclass_transform"
        },
        "1": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-03T12:38:14Z",
      "updated_at": "2025-12-26T11:56:00Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIn `attrs`, the generated `__init__` method takes values for private fields using their non-underscore names. Their reasoning is that the inputs to `__init__` for initializing private fields are public:\n\nhttps://www.attrs.org/en/stable/init.html#private-attributes-and-aliases\n\n> the default behavior of attrs is that if you specify a member that starts with an underscore, it will strip the underscore from the name when it creates the __init__ method signature\n\nSo this code is correct, but `ty` doesn't know that the init signature is `__init__(self, a: int)`, not `__init__(self, _a: int)`:\n```python\nimport attrs\n\n@attrs.define\nclass X:\n    _a: int\n\n# ty: error[missing-argument]: No argument provided for required parameter `_a`\n# ty: error[unknown-argument]: Argument `a` does not match any known parameter\nX(a=42)\n```\n\n### Version\n\nty 0.0.1-alpha.28",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1742/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1739",
      "id": 3689340938,
      "node_id": "I_kwDOOje-Bs7b5uAK",
      "number": 1739,
      "title": "Support construction of objects based on generic implicit/PEP-613 type aliases",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-03T09:37:21Z",
      "updated_at": "2025-12-10T16:58:54Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We should support construction of objects based on (some) generic implicit/PEP-613 type aliases:\n\n```py\nfrom typing import TypeVar\n\nT = TypeVar(\"T\")\nMyList = list[T]\n\nxs = MyList(range(10))  # no error here\nreveal_type(xs)  # ideally `list[int]` or `list[int | Unknown]`\n```\nhttps://play.ty.dev/ec67de22-349a-4861-b075-d48a52e6bae4",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1739/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1738",
      "id": 3689108995,
      "node_id": "I_kwDOOje-Bs7b41YD",
      "number": 1738,
      "title": "Support self-referential generic implicit/PEP-613 type aliases",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 9807383197,
          "node_id": "LA_kwDOOje-Bs8AAAACSJDKnQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20aliases",
          "name": "type aliases",
          "color": "ebd684",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "mtshiba",
          "id": 45118249,
          "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
          "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mtshiba",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-03T08:40:12Z",
      "updated_at": "2025-12-26T12:25:43Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We currently handle self-referential generic implicit (and PEP 613) type aliases by [falling back to `Divergent`](https://github.com/astral-sh/ruff/blob/f4e4229683936a486f689aebb9d7d06b3985952d/crates/ty_python_semantic/resources/mdtest/implicit_type_aliases.md?plain=1#L1532-L1548). This prevents infinite recursion and false positive diagnostics, but we should properly support them. For example, this should be an error, but currently is not:\n```py\nfrom typing import TypeVar\n\nT = TypeVar(\"T\")\nNestedDict = dict[str, \"NestedDict[T]\"]\n\nn: NestedDict[int] = {\"foo\": b\"wrong\"}\n```\n\nAn example case where this is relied on in typeshed is the annotation for the second argument to `isinstance`, which is a recursive tuple-of-tuples. Currently we don't catch the type error in `isinstance(None, (int, None))` (though we do catch it in `isinstance(None, None)`), due to not fully supporting the recursion.\n\n(Note: we [already support this](https://play.ty.dev/22eb39cd-098f-4b84-80e9-70bc088740d5) for PEP 695 type aliases)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1738/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1737",
      "id": 3689026091,
      "node_id": "I_kwDOOje-Bs7b4hIr",
      "number": 1737,
      "title": "Support generic \"manual\" PEP 695 type aliases",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "1": {
          "id": 9807383197,
          "node_id": "LA_kwDOOje-Bs8AAAACSJDKnQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20aliases",
          "name": "type aliases",
          "color": "ebd684",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "sharkdp",
          "id": 4209276,
          "node_id": "MDQ6VXNlcjQyMDkyNzY=",
          "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/sharkdp",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-03T08:19:19Z",
      "updated_at": "2025-12-19T12:12:02Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Support generic PEP 695 aliases if they are manually constructed via `TypeAliasType(…)`:\n\n```py\nfrom typing import TypeAliasType, TypeVar, reveal_type\n\nK = TypeVar(\"K\")\nV = TypeVar(\"V\")\n\nMyDict = TypeAliasType(\"MyDict\", dict[K, V], type_params=(K, V))\n\n\ndef _(x: MyDict[str, int]):\n    reveal_type(x)  # should be: dict[str, int]\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1737/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1734",
      "id": 3687911196,
      "node_id": "I_kwDOOje-Bs7b0Q8c",
      "number": 1734,
      "title": "Improve diagnostics for failed reverse resolution (file-to-module) and failed submodule resolution with namespace packages",
      "user": {
        "login": "winterqt",
        "id": 78392041,
        "node_id": "MDQ6VXNlcjc4MzkyMDQx",
        "avatar_url": "https://avatars.githubusercontent.com/u/78392041?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/winterqt",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 10,
      "created_at": "2025-12-02T23:47:46Z",
      "updated_at": "2025-12-03T19:02:13Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nGiven the following directory structure:\n```\nnixos/lib/test-driver/src\n├── extract-docstrings.py\n├── pyproject.toml\n└── test_driver\n    ├── debug.py\n    ├── driver.py\n    ├── errors.py\n    ├── __init__.py\n    ├── logger.py\n    ├── machine\n    │   ├── __init__.py\n    │   ├── ocr.py\n    │   └── qmp.py\n    ├── polling_condition.py\n    ├── py.typed\n    └── vlan.py\n```\n(ty is given access to just this directory, as `/build/src`, nothing else is relevant)\n\n`ty` fails to resolve imports from `machine/__init__.py`: https://gist.github.com/winterqt/3f554709d2ba72999acc70714570535a\n\nI've tried changing the name of this directory from `src`, and also adding `./test_driver` as a root. Curiously enough, if I add `./test_driver/machine` as a root, I get a hint telling me to try removing the `.` from the imports, so ty can detect them properly in some instances.\n\nI'm not sure why \"could not resolve file `/build/src/test_driver/machine/__init__.py` to a module (try adjusting configured search paths?)\" would be happening given the above working case, so entirely possible this is user error.\n\n### Version\n\nty 0.0.1-alpha.29",
      "closed_by": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1734/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1733",
      "id": 3687685499,
      "node_id": "I_kwDOOje-Bs7bzZ17",
      "number": 1733,
      "title": "ty doesnt respect UV_PROJECT_ENVIRONMENT or `uv run`, leading it to incorrectly claim `unresolved-import`",
      "user": {
        "login": "brycedrennan",
        "id": 1217531,
        "node_id": "MDQ6VXNlcjEyMTc1MzE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1217531?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/brycedrennan",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "zanieb",
        "id": 2586601,
        "node_id": "MDQ6VXNlcjI1ODY2MDE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2586601?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zanieb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "zanieb",
          "id": 2586601,
          "node_id": "MDQ6VXNlcjI1ODY2MDE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/2586601?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/zanieb",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-02T21:57:22Z",
      "updated_at": "2026-01-09T19:19:29Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In a docker image, when `UV_PROJECT_ENVIRONMENT=/usr/local`, `ty` cannot resolve third-party imports even though `uv run python` can import them just fine.\n\nThe use case is having uv install into vanilla python docker images and then running the type checker against code in that image.\n\nI see in previous discussion that we dont want to complicate `ty` with all the logic of finding the right python installation, but I would have expected `uv run` to have solved that such that `uv run ty` \"just works\"\n\nAlso note that `ty` is not respecting the environment that it's installed into. This is contrary to a [recent comment:](https://github.com/astral-sh/ty/issues/684#issuecomment-3533238411) \n> We now respect the Python environment that ty itself is installed in\n\n**Repro**\n```bash\ndocker build -t ty-bug-repro .\n\n# ty claims unresolved import:\ndocker run --rm ty-bug-repro uv run ty check\n# error[unresolved-import]: Cannot resolve imported module `requests`\n\ndocker run --rm ty-bug-repro ty check\n# error[unresolved-import]: Cannot resolve imported module `requests`\n\n# But Python import works:\ndocker run --rm ty-bug-repro uv run main.py\n# /usr/local/lib/python3.11/site-packages/requests/__init__.py\n```\n\n**Dockerfile:**\n```dockerfile\nFROM python:3.11-slim\nCOPY --from=ghcr.io/astral-sh/uv:latest /uv /bin/\nENV UV_PROJECT_ENVIRONMENT=/usr/local\nWORKDIR /app\nCOPY . .\nRUN uv sync \n```\n\n**pyproject.toml:**\n```toml\n[project]\nname = \"ty-bug-repro\"\nversion = \"0.1.0\"\nrequires-python = \">=3.11\"\ndependencies = [\"requests\", \"ty\"]\n```\n\n**main.py:**\n```python\nimport requests\nprint(requests.__file__)\n```\n \n\n**Workarounds**\nI don't love any of these. Mostly because every other command in my makefile is identical for local dev vs running in my docker image.\n\n**1. Set PYTHONPATH:**\n```dockerfile\nENV PYTHONPATH=/usr/local/lib/python3.11/site-packages\n```\n\n**2. Pass --python to ty:**\n```bash\nty check --python /usr/local/bin/python3\n```\n\n**3. Fake a venv:**\n```dockerfile\nENV VIRTUAL_ENV=/usr/local\nRUN printf \"home = /usr/local/bin\\nversion = 3.11\\n\" > /usr/local/pyvenv.cfg\n```\n\n**4. Suppress the error**\n```toml\n[tool.ty.rules]\nunresolved-import = \"ignore\"\n```\n\n### Version\n\n0.0.1-alpha.29",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1733/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1732",
      "id": 3687426056,
      "node_id": "I_kwDOOje-Bs7byagI",
      "number": 1732,
      "title": "Fix spurious unions of generics from fixpoint iteration",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8645345133,
          "node_id": "LA_kwDOOje-Bs8AAAACA01_bQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type-inference",
          "name": "type-inference",
          "color": "442A97",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-12-02T20:25:25Z",
      "updated_at": "2025-12-12T08:20:17Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 1,
        "percent_completed": 100
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When we fixpoint-iterate a cycle, we union the resulting types at each iteration with the previous iteration, to ensure monotonicity.\n\nThis has an unfortunate side effect when the types involved are invariant generics or generics specialized with dynamic types; in those cases the unions don't simplify, and this can lead to undesired behavior. See for example the TODO `unsupported-base` errors in `mdtest/generics/legacy/classes.md`, or the TODOs for spurious unions with Divergent added in `call/methods.md` in https://github.com/astral-sh/ruff/pull/21551. These can both occur in reasonably common cases and show up in the ecosystem.\n\n(The latter TODOs might also be resolvable by fixing https://github.com/astral-sh/ty/issues/1729 to eliminate the seemingly-unnecessary cycle.)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1732/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1731",
      "id": 3687386952,
      "node_id": "I_kwDOOje-Bs7byQ9I",
      "number": 1731,
      "title": "Implement rust-analyzer's \"Click for full compiler diagnostic\" feature",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-02T20:12:11Z",
      "updated_at": "2025-12-03T05:07:02Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Rust-analyzer has a great feature in VSCode that I use _extensively_ when writing Rust, where you can click to see the full compiler diagnostic in a new tab:\n\nhttps://github.com/user-attachments/assets/7c14c7d6-46ea-4716-9f05-4df032cdc913\n\nWould it be possible for ty to implement something similar?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1731/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1730",
      "id": 3687301365,
      "node_id": "I_kwDOOje-Bs7bx8D1",
      "number": 1730,
      "title": "Prefer more-nested path when reverse-resolving file to module name and search paths overlap",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-12-02T19:42:48Z",
      "updated_at": "2026-01-09T09:45:58Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Sometimes we might have overlapping search paths, where the outer path (say `.`) is a higher-priority search path than the inner path (say `./src`). If a file inside `./src` (say `./src/foo/bar.py`) does `from . import baz`, we currently reverse-resolve the module name of `./src/foo/bar.py` as `src.foo.bar` (rather than `foo.bar`) and then import `./src/foo/baz.py` as the module name `src.foo.baz`.\r\n\r\nIt would be better if we always preferred the inner, or more precise, matching search path instead. So `./src/foo/bar.py` would then reverse-resolve to the module name `foo.bar` (instead of `src.foo.bar`), even though `.` comes before `./src` in the search paths. And then our relative import would import `foo.baz` instead of `src.foo.baz`.\r\n\r\nSee https://github.com/astral-sh/ty/issues/1682#issuecomment-3603223786 for more on how this relates to runtime behavior.\r\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1730/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1728",
      "id": 3687212849,
      "node_id": "I_kwDOOje-Bs7bxmcx",
      "number": 1728,
      "title": "remove inferred bivariance",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-02T19:11:23Z",
      "updated_at": "2025-12-02T19:11:23Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We infer bivariance when it is sound to do so; that is, when a type variable is unused in the body of a class:\n\n```py\nclass C[T]:\n    pass\n```\n\nSince this type variable is unused, any specialization of `C` is equivalent to any other specialization -- it does not matter how you specialize `C`. In other words, `C` is bivariant in `T`.\n\nSo our behavior here is correct. But it is confusing, and not useful. We repeatedly run into issues in our test suite where we accidentally make a class bivariant in a typevar and then tests pass for the wrong reason, or fail unexpectedly, since bivariance is not intuitive (covariance is the intuitive expectation).\n\nWe should at least emit a diagnostic when we infer a typevar as bivariant (since it indicates the typevar is useless and could just be removed). And we should probably also go ahead and just infer the typevar as covariant in that case.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1728/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1724",
      "id": 3686635898,
      "node_id": "I_kwDOOje-Bs7bvZl6",
      "number": 1724,
      "title": "Duplicate suggestions for already imported \"unimported\" completions",
      "user": {
        "login": "MatthewMckee4",
        "id": 119673440,
        "node_id": "U_kgDOByISYA",
        "avatar_url": "https://avatars.githubusercontent.com/u/119673440?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MatthewMckee4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "BurntSushi",
          "id": 456674,
          "node_id": "MDQ6VXNlcjQ1NjY3NA==",
          "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/BurntSushi",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-02T16:33:09Z",
      "updated_at": "2026-01-09T15:24:30Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI guess we do no filtering to remove duplicates.\n\n<img width=\"480\" height=\"238\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/6b685833-4674-41be-ba64-db3331e11188\" />\n\nI would expect not to see `TypeVar (import typing)` here.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1724/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1721",
      "id": 3685997269,
      "node_id": "I_kwDOOje-Bs7bs9rV",
      "number": 1721,
      "title": "\"Find all references\" Fails to find references to `UserDict` in homeassistant",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-02T14:00:38Z",
      "updated_at": "2026-01-10T16:28:40Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nNot sure what the issue is but navigate to `collections.UserDict`, then click go to references. ty doesn't return any references outside `collections` even though it is used in some places within homeassistant\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1721/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1720",
      "id": 3685976877,
      "node_id": "I_kwDOOje-Bs7bs4st",
      "number": 1720,
      "title": "Cache/parallelize find references",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-02T13:54:46Z",
      "updated_at": "2025-12-31T15:37:59Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Finding common references, e.g. like finding all references for `asyncio` can be slow in a large project like homeassistant. We should speed that up by:\n\n* Can we cache some intermediate steps so that subsequent find references are faster\n* Use multithreading\n\nIdeally, I think we would do both",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1720/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1719",
      "id": 3685925714,
      "node_id": "I_kwDOOje-Bs7bssNS",
      "number": 1719,
      "title": "Add a `static_assert_eq` mdtest helper",
      "user": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        },
        "1": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-12-02T13:42:23Z",
      "updated_at": "2025-12-02T16:09:09Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We have a `static_assert` function in `ty_extensions`, which takes in a `bool` (or a value that can be coerced to a `bool`). https://github.com/astral-sh/ruff/pull/21743 recently updated several tests to use a `static_assert(actual == expected)` pattern. If that fails, all that we can show is the value that was expected to be `True`. @sharkdp suggested an analogous `static_assert_eq`, which would perform the same test, but which would be able to print out a nicer diagnostic in case the test fails.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1719/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1718",
      "id": 3685892062,
      "node_id": "I_kwDOOje-Bs7bsj_e",
      "number": 1718,
      "title": "Support `yield`",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8645345133,
          "node_id": "LA_kwDOOje-Bs8AAAACA01_bQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type-inference",
          "name": "type-inference",
          "color": "442A97",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-12-02T13:34:21Z",
      "updated_at": "2025-12-02T18:53:03Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Stop inferring `Todo` for:\n\n```py\nasync def test():\n    a = yield 10\n\n```\n\nhttps://github.com/astral-sh/ruff/blob/7b1e530a6d424c967588ffdffac89b3d5924c88c/crates/ty_python_semantic/src/types/infer/builder.rs#L8420\n\nhttps://play.ty.dev/f25888e2-1782-469d-9e60-4367d30452a8",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1718/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1717",
      "id": 3685182936,
      "node_id": "I_kwDOOje-Bs7bp23Y",
      "number": 1717,
      "title": "Zed: Unclear where to find the logs when ty crashes",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-12-02T10:29:38Z",
      "updated_at": "2025-12-02T11:50:16Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "<img width=\"493\" height=\"68\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/72b314e1-ec03-4a1b-b2bf-ef6c4884a946\" />\n\nIt's unclear to users where to find the logs. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1717/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1714",
      "id": 3683338484,
      "node_id": "I_kwDOOje-Bs7bi0j0",
      "number": 1714,
      "title": "support generic protocols in typevar solving",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "1": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-01T23:45:54Z",
      "updated_at": "2025-12-28T01:56:27Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 5,
        "completed": 2,
        "percent_completed": 40
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": null,
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1714/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1711",
      "id": 3682981987,
      "node_id": "I_kwDOOje-Bs7bhdhj",
      "number": 1711,
      "title": "split type-expression inference from value-expression inference",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "1": {
          "id": 9807383197,
          "node_id": "LA_kwDOOje-Bs8AAAACSJDKnQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20aliases",
          "name": "type aliases",
          "color": "ebd684",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-12-01T21:39:42Z",
      "updated_at": "2025-12-19T12:11:57Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Many of our problems with understanding implicit type aliases (particularly generic ones) are ultimately based in our conflation of value types and type-expression types for names. Many of these problems would be solved by separating these. This would mean eliminating `Type::in_type_expression`. When we see a name used in a type expression, rather than resolving its type as a value expression and trying to re-interpret that type as a type expression, we could instead go through a separate resolution path for that name to resolve \"what it means as a type expression.\" This means that the RHS of an implicit type alias would be inferred twice, once as a value expression (in order to catch any runtime-invalid operations performed in it) and separately also (assuming it is ever used in a type expression) as a type expression.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1711/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1709",
      "id": 3681552765,
      "node_id": "I_kwDOOje-Bs7bcAl9",
      "number": 1709,
      "title": "imports from non-terminating modules silently resolved as Never",
      "user": {
        "login": "zilto",
        "id": 68975210,
        "node_id": "MDQ6VXNlcjY4OTc1MjEw",
        "avatar_url": "https://avatars.githubusercontent.com/u/68975210?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zilto",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8677454701,
          "node_id": "LA_kwDOOje-Bs8AAAACBTdzbQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/unreachable-code",
          "name": "unreachable-code",
          "color": "666666",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 7,
      "created_at": "2025-12-01T15:29:14Z",
      "updated_at": "2025-12-05T16:10:17Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI'm getting new type errors when upgrading from `0.0.1a21` to `0.0.1a22`. Some light code change on my end make the type-checker pass, but I'm unsure if my code or `ty` is incorrect.\n\n## Setup\nI'm using `ty` across two libraries, so I'm trying to have a reduced example, but I didn't try the following repro\n\n### From the main library (can't edit this code)\n```python\n# library/destinations/implementations/foo/factory.py\nclass Destination(abc.ABC, Generic[Config, Client]): ...\n\nclass foo(Destination[FooConfig, FooClient]): ...\n``` \n\n```python\n# library/destinations/__init__.py\nfrom library.destinations.impl.foo.factory import foo\n\n__all__ = [\"foo\"]\n```\n### From the downstream library (can edit this code)\nIn `0.0.1a21`, the following code passes all checks (`ty check`)\n```python\nimport library\n\ndef create_destination() -> library.destinations.foo:\n   return library.destinations.foo(...)\n```\nIn `0.0.1a22`, the code fails with\n```shell\ndef create_destination() -> Generator[library.destinations.foo, None, None]:\n                                                                    ^^^^^^^^^^^^^^^^^^^\ninfo: rule `invalid-type-form` is enabled by default\n```\n\nThis fixes it\n```python\nimport library\nfrom library.destinations import foo\n\ndef create_destination() -> foo:\n   return library.destinations.foo(...)\n```\n\n\n### Version\n\n0.0.1a22",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1709/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1708",
      "id": 3681320766,
      "node_id": "I_kwDOOje-Bs7bbH8-",
      "number": 1708,
      "title": "Log a warning message if we can detect that ty Python version doesn't match active environment Python version",
      "user": {
        "login": "alex",
        "id": 772,
        "node_id": "MDQ6VXNlcjc3Mg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/772?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/alex",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 14,
      "created_at": "2025-12-01T14:39:37Z",
      "updated_at": "2025-12-03T22:12:38Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIn pyca/cryptography we have code like:\n\n```py\nif sys.version_info >= (3, 11):\n    import tomllib\nelse:\n    import tomli as tomllib\n```\n\nThis produces errors like:\n\n```\nerror[unresolved-import]: Cannot resolve imported module `tomli`\n  --> noxfile.py:21:12\n   |\n19 |     import tomllib\n20 | else:\n21 |     import tomli as tomllib\n   |            ^^^^^^^^^^^^^^^^\n22 |\n23 | nox.options.reuse_existing_virtualenvs = True\n   |\ninfo: Searched in the following paths during module resolution:\ninfo:   1. /Users/alex_gaynor/projects/cryptography/src (first-party code)\ninfo:   2. /Users/alex_gaynor/projects/cryptography (first-party code)\ninfo:   3. vendored://stdlib (stdlib typeshed stubs vendored by ty)\ninfo:   4. /Users/alex_gaynor/projects/cryptography/.nox/flake/lib/python3.14/site-packages (site-packages)\ninfo:   5. /Users/alex_gaynor/projects/cryptography/vectors (editable install)\ninfo: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment\ninfo: rule `unresolved-import` is enabled by default\n```\n\nAs far as I can tell what's happening is: `ty` is in a Python 3.14 venv, so `tomli` isn't installed. However, `ty` infers that it should run for Python 3.8 from my project's `requires-python`.\n\nTherefore it type-checks the `import tomli` path and is said that the package isn't installed.\n\nI'm not _quite_ sure what the right behavior is, but the current behavior is perplexing and its not clear how to fix :-)\n\n### Version\n\nty 0.0.1-alpha.29 (0c3cae494 2025-11-28)",
      "closed_by": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1708/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1704",
      "id": 3680809446,
      "node_id": "I_kwDOOje-Bs7bZLHm",
      "number": 1704,
      "title": "Inverse tree query",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-12-01T12:36:37Z",
      "updated_at": "2025-12-02T11:59:56Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Implement a salsa query that, given a file, returns an index that allows querying the ancestor chain of any given node. \n\nBeing able to retrieve the ancestors (or parents) is often required when:\n\n* generating fixes\n* In LSP methods, e.g. `CoveringNode` is all about having a node + its ancestor chain\n\n\nThe easiest solution is to build a `ParentMap` that stores an `IndexVec<NodeId, NodeId>`: the index is the node, and the value is its parent. This should be very fast to build, but requires `O(n)` storage. It might be possible to store the information in a more condensed form by using the information that the ids are assigned pre-order (the ids of children are always larger than the parent, I think we do something similar for `scopes` in the `SemanticIndex`\n\n\nThe new data structure should provide methods to:\n\n* get a node's parent\n* get a node's ancestor\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1704/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1703",
      "id": 3680582968,
      "node_id": "I_kwDOOje-Bs7bYT04",
      "number": 1703,
      "title": "typevar solver can't solve a generic union",
      "user": {
        "login": "suleymanozkeskin",
        "id": 75538999,
        "node_id": "MDQ6VXNlcjc1NTM4OTk5",
        "avatar_url": "https://avatars.githubusercontent.com/u/75538999?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/suleymanozkeskin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-12-01T11:37:57Z",
      "updated_at": "2025-12-05T20:11:13Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n# Summary\n\nIncomplete type narrowing with `TypeIs` on generic types after early return\n\n## Description\n\nType narrowing fails for **generic types** when using a `TypeIs` type guard with an early return pattern. Pyright correctly narrows the type in this scenario, but `ty` does not. The issue does **not** occur with simple (non-generic) classes.\n\n## Minimal Reproducible Example\n\n```python\n# exp.py\nfrom typing import Union, Generic, TypeVar\nfrom typing_extensions import TypeIs\n\nT = TypeVar('T', covariant=True)\nE = TypeVar('E', covariant=True)\n\n\nclass Ok(Generic[T]):\n    def __init__(self, value: T):\n        self._value = value\n    \n    @property\n    def ok_value(self) -> T:\n        return self._value\n    \n    def is_err(self) -> bool:\n        return False\n\n\nclass Err(Generic[E]):\n    def __init__(self, error: E):\n        self._error = error\n    \n    @property\n    def err_value(self) -> E:\n        return self._error\n    \n    def is_err(self) -> bool:\n        return True\n\n\nResult = Union[Ok[T], Err[E]]\n\n\ndef is_err(result: Result[T, E]) -> TypeIs[Err[E]]:\n    \"\"\"Type guard to check if a result is an Err\"\"\"\n    return result.is_err()\n\n# ------------------------------------------------------------\n\ndef some_function() -> Result[int, Exception]:\n    condition = False\n    if condition is False:\n        return Err(Exception(\"Test error\"))\n    return Ok(1)\n\ndef use_some_function():    \n    result = some_function()\n    \n    if is_err(result):\n        print(result.err_value)\n        return None\n\n    # After the is_err() check and early return,\n    # result should be narrowed to Ok[int]\n    okay = result.ok_value  # <- ty reports warning here\n    print(okay)\n```\n\n## Expected Behavior\n\nAfter the `if is_err(result): return None` check, `result` should be narrowed to `Ok[int]`, making `result.ok_value` valid without warnings.\n\n## Actual Behavior\n\n```bash\nuv run ty check exp.py\nwarning[possibly-missing-attribute]: Attribute `ok_value` may be missing on object of type `(Ok[int] & ~Err[Unknown]) | (Err[Exception] & ~Err[Unknown])`\n  --> exp.py:57:12\n   |\n55 |     # After the is_err() check and early return,\n56 |     # result should be narrowed to Ok[int]\n57 |     okay = result.ok_value  # <- ty reports warning here\n   |            ^^^^^^^^^^^^^^^\n58 |     print(okay)\n   |\ninfo: rule `possibly-missing-attribute` is enabled by default\n```\n\n## Comparison with Pyright\n\nPyright correctly handles this pattern with 0 errors, 0 warnings for both generic and non-generic types.\n\n- Simple classes with `TypeIs`: Works correctly in both `ty` and Pyright\n- Generic classes with `TypeIs`: Fails in `ty`, works in Pyright\n\n## Notes\n\n- Pattern matching (`match`/`case`) works correctly in both type checkers, even with generics\n- The issue specifically occurs when combining:\n  1. Generic types (e.g., `Union[Ok[T], Err[E]]`)\n  2. `TypeIs` type guards\n  3. Early return control flow\n- Type narrowing appears to be incomplete when the type guard eliminates one branch of a generic union\n\n## Environment\n\n- `ty` version: 0.0.1a29\n- Python version: 3.13\n\n\n### Version\n\n0.0.1a29",
      "closed_by": {
        "login": "suleymanozkeskin",
        "id": 75538999,
        "node_id": "MDQ6VXNlcjc1NTM4OTk5",
        "avatar_url": "https://avatars.githubusercontent.com/u/75538999?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/suleymanozkeskin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1703/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1701",
      "id": 3680454864,
      "node_id": "I_kwDOOje-Bs7bX0jQ",
      "number": 1701,
      "title": "Use decorated function as type context when inferring decorator expression (or more aggressively promote literals in decorators)",
      "user": {
        "login": "patrick91",
        "id": 667029,
        "node_id": "MDQ6VXNlcjY2NzAyOQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/667029?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/patrick91",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-12-01T11:04:15Z",
      "updated_at": "2025-12-02T02:35:09Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nNot sure if the title is descriptive enough, anyway, I have this decorator:\n\n```python\nfrom typing import Literal\nfrom collections.abc import AsyncGenerator, Callable\n\n\ndef decorator[Item](\n    message: Item,\n) -> Callable[[Callable[[], AsyncGenerator[Item]]], Callable[[], AsyncGenerator[Item]]]:\n    def inner(fn: Callable[[], AsyncGenerator[Item]]) -> Callable[[], AsyncGenerator[Item]]:\n        return fn\n    return inner\n```\n\nWhen I try to use and pass a message, the inferred type is too narrow, see:\n\n```python\n@decorator(message=\"hello\")\nasync def my_generator() -> AsyncGenerator[Literal[\"hello\"]]:\n    yield \"hello\"\n\n# this one fails with:\n# Argument is incorrect: Expected `() -> AsyncGenerator[Literal[\"hello\"], None]`, found `def my_generator2() -> AsyncGenerator[str, None]` (invalid-argument-type) [Ln 18, Col 1]\n@decorator(message=\"hello\")\nasync def my_generator2() -> AsyncGenerator[str]:\n    yield \"world\"\n```\n\nI also tried with this, but I get the same output 😊\n\n```python\nmessage: str = \"hello\"\n\n@decorator(message=message)\nasync def my_generator3() -> AsyncGenerator[str]:\n    yield \"world\"\n```\n\nhttps://play.ty.dev/67bbea2d-a7d1-40a9-bce6-fa6787129244\n\n### Version\n\nty 0.0.1-alpha.29 (0c3cae494 2025-11-28)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1701/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1691",
      "id": 3678602496,
      "node_id": "I_kwDOOje-Bs7bQwUA",
      "number": 1691,
      "title": "Output file configuration option",
      "user": {
        "login": "kieran-ryan",
        "id": 5904340,
        "node_id": "MDQ6VXNlcjU5MDQzNDA=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5904340?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/kieran-ryan",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568526506,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlWqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-design",
          "name": "needs-design",
          "color": "F9D0C4",
          "default": false,
          "description": "Needs further design before implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-11-30T23:26:28Z",
      "updated_at": "2025-12-29T12:57:28Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Provide a `--output-file` configuration option - matching `ruff` - to specify file to output the linter output rather than the user handling through other means. Standardises configuration across Astral toolchains.\n\n```yaml\nTy Check:\n  script:\n    - ty check --output-format=gitlab --output-file=code-quality-report.json\n  artifacts:\n    reports:\n      codequality: $CI_PROJECT_DIR/code-quality-report.json\n```\n\n```yaml\nRuff Check:\n  script:\n    - ruff check --output-format=gitlab --output-file=code-quality-report.json\n  artifacts:\n    reports:\n      codequality: $CI_PROJECT_DIR/code-quality-report.json\n```\n\nRelated https://github.com/astral-sh/ruff/pull/21706.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1691/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1686",
      "id": 3677498456,
      "node_id": "I_kwDOOje-Bs7bMixY",
      "number": 1686,
      "title": "Behaviour of Any subclasses when mocking final classes",
      "user": {
        "login": "hauntsaninja",
        "id": 12621235,
        "node_id": "MDQ6VXNlcjEyNjIxMjM1",
        "avatar_url": "https://avatars.githubusercontent.com/u/12621235?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/hauntsaninja",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-11-30T07:53:42Z",
      "updated_at": "2025-12-02T03:00:01Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nhttps://play.ty.dev/758115b1-501a-4a59-9cff-5e4de80fab1c\n\n```py\nfrom typing import Any, final\n\nclass Mock(Any): ...\n\ndef takes_bool(x: bool): ...\ntakes_bool(Mock())\n\nclass AX: ...\ndef takes_ax(x: AX): ...\ntakes_ax(Mock())\n\n@final\nclass FX: ...\ndef takes_fx(x: FX): ...\ntakes_fx(Mock())\n```\n\nI guess I understand why ty is doing the thing it is currently doing, but curious how you would spell this kind of pattern in a way that works for ty (maybe the answer is just pull out `if TYPE_CHECKING`?)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1686/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1682",
      "id": 3676920374,
      "node_id": "I_kwDOOje-Bs7bKVo2",
      "number": 1682,
      "title": "Should `PYTHONPATH` search paths have a lower priority than first-party search paths? Should `./src` be considered a non-first-party search path?",
      "user": {
        "login": "adamjstewart",
        "id": 12021217,
        "node_id": "MDQ6VXNlcjEyMDIxMjE3",
        "avatar_url": "https://avatars.githubusercontent.com/u/12021217?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/adamjstewart",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 14,
      "created_at": "2025-11-29T16:55:26Z",
      "updated_at": "2025-12-02T19:43:32Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nTesting out ty for the first time and found that it doesn't support relative imports?\n\nSteps to reproduce:\n```console\n> git clone https://github.com/torchgeo/torchgeo.git\n> cd torchgeo\n> pip install .\n> ty check\nerror[unresolved-import]: Cannot resolve imported module `.agrifieldnet`\n --> torchgeo/datamodules/__init__.py:6:7\n  |\n4 | \"\"\"TorchGeo datamodules.\"\"\"\n5 |\n6 | from .agrifieldnet import AgriFieldNetDataModule\n  |       ^^^^^^^^^^^^\n7 | from .bigearthnet import BigEarthNetDataModule\n8 | from .bright import BRIGHTDFC2025DataModule\n  |\ninfo: Searched in the following paths during module resolution:\ninfo:   1. .../lib/python3.13/site-packages (extra search path specified on the CLI or in your config file)\ninfo:   2. .../lib/python3.13/site-packages (extra search path specified on the CLI or in your config file)\ninfo:   3. .../lib/python3.13/site-packages (extra search path specified on the CLI or in your config file)\ninfo:   4. /Users/Adam/torchgeo (first-party code)\ninfo:   5. vendored://stdlib (stdlib typeshed stubs vendored by ty)\ninfo: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment\ninfo: rule `unresolved-import` is enabled by default\n...\n```\nPossibly related to https://github.com/astral-sh/ty/issues/839, although in my case, there are no invalid module names anywhere in my path all the way to root (`/Users/Adam/torchgeo`). Based on that conversation, I'm guessing that relative imports normally are expected to work most of the time, hence why I'm opening an issue.\n\nNote that I currently have no custom configuration for ty. Let me know if a default `--project` is required for relative import support.\n\n@isaaccorley\n\n### Version\n\nty 0.0.1-alpha.29",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1682/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1681",
      "id": 3676907311,
      "node_id": "I_kwDOOje-Bs7bKScv",
      "number": 1681,
      "title": "Add diagnostic warning about unsound subclassing of `order=True` dataclasses",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592544541,
          "node_id": "LA_kwDOOje-Bs8AAAACACfTHQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/dataclasses",
          "name": "dataclasses",
          "color": "1d76db",
          "default": false,
          "description": "Issues relating to dataclasses and dataclass_transform"
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-29T16:38:07Z",
      "updated_at": "2025-11-30T15:46:08Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It's unsound to subclass an `order=True` dataclass, because the generated comparison methods raise an exception if you try to compare an instance of the subclass with an instance of the superclass:\n\n```py\nfrom dataclasses import dataclass\n\n@dataclass(order=True)\nclass F:\n    x: int\n\nclass G(F): ...\n\nG(42) < F(42)  # exception raised here at runtime, but cannot detected by ty\n```\n\nWe should detect attempts to subclass `order=True` dataclasses and warn users about the unsoundness (emitting a diagnostic at the point where `G` is defined). We could recommend that they use `functools.total_ordering` instead to generate their comparison methods, as `total_ordering` doesn't have the same problem.\n\n(One way of describing the problem here is that the design of the stdlib feature violates the Liskov Substitution Principle.)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1681/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1680",
      "id": 3676886567,
      "node_id": "I_kwDOOje-Bs7bKNYn",
      "number": 1680,
      "title": "Add CI check that asserts autofixes and code actions do not introduce invalid syntax",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        },
        "1": {
          "id": 9026616990,
          "node_id": "LA_kwDOOje-Bs8AAAACGgc-ng",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fixes",
          "name": "fixes",
          "color": "aaaaaa",
          "default": false,
          "description": null
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-29T16:09:26Z",
      "updated_at": "2025-11-29T16:09:26Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Ruff has a CI check that fails if any autofixes introduce invalid syntax. But our CI doesn't fail currently if a ty autofix or code action introduces invalid syntax. This will become much more important if we add a `--fix` CLI option (or `ty fix` command, etc.).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1680/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1679",
      "id": 3676882148,
      "node_id": "I_kwDOOje-Bs7bKMTk",
      "number": 1679,
      "title": "Show suggested fixes when rendering diagnostics on the CLI",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "2": {
          "id": 9026616990,
          "node_id": "LA_kwDOOje-Bs8AAAACGgc-ng",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fixes",
          "name": "fixes",
          "color": "aaaaaa",
          "default": false,
          "description": null
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-11-29T16:03:05Z",
      "updated_at": "2025-12-02T07:49:09Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For example, we now offer an IDE autofix for this snippet that will correct `\"naem\"` to `\"name\"`:\n\n```py\nfrom typing import TypedDict\n\nclass Person(TypedDict):\n    name: str\n\ndef f(p: Person):\n    print(p[\"naem\"])\n```\n\nThis autofix is [also included in our test snapshots](https://github.com/astral-sh/ruff/blob/594b7b04d3b04bcf42861f86207017c8117678ca/crates/ty_python_semantic/resources/mdtest/snapshots/typed_dict.md_-_%60TypedDict%60_-_Diagnostics_(e5289abf5c570c29).snap#L239-L255) now. However, we don't render the suggested fix on the CLI yet:\n\n<img width=\"1166\" height=\"416\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/8ac271e7-2566-4c2b-9691-ac866bbe3ea1\" />\n\nEven if the user does not want the autofix automatically applied when they invoke `ty check` on their code, the suggested fix can be very helpful in informing the user how they might fix the problem, so we should show it.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1679/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1676",
      "id": 3676870327,
      "node_id": "I_kwDOOje-Bs7bKJa3",
      "number": 1676,
      "title": "Add diagnostic warning against shadowing a submodule name in `__init__.py`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-29T15:46:23Z",
      "updated_at": "2025-11-29T15:46:41Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "If you do something like this, it significantly increases the likelihood that ty will get confused when resolving the type of the attribute `a.b` when `a` has been imported in another module (should it be resolved to `Literal[42]` or `<module 'a.b'>`?:\n\n````md\n`a/__init__.py`:\n\n```py\nb = 42\n```\n\n`a/b.py`:\n\n```py\n```\n````\n\nI think it would be helpful to our users if we emitted a diagnostic when a symbol is defined in an `__init__.py` file that shadows the name of a submodule. In rare occasions, there might be a good reason for doing this, but in those situations you could easily just disable the warning for that `__init__.py` file in particular.\n\nA common reason for shadowing submodules like this is to actually prohibit users from importing the submodule -- that can be done if you first import the submodule in `__init__.py`, and then override it later on in `__init__.py`. We should therefore consider:\n1. Skipping the warning if the submodule has a name beginning with a single underscore (this is the convention to mark a submodule as private)\n2. State in the diagnostic message for the warning that the user could consider renaming their submodule so that it starts with a leading underscore",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1676/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1675",
      "id": 3676864333,
      "node_id": "I_kwDOOje-Bs7bKH9N",
      "number": 1675,
      "title": "No diagnostic reported for bad use of `@override` if the method has other decorators too",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-11-29T15:38:23Z",
      "updated_at": "2025-12-01T23:20:06Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Similar to #1674. We do not currently issue a complaint about this snippet, but pyre (the predecessor to pyrefly, and the reference implementation for PEP 698) [does](https://pyre-check.org/play?input=from%20typing%20import%20override%0Afrom%20functools%20import%20lru_cache%0A%0Aclass%20Bar%3A%0A%20%20%20%20%40override%0A%20%20%20%20%40lru_cache%0A%20%20%20%20def%20method(self%2C%20x%3A%20int)%20-%3E%20None%3A%20...):\n\n```py\nfrom typing import override\nfrom functools import lru_cache\n\nclass Bar:\n    @override\n    @lru_cache\n    def method(self, x: int) -> None: ...\n```\n\nThe reason why we issue no complaint is that the `lru_cache` decorator transforms the function definition into an instance of `_lru_cache_wrapper`. We currently only recognise methods as being `@override` if they have `Type::FunctionLiteral` types in our internal model, so the transformation into an instance of `_lru_cache_wrapper` means that we \"forget\" that the method was decorated with `@override`. To fix this issue, we may need to treat the `@override` decorator more like a type qualifier that \"survives\" the transformations from a function-literal type to a callable type and then to an `_lru_cache_wrapper` type.\n\nMypy [also issues a diagnostic](https://mypy-play.net/?mypy=latest&python=3.12&gist=4cae2098f63f2cc2a361bf8ea6da0cae) on this snippet. At time of writing, neither [pyright](https://pyright-play.net/?pyrightVersion=1.1.405&pythonVersion=3.12&reportUnreachable=true&code=GYJw9gtgBALgngBwJYDsDmUkQWEMpgBuApiCEgCbEBQokUwArigMYxhgA2Azptrvk4hGAfRYBDFgAsa1Fp3HdeAIXEgAXNSjaoAASKlyVLTt1DRE6TR1QqwKBGIwpYCgApuxTsAA0UAB7qmCgwAJRQALQAfFAAcmAoxEEAdKnUQA) nor [pyrefly](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEALqcROgOZ0Q3G6UN2R0qKAB10YavTABXdAGMGuXFDiduvflErSA%2BnNRyAFjDFi5UVHFUAxJYjF1HdAAJbd%2BoyfROXg4Q6dMGDA6GhgGQ1xMAAo4GCgwABo6fEROdAYASjoAWgA%2BOgA5XHQYNMIK03kLKzoAIVRKaNtcTPtvJ1dtPQNjAMcgkLCIqNj4pJS01izcguLS8sr0EESQaQZoOBJyRBAAYjoAVQ2oCCYBWQUIErgqwYFeGlQGHXRpGmwYJtT0mfy6OAMSjtHyUcLSSjeMAiECFd6fYF0YD4AC%2BMLEKxAZDBYCgpEIihoUAoBwACqQcXiARgcAQ6HISpA2BDntd0IQxAcAMowGB0QwMBjEOCIAD0ouxwTxhF4bFFMHQoswuDkcFFDPEEGZlFZJVFD0odFQADdUNBUNhYPTGVqWRsSnRcMR7egtmIyCN0DljV84Gy6ABeOgwgDMhAAjAAmdHLFGrAwbH3WaAwChoLB4IhkEAooA) do, however. Note that pyright has an [open issue from a user](https://github.com/microsoft/pyright/issues/11130) that requests this feature.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1675/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1674",
      "id": 3676855809,
      "node_id": "I_kwDOOje-Bs7bKF4B",
      "number": 1674,
      "title": "No diagnostics reported for override of `@final` method if the method has other decorators too",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-11-29T15:28:20Z",
      "updated_at": "2025-12-01T23:26:01Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Similar to #1675. We currently issue no complaint about this snippet, for example, but mypy (the reference implementation for PEP 591) [does](https://mypy-play.net/?mypy=latest&python=3.12&gist=b4d60bd1cba3c19d627d0ff6144aa2c9):\n\n```py\nfrom typing import final\nfrom functools import lru_cache\n\nclass Foo:\n    @lru_cache\n    @final\n    def method(self, x: int) -> None: ...\n\nclass Bar(Foo):\n    @lru_cache\n    def method(self, x: int) -> None: ...\n```\n\nThe reason why we issue no complaint is that the `lru_cache` decorator transforms the function definition into an instance of `_lru_cache_wrapper`. We currently only recognise methods as being `@final` if they have `Type::FunctionLiteral` types in our internal model, so the transformation into an instance of `_lru_cache_wrapper` means that we \"forget\" that the method was decorated with `@final`. To fix this issue, we may need to treat the `@final` decorator more like a type qualifier that \"survives\" the transformations from a function-literal type to a callable type and then to an `_lru_cache_wrapper` type.\n\nPyright [also emits a diagnostic about this override](https://pyright-play.net/?pyrightVersion=1.1.405&pythonVersion=3.12&reportUnreachable=true&code=GYJw9gtgBALgngBwJYDsDmUkQWEMrCoCGANgFCiQECuKAxjGGCQM6ba74kjUD6dROgAsApmTJ0SRFmwBiTAFxkoKqAAFufAcLGr1hFKWWqAJiOBQIImELAmAFCxElgAGigAPBZhQwAlFAAtAB8UAByYCgi3gB0ceKS0mwAQkQg9vJgfkp6Gjz8gqLGKmYWVjZ2js5unt6o-kGhEVGx8UA), but (at time of writing) pyrefly [does not](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEALqcROgOZ0Q3G6UN2R0qKAB10YavTABXdAGMGuXFDiduvflErSA%2BnNRyAFjDFi5UVHFUAxJYjF1HdAAJbd%2BoyfROXg4Q6dMGDA6GhgGQ1xMAAo4GCgwABo6fEROdAYASjoAWgA%2BOgA5XHQYNMIK03kLKzoAIVRKaNtcTPtvJ1dtPQNjAMcgkLCIqNj4pJS01izcguLS8sr0EESQaQZoOBJyRBAAYjoAVQ2oCCYBWQUIErgqwYFeGlQGHXRpGmwYJtT0mfy6OAMSjtHyUcLSSjeMAiECFd6fYF0YD4AC%2BMLEKxAZDBYCgpEIihoUAoBwACqQcXiARgcAQ6HISpA2BDntd0IQxAcAMowGB0QwMBjEOCIAD0ouxwTxhF4bFFMHQoswuDkcFFDPEEGZlFZJVFD0odFQADdUNBUNhYPTGVqWRsSnRcMR7egtmIyCN0DljV84Gy6ABeOgwgDMhAAjAAmdHLFGrAwbH3WaAwChoLB4IhkEAooA).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1674/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1673",
      "id": 3676849989,
      "node_id": "I_kwDOOje-Bs7bKEdF",
      "number": 1673,
      "title": "Show bounds or constraints of `T` when hovering over a variable that has type `T`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-29T15:21:30Z",
      "updated_at": "2025-11-29T15:21:30Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When hovering over a variable that has type `T`, ty currently tells you the variance of `T`, which is really useful. It would also be very useful to know what the upper bound or constraints of `T` are, however. E.g. here, `T@f` has an upper bound of `F`.\n\nhttps://github.com/user-attachments/assets/3202620f-8819-4ed1-8948-d2bfafd07d96",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1673/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1672",
      "id": 3676848077,
      "node_id": "I_kwDOOje-Bs7bKD_N",
      "number": 1672,
      "title": "Show variance of `T` when hovering over a variable that has type `type[T]`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-29T15:19:26Z",
      "updated_at": "2025-11-29T15:19:31Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When hovering over a variable that has type `T`, the ty server shows you the variance of `T`, which is very useful. If you hover over a variable that has type `type[T]`, however, the variance is not shown.\n\nhttps://github.com/user-attachments/assets/245ec366-80b8-4099-a5d6-dfb827834f2f",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1672/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1670",
      "id": 3675971866,
      "node_id": "I_kwDOOje-Bs7bGuEa",
      "number": 1670,
      "title": "Non deterministic diagnostics",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "oconnor663",
        "id": 860932,
        "node_id": "MDQ6VXNlcjg2MDkzMg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/860932?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/oconnor663",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "oconnor663",
          "id": 860932,
          "node_id": "MDQ6VXNlcjg2MDkzMg==",
          "avatar_url": "https://avatars.githubusercontent.com/u/860932?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/oconnor663",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "1": {
          "login": "mtshiba",
          "id": 45118249,
          "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
          "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mtshiba",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-11-28T21:28:52Z",
      "updated_at": "2026-01-09T15:37:44Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nEcosystem reports now often show flaky diffs, for example https://github.com/astral-sh/ruff/pull/21595#issuecomment-3568122741. Sometimes it's flaky diagnostics, sometimes it's only the ordering of union elements that changes between runs.\n\n\nThis has become more prevalent since https://github.com/astral-sh/ruff/pull/20566 landed. \n\nWe need deterministic diagnostic output (including messages) for GitLab output reports (or baselines)\n\nA PR fixing the instability should also enable the CI job added in https://github.com/astral-sh/ruff/pull/21864, demonstrating that the instability is fixed\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1670/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1669",
      "id": 3675773569,
      "node_id": "I_kwDOOje-Bs7bF9qB",
      "number": 1669,
      "title": "Signature output as markdown?",
      "user": {
        "login": "klonuo",
        "id": 361447,
        "node_id": "MDQ6VXNlcjM2MTQ0Nw==",
        "avatar_url": "https://avatars.githubusercontent.com/u/361447?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/klonuo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-11-28T19:42:27Z",
      "updated_at": "2025-11-28T19:50:31Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When I use autocomplete, signature is returned as plaintext:\n\n<img width=\"912\" height=\"463\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/02f733b3-193f-41d7-9a24-3a51b56e61ec\" />\n\n\nwhile if I hover on the same symbol, it is returned in markdown:\n\n<img width=\"630\" height=\"536\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/37fa6add-157b-4b5d-8092-d51dc007a9b8\" />\n\n\nAs signature supports markdown for documentation parameter (https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#signatureInformation) I was wondering why is it not returned as markdown by `ty` server?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1669/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1667",
      "id": 3675120235,
      "node_id": "I_kwDOOje-Bs7bDeJr",
      "number": 1667,
      "title": "Hover: Prettier docstring arguments rendering",
      "user": {
        "login": "hermeschen1116",
        "id": 108386417,
        "node_id": "U_kgDOBnXYcQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/108386417?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/hermeschen1116",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 8,
      "created_at": "2025-11-28T14:32:41Z",
      "updated_at": "2025-11-28T15:08:32Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently, docstring in hover information is just plain text. I think it's better to have syntax highlight for readability. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1667/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1666",
      "id": 3675065824,
      "node_id": "I_kwDOOje-Bs7bDQ3g",
      "number": 1666,
      "title": "Simplification of unions involving type variables",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-11-28T14:13:15Z",
      "updated_at": "2025-12-10T21:50:57Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Consider the following example:\n```py\nfrom typing import TypeVar, Any\n\ntype IntOr[T: int] = int | T\n\ndef _(x: IntOr[Any]):\n    reveal_type(x)\n```\nhttps://play.ty.dev/b378c2a3-d007-428d-8d59-a3a69f5614c0\n\nty reveals `int` here, but every other type checker reveals `int | Any`, which seems more reasonable? ty eagerly simplifies the `int | T` union to `int`, which is correct for every static `T <: int`... but leads to surprising results when `T` is explicitly specialized to a dynamic type.\n\n\nThis was prompted by a much more complex example in numpy's codebase:\n\n```py\nclass _SupportsDType(Protocol[_DTypeT_co]):\n    @property\n    def dtype(self) -> _DTypeT_co: ...\n\n_DTypeLike = type[_ScalarT] | _SupportsDType[dtype[_ScalarT]]\n```\n`_ScalarT` has an upper bound of `np.generic` (= `np.generic[Any]`). And `np.generic[…]` does have a `dtype` property member. This currently leads us to treat `type[_Scalar]` as a subtype of `_SupportsDType[…]`, and so that union gets simplified to `_SupportsDType[dtype[_ScalarT]]`. Later, `_DTypeLike` is explicitly specialized with `_DTypeLike[Any]`, and it is expected that `<class 'object'>` should be assignable to `_DTypeLike[Any]` (which would be the case if `type[Any]` were still part of the union.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1666/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1665",
      "id": 3674997408,
      "node_id": "I_kwDOOje-Bs7bDAKg",
      "number": 1665,
      "title": "diagnostic-fix: rename `List` to `list` on `unresolved-reference`",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9026616990,
          "node_id": "LA_kwDOOje-Bs8AAAACGgc-ng",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fixes",
          "name": "fixes",
          "color": "aaaaaa",
          "default": false,
          "description": null
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-28T13:48:59Z",
      "updated_at": "2025-11-30T00:55:37Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Ditto for `Tuple` => `tuple`.\n\nThis would have to be python-version aware, but in most contexts this transform is the right thing to tell someone to do.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1665/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1664",
      "id": 3674784432,
      "node_id": "I_kwDOOje-Bs7bCMKw",
      "number": 1664,
      "title": "Improve `invalid-overload` diagnostics",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-11-28T12:36:05Z",
      "updated_at": "2025-11-28T12:41:17Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "> I find the diagnostic range here confusing. I read the message like 4 times and was confused why ty would think that the definition of `f` on line 248 isn't the implementation when it clearly is. I think we should change the diagnostic range to underline the `@final` on line 243 because that's where the error really is and is also the code you have to change (move the `final` to line 247)\n\n_Originally posted by @MichaReiser in https://github.com/astral-sh/ruff/pull/21646#discussion_r2570714029_\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1664/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1657",
      "id": 3672614056,
      "node_id": "I_kwDOOje-Bs7a56So",
      "number": 1657,
      "title": "Reconsider one `Db` per `ProgramSettings`",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-11-27T18:04:37Z",
      "updated_at": "2026-01-09T10:24:39Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Today, there's exactly one `ProgramSettings` per `Db` instance. I think the main motivation for this design were:\n\n* Persistent caching: We can cache at a program settings level. E.g., using different cache files for each Python version\n* It's simpler. `ProgramSetting`'s is a singleton and it can be queried from anywhere\n\n\nHowever, I'm starting to see more downsides to this approach. Most notably, in larger workspaces where it's common for each member to have their own `src.root`, but all members use the same Python version. \n\n* We parse every imported file once for each workspace member (in which it is imported)\n* We rebuild the semantic index for every imported file for each workspace member, even if all of them use the same Python version\n* We rebuild auto completions for each workspace member rather than sharing a single index (or one per Python version)\n\nI'm not entirely sure how such a new design would look like but we'll have to include the `PythonVersion` or the `ProgramSettings` as part of the query arguments. I think where this is going is that we'd have a `ProgramFile(File, ProgramSettings)` salsa ingredient and maybe a `FileWithPythonVersion(File, PythonVersion)` that we pass along instead of passing `File` (we can still pass `File` everywhere where the query result doesn't depend on `ProgramSettings` or the `PythonVersion`. \n\n\nI think this will become more relevant as we start looking into how to better support mono repositories and uv workspaces.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1657/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1656",
      "id": 3671486497,
      "node_id": "I_kwDOOje-Bs7a1nAh",
      "number": 1656,
      "title": "Bad attribute access on a union type should be an error, not a warning",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-11-27T13:12:44Z",
      "updated_at": "2026-01-09T15:38:53Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 1,
        "total_blocking": 1
      },
      "body": "### Summary\n\nConsider the following examples:\n\n```py\ndef f(x: list[int] | None, y: None):\n    x[0]  # error: [non-subscriptable]\n    y[0]  # error: [non-subscriptable]\n\n    for z in x: ...  # error: [not-iterable]\n    for z in y: ...  # error: [not-iterable]\n\n    x.index  # warning: [possibly-missing-attribute]\n    y.index  # error: [unresolved-attribute]\n```\n\nWhen it comes to subscripting a union or iterating over a union, we issue a hard error if any element of the union does not support the operation. That's as it should be: these are serious typing errors where we're confident in our analysis. The user should definitely want these errors surfaced even if they didn't want any warnings displayed.\n\nWhen it comes to attribute access on a union, however, we only emit a `possibly-missing-attribute` _warning_ if some union elements do not have the attribute, rather than an `unresolved-attribute` error. I don't think this is correct; it's just as serious a typing error as attempting to subscript a union where some elements don't support subscription.\n\nIdeally we would be able to distinguish attribute access on a union from something like this, which I think _should_ remain a warning rather than an error:\n\n```py\ndef coinflip() -> bool:\n    return False\n\nclass F:\n    if coinflip():\n        x = 42\n\nF.x  # error: [possibly-missing-attribute]\n```\n\nCurrently our member-lookup machinery conflates these cases",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1656/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1655",
      "id": 3671377378,
      "node_id": "I_kwDOOje-Bs7a1MXi",
      "number": 1655,
      "title": "Support `extend-include`, `extend-exclude`",
      "user": {
        "login": "alexei",
        "id": 96283,
        "node_id": "MDQ6VXNlcjk2Mjgz",
        "avatar_url": "https://avatars.githubusercontent.com/u/96283?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/alexei",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        },
        "1": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-11-27T12:49:41Z",
      "updated_at": "2025-11-29T14:57:28Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It would be useful if `[tool.ty.src]` allowed `extend-include` and `extend-exclude` directives. `include` and `exclude` have some defaults which work for most packages (or at least those using the \"src\" layout). But sometimes there's _that_ package that has a `scripts/` directory or something. Now the config looks like:\n\n```toml\n[tool.ty.src]\ninclude = [\n    \"scripts/\",\n    \"src/\",\n    \"tests/\",\n]\n```\n\nWith `extend-include` it would be simplified to:\n\n```toml\n[tool.ty.src]\nextend-include = [\n    \"scripts/\",\n]\n```\n\nThis would also be very familiar to Ruff users, see https://docs.astral.sh/ruff/settings/#extend-include\n\n---\n\nAs a side note, it is strange to me that both `include` and `exclude` default to `null` (or so are documented) when they're not really null.\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1655/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1654",
      "id": 3670850504,
      "node_id": "I_kwDOOje-Bs7azLvI",
      "number": 1654,
      "title": "`docker.types` reported as `possibly-missing-attribute` after `import docker; from docker.types import Ulimit`",
      "user": {
        "login": "sitsofe",
        "id": 4005180,
        "node_id": "MDQ6VXNlcjQwMDUxODA=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4005180?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sitsofe",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-11-27T10:45:25Z",
      "updated_at": "2025-12-18T12:01:22Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nHello,\n\nI have the following `test.py`:\n```python\nimport docker\nfrom docker.types import Ulimit\n\ndocker.types.Ulimit(name='nproc', soft=1024)\nUlimit(name='nproc', soft=1024)\n```\n\nand I have `docker==7.1.0` installed in an activte venv.\n\nWhen I run `ty` (ty 0.0.1-alpha.28 (8c342496a 2025-11-25)) I get:\n```\n> ty check test.py\nwarning[possibly-missing-attribute]: Submodule `types` may not be available as an attribute on module `docker`\n --> test.py:4:1\n  |\n2 | from docker.types import Ulimit\n3 |\n4 | docker.types.Ulimit(name='nproc', soft=1024)\n  | ^^^^^^^^^^^^\n5 | Ulimit(name='nproc', soft=1024)\n  |\nhelp: Consider explicitly importing `docker.types`\ninfo: rule `possibly-missing-attribute` is enabled by default\n\nFound 1 diagnostic\n```\n\npyright (pyright 1.1.407) also complains:\n```\npyright test.py\n/private/tmp/q/test.py\n  /private/tmp/q/test.py:4:8 - error: \"types\" is not a known attribute of module \"docker\" (reportAttributeAccessIssue)\n```\n\nAfter installing stubs, mypy (mypy 1.18.2 (compiled: yes)) doesn't complain:\n```\n> mypy test.py\nSuccess: no issues found in 1 source file\n```\n\npython (Python 3.12.11 on macOS) itself doesn't complain:\n```\n> python test.py \n>\n```\n\nLooking at https://github.com/docker/docker-py/blob/7.1.0/docker/__init__.py there is no import that create `types` but there is an adjacent `types/` directory that contains https://github.com/docker/docker-py/blob/7.1.0/docker/types/__init__.py and that imports `Ulimit`.\n\nI have done searches https://github.com/astral-sh/ty/issues?q=unresolved-attribute and https://github.com/astral-sh/ty/issues?q=possibly-missing-attribute but I can't find an existing duplicate but I'm sure one must already exist. Can you point me in the right direction?\n\n### Version\n\nty 0.0.1-alpha.28 (8c342496a 2025-11-25)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1654/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1652",
      "id": 3670455398,
      "node_id": "I_kwDOOje-Bs7axrRm",
      "number": 1652,
      "title": "Publish diagnostics for all open files",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 14,
      "created_at": "2025-11-27T08:51:27Z",
      "updated_at": "2026-01-02T01:49:36Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "ty's LSP does support the PublishDiagnostics notification, however, it only publishes the diagnostics for the changed file. It never pushes diagnostics for related files. \n\nLet's say you have\n\n`lib.py`:\n\n```py\n\nclass Foo:\n    name: str\n```\n\n`main.py`:\n\n```py\nfrom lib import Foo\n\nfoo = Foo()\n\nprint(foo.name)\n```\n\nNow, you change `Foo.name` to `Foo.name2`. Note, how ty doesn't show any diagnostics in `main.py`. The new diagnostics only show up once you start making changes to `main.py`\n\n\nWe should send the `PublishNotification` for all open documents. However, doing so on every `didChange` notification seems a bit much and possibly expensive. That's why I think the approach taken by Pyrefly to only do this in `didSave` seems reasonable. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1652/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1646",
      "id": 3668062031,
      "node_id": "I_kwDOOje-Bs7aoi9P",
      "number": 1646,
      "title": "Improve diagnostics to explain why a `TypedDict` is not assignable to `dict`",
      "user": {
        "login": "lypwig",
        "id": 1665542,
        "node_id": "MDQ6VXNlcjE2NjU1NDI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1665542?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/lypwig",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 9596740363,
          "node_id": "LA_kwDOOje-Bs8AAAACPAKjCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typeddict",
          "name": "typeddict",
          "color": "46775a",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-11-26T15:45:26Z",
      "updated_at": "2025-11-26T17:05:45Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nI use a package containing methods returning poorly typed dict, and I would like to improve typing in my inherited classes by defining a typedDict and set it as a return type:\n\n```py\nfrom typing import Any, TypedDict\n\n\nclass FooDict(TypedDict):\n    a: int\n\n\nclass A:\n    def foo(self) -> dict[str, Any]:\n        return {\"a\": 1}\n\n\nclass B(A):\n    def foo(self) -> FooDict: #  <-- ty error here\n        return {\"a\": 1}\n```\n\nHere I get:\n\n> ty: Invalid override of method `foo`: Definition is incompatible with `A.foo` (invalid-method-override) [Ln 14, Col 9]\n\nhttps://play.ty.dev/6d88c3d3-7801-46ce-98f8-8d74a0e7fce4\n\nIs it possible to do this?\n\n### Version\n\nty 0.0.1-alpha.28",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1646/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1644",
      "id": 3666602398,
      "node_id": "I_kwDOOje-Bs7ai-me",
      "number": 1644,
      "title": "Improve Liskov diagnostics to say *why* a method override is incompatible",
      "user": {
        "login": "tronical",
        "id": 1486,
        "node_id": "MDQ6VXNlcjE0ODY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1486?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tronical",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 7,
      "created_at": "2025-11-26T09:13:50Z",
      "updated_at": "2025-12-26T17:22:52Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 1,
        "total_blocked_by": 1,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n`uvx ty@0.0.1a28 check` yields:\n\n```\nerror[invalid-method-override]: Invalid override of method `set_row_data`\n  --> slint/models.py:90:9\n   |\n88 |         return self.list[row]\n89 |\n90 |     def set_row_data(self, row: int, data: T) -> None:\n   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Definition is incompatible with `Model.set_row_data`\n91 |         self.list[row] = data\n92 |         super().notify_row_changed(row)\n   |\n  ::: slint/models.py:36:9\n   |\n34 |         return ModelIterator(self)\n35 |\n36 |     def set_row_data(self, row: int, value: T) -> None:\n   |         ---------------------------------------------- `Model.set_row_data` defined here\n37 |         \"\"\"Call this method on mutable models to change the data for the given row.\n38 |         The UI will also call this method when modifying a model's data.\n   |\ninfo: This violates the Liskov Substitution Principle\ninfo: rule `invalid-method-override` is enabled by default\n\nFound 1 diagnostic\n```\n\nThe signatures are identical, so I'm not sure what's wrong here :)\n\nFor reference (with code removed):\n\n```python\nclass Model[T](native.PyModelBase, Iterable[T]):\n   \n    def set_row_data(self, row: int, value: T) -> None:\n   \nclass ListModel[T](Model[T]):\n  \n    def set_row_data(self, row: int, data: T) -> None:\n        ...\n```\n\n### Version\n\n0.0.1a28",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1644/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1640",
      "id": 3665637585,
      "node_id": "I_kwDOOje-Bs7afTDR",
      "number": 1640,
      "title": "Hover rendering has no title on non-trival stringified annotations",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-11-26T04:04:22Z",
      "updated_at": "2025-12-05T13:47:24Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWith this code:\nhttps://play.ty.dev/fdd1d134-c407-4bee-bbc6-55418b97988e\n```py\na: \"str\"\nb: \"str | int\"\n```\nHovering the `str` in `a` gives a title saying `str`:\n\n<img width=\"473\" height=\"237\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/5efc35da-2396-41f2-85f9-a8a3ec58c1c9\" />\n\nWhile hovering the `str` in `b` is missing that title:\n\n<img width=\"510\" height=\"232\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/1740e63e-0821-4ebb-a788-1e96db269e37\" />\n\nThis happens both in the playground and in VSC.\n\n### Version\n\nty 0.0.1-alpha.28 (8c342496a 2025-11-25) playground (536425619)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1640/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1635",
      "id": 3664608600,
      "node_id": "I_kwDOOje-Bs7abX1Y",
      "number": 1635,
      "title": "False positive on Starlette middleware registration",
      "user": {
        "login": "Asaf31214",
        "id": 76401302,
        "node_id": "MDQ6VXNlcjc2NDAxMzAy",
        "avatar_url": "https://avatars.githubusercontent.com/u/76401302?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Asaf31214",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 8,
      "created_at": "2025-11-25T21:12:26Z",
      "updated_at": "2026-01-09T13:43:27Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nRegister any FastAPI middleware, custom or built-in:\n``` python\napp = FastAPI()\napp.add_middleware(NoStoreAuthMiddleware) # custom, subclass of BaseHTTPMiddleware\napp.add_middleware(RateLimitMiddleware) # custom, subclass of BaseHTTPMiddleware\napp.add_middleware( \n    CORSMiddleware, # built-in middleware, from fastapi.middleware.cors\n    allow_origins=[\"*\"],\n    allow_credentials=True,\n    allow_methods=[\"*\"],\n    allow_headers=[\"*\"],\n) \n```\nrun:\n`ty check`, without any specified rules at `pyproject.toml`\n\nNo issue until ty@0.0.1a25 (expected result)\nBut for versions ty@0.0.1a26 and ty@0.0.1a27 (current latest):\n```\nerror[invalid-argument-type]: Argument to bound method `add_middleware` is incorrect\n  --> main.py:31:20\n   |\n30 | app = FastAPI(default_response_class=ORJSONResponse, lifespan=lifespan)\n31 | app.add_middleware(NoStoreAuthMiddleware)\n   |                    ^^^^^^^^^^^^^^^^^^^^^ Expected `_MiddlewareFactory[Unknown]`, found `<class 'NoStoreAuthMiddleware'>`\n32 | app.add_middleware(RateLimitMiddleware)\n33 | app.add_middleware(ExceptionHandlerMiddleware)\n   |\ninfo: Method defined here\n   --> .venv/lib/python3.14/site-packages/starlette/applications.py:118:9\n    |\n116 |         self.router.host(host, app=app, name=name)  # pragma: no cover\n117 |\n118 |     def add_middleware(\n    |         ^^^^^^^^^^^^^^\n119 |         self,\n120 |         middleware_class: _MiddlewareFactory[P],\n    |         --------------------------------------- Parameter declared here\n121 |         *args: P.args,\n122 |         **kwargs: P.kwargs,\n    |\ninfo: rule `invalid-argument-type` is enabled by default\n```\nsame error for all 3 middlewares registered here.\n\nthis is also mentioned at issue #1564  by @dmytro-GL [here](https://github.com/astral-sh/ty/issues/1564#issuecomment-3548995805)\n\n### Version\n\nty 0.0.1-alpha.27",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1635/reactions",
        "total_count": 11,
        "+1": 11,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1634",
      "id": 3664594856,
      "node_id": "I_kwDOOje-Bs7abUeo",
      "number": 1634,
      "title": "Refactoring support",
      "user": {
        "login": "pyscripter",
        "id": 1311616,
        "node_id": "MDQ6VXNlcjEzMTE2MTY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1311616?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/pyscripter",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-11-25T21:07:20Z",
      "updated_at": "2025-12-16T07:45:16Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is a feature request.\n\nRename and auto-import functionality is already available, but it would be very useful to provide additional refactoring support.  At a minimum, support for the Jedi refactorings could be provided, so that users can switch to ty from jedi-based LSP without loss of functionality:\n\n- extract variable\n- extract function\n- inline\n\nThis would help faster adoption.\n\nOf course, ideally, more refactorings could be supported.  See for example the [relevant issue](https://github.com/facebook/pyrefly/issues/364) of [pyrefly](https://github.com/facebook/pyrefly)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1634/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1633",
      "id": 3664464709,
      "node_id": "I_kwDOOje-Bs7aa0tF",
      "number": 1633,
      "title": "Issue with unpacking args in lambda function",
      "user": {
        "login": "jrdnh",
        "id": 6494876,
        "node_id": "MDQ6VXNlcjY0OTQ4NzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6494876?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jrdnh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-11-25T20:15:44Z",
      "updated_at": "2025-12-19T12:06:21Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe following code raises an unexpected type error in the first snippet and does not raise a type error in the second snippet (which is invalid code).\n\nIdeally would have hoped the required type for the arg could be inferred (#181) based on the context.\n\n```python\n# pow(x, y, modulo)\n# type error on \"pow\", valid code\nfoo = lambda pair=(2, 2): pow(*pair, 4)\nfoo()\n\n# no type error, causes runtime error\nfoo(('a', 'b'))\n```\n\n### Version\n\nty 0.0.1-alpha.27 (26d7b6864 2025-11-18)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1633/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1631",
      "id": 3663053552,
      "node_id": "I_kwDOOje-Bs7aVcLw",
      "number": 1631,
      "title": "Add missing match arms code action",
      "user": {
        "login": "MatthewMckee4",
        "id": 119673440,
        "node_id": "U_kgDOByISYA",
        "avatar_url": "https://avatars.githubusercontent.com/u/119673440?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MatthewMckee4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-11-25T13:20:15Z",
      "updated_at": "2025-11-26T08:39:48Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Been looking through the R-A code actions and https://rust-analyzer.github.io/book/assists.html#add_missing_match_arms looks quite cool.\n\nbefore:\n\n```py\nfrom enum import Enum\n\nclass Color(Enum):\n    RED = 1\n    GREEN = 2\n    BLUE = 3\n\ndef handle_color(c: Color):\n    match c<CURSOR>:\n        case Color.RED:\n            return \"red\"\n```\n\nafter:\n\n```py\nfrom enum import Enum\n\nclass Color(Enum):\n    RED = 1\n    GREEN = 2\n    BLUE = 3\n\ndef handle_color(c: Color):\n    match c:\n        case Color.RED:\n            return \"red\"\n        case Color.GREEN:\n            raise NotImplementedError # (or \"...\")\n        case Color.BLUE:\n            raise NotImplementedError\n```\n\nI suppose this could start with a warning diagnostic on the \"c\" in the match, that we have a non exhaustive match.\n\nCurrently rust emits a diagnostic\n\n```text\nmissing match arm: Green and Blue not covered (rust-analyzer E0004)\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1631/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1628",
      "id": 3661127425,
      "node_id": "I_kwDOOje-Bs7aOF8B",
      "number": 1628,
      "title": "`Literal` `str`s do not work with `Sequence[T]` generic function argument narrowing",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-11-25T01:23:58Z",
      "updated_at": "2025-12-02T02:06:37Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nMinimization of when I ran into this in my code:\n\nhttps://play.ty.dev/21a7ef1b-756b-4981-af2d-878f5fe72ee4\n```py\nfrom typing import Sequence, assert_type\n\ndef first[T](x: Sequence[T]) -> T:\n    return x[0]\n\nreveal_type(\"1\")  # Revealed type: `Literal[\"1\"]`\nassert_type(first(\"1\"), str)  # Type `str` does not match asserted type `Unknown`\n```\nSince the type of `\"1\"` is defaulted to `Literal[\"1\"]`, code that tries to rely on literal strings with this `Sequence` generic narrowing will not work.\n\n### Version\n\nty 0.0.1-alpha.27 (26d7b6864 2025-11-18)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1628/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1627",
      "id": 3660949387,
      "node_id": "I_kwDOOje-Bs7aNaeL",
      "number": 1627,
      "title": "`invalid-syntax-in-forward-annotation` does not preserve error spans",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-11-24T23:59:53Z",
      "updated_at": "2025-11-25T12:17:49Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nAs the title says, `invalid-syntax-in-forward-annotation` does not preserve error spans. For example:\nhttps://play.ty.dev/f034109f-c63d-4871-9976-dbea46491a62\n```py\na: type]\nb: \"type]\"\n```\nThe span of `a`'s error is `1:8-1:9` (well actually it has two errors, but both are on the `]`).\nThe span of `b`'s error is the entire string literal. It would be nice if `ty` preserved the `invalid-syntax` error location and propagated it to `invalid-syntax-in-forward-annotation`\n```powershell\nPS ~>Set-Content issue.py @'\na: type]\nb: \"type]\"\n'@\nPS ~>uvx ty check issue.py\nerror[invalid-syntax]: Expected a statement\n --> issue.py:1:8\n  |\n1 | a: type]\n  |        ^\n2 | b: \"type]\"\n  |\n\nerror[invalid-syntax]: Expected a statement\n --> issue.py:1:9\n  |\n1 | a: type]\n  |         ^\n2 | b: \"type]\"\n  |\n\nerror[invalid-syntax-in-forward-annotation]: Syntax error in forward annotation: Unexpected token at the end of an expression\n --> issue.py:2:4\n  |\n1 | a: type]\n2 | b: \"type]\"\n  |    ^^^^^^^\n  |\ninfo: rule `invalid-syntax-in-forward-annotation` is enabled by default\n\nFound 3 diagnostics\n```\n\nThe error message is also not always helpful, since the error may not occur at the end, ie `type] | int`\n\n### Version\n\nty 0.0.1-alpha.27 (26d7b6864 2025-11-18)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1627/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1625",
      "id": 3660825431,
      "node_id": "I_kwDOOje-Bs7aM8NX",
      "number": 1625,
      "title": "Inlay hint insert follow ups",
      "user": {
        "login": "MatthewMckee4",
        "id": 119673440,
        "node_id": "U_kgDOByISYA",
        "avatar_url": "https://avatars.githubusercontent.com/u/119673440?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MatthewMckee4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-11-24T22:55:45Z",
      "updated_at": "2025-12-31T15:36:58Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Think it's useful to have an issue for the rest of the work that needs done for inlay hint edits.\n\n- [ ] Auto import\n- [ ] Don't allow edits for more types.\n- [ ] Try to provide some kind of edit for some (currently) disallowed types (callables)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1625/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1624",
      "id": 3660516361,
      "node_id": "I_kwDOOje-Bs7aLwwJ",
      "number": 1624,
      "title": "use type context to inform default specialization of bare generic class name",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-11-24T21:02:02Z",
      "updated_at": "2025-11-24T21:02:35Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Example code (derived from [psycopg2](https://github.com/psycopg/psycopg/blob/47b4dec61a8fc0df5559d9037463f945af042796/psycopg/psycopg/connection.py#L78)):\n\n```py\nfrom typing import TypeVar, Generic\n\nRow = TypeVar(\"Row\", default=int)\n\nclass Cursor(Generic[Row]):\n    x: Row\n\nclass Connection(Generic[Row]):\n    factory: type[Cursor[Row]]\n\n    def __init__(self):\n        reveal_type(Cursor)\n        self.factory = Cursor\n```\n\nWe default-specialize `Cursor` in the last line, leading to treating it as `<class 'Cursor[int]'>`, which is not assignable to `type[Cursor[Row]]` (since `Row` is a typevar in the scope of `class Connection` -- the assignment must be valid for any possible specialization of `Connection`).\n\nMypy and pyright both allow this assignment, and it seems like they use bidirectional typing (type context) to do so (evidence: making the last line `self.factory = reveal_type(Cursor)` makes it fail in pyright). So perhaps type context should take precedence over typevar defaults when deciding how to implicitly specialize in this case.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1624/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1623",
      "id": 3659872913,
      "node_id": "I_kwDOOje-Bs7aJTqR",
      "number": 1623,
      "title": "more forgiving handling of invalid submodule-attribute access",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-11-24T17:36:11Z",
      "updated_at": "2025-11-24T20:28:41Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "if we hit this branch, we have pretty high confidence that we know what the user _meant_ here -- we could even consider inferring the module-literal type of the submodule rather than inferring `Unknown`. (Or `<submodule type> | Unknown`...?)\n\nAnd since this often will (by pure luck!) work at runtime, we could also consider downgrading the diagnostic to warning-level rather than error-level\n\n_Originally posted by @AlexWaygood in https://github.com/astral-sh/ruff/pull/21561#discussion_r2553149726_\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1623/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1622",
      "id": 3659871863,
      "node_id": "I_kwDOOje-Bs7aJTZ3",
      "number": 1622,
      "title": "Zed: Outdated diagnostics when using `diagnosticMode: \"openFiles\"`",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9758142216,
          "node_id": "LA_kwDOOje-Bs8AAAACRaFvCA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/editor",
          "name": "editor",
          "color": "c4bfdc",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-11-24T17:35:50Z",
      "updated_at": "2025-12-31T15:36:24Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "\nCreate a file `lib.py`:\n\n```py\nclass Project:\n    name: str\n\n```\n\nCreate a second file `main.py`:\n\n```py\nfrom lib import Project\n\np = Project()\n\nprint(p.name)\n```\n\n\nNow, change `lib.py` to \n\n```py\nclass Project:\n    name: str\n\n```\n\nThere should now be a diagnostic for `print(p.name)` but Zed fails to fetch the diagnostics for `main.py`. \n\nNote, that ty uses `relatedInformation: true` when registering for pull diagnostics.\n\nI reported this issue upstream, see https://github.com/zed-industries/zed/issues/31259#issuecomment-3571961820",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1622/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1621",
      "id": 3659786779,
      "node_id": "I_kwDOOje-Bs7aI-ob",
      "number": 1621,
      "title": "Zed: No LSP features for unsaved buffers",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9758142216,
          "node_id": "LA_kwDOOje-Bs8AAAACRaFvCA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/editor",
          "name": "editor",
          "color": "c4bfdc",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-11-24T17:12:20Z",
      "updated_at": "2025-12-31T15:36:05Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "ty doesn't provide any type checking or LSP functionality for unsaved files (buffers):\n\n* Create a new unnamed file\n* Change the language to Python\n* Paste: `sys.version`\n* Note how there's no diagnostic for `sys` being undefined\n\nI think this is related to the following upstream issues:\n\n* https://github.com/zed-industries/zed/issues/17098\n* https://github.com/zed-industries/zed/issues/20839\n\nbecause I don't see Zed sending any `didOpen` notification to ty's (or Ruff's) LSP. \n\nI commented on the upstream issue to hear from the Zed folks whether it's indeed an upstream issue and if they're aware of it that impacts any LSP.\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1621/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1612",
      "id": 3656063940,
      "node_id": "I_kwDOOje-Bs7Z6xvE",
      "number": 1612,
      "title": "Design: Rule settings",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568526506,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlWqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-design",
          "name": "needs-design",
          "color": "F9D0C4",
          "default": false,
          "description": "Needs further design before implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-11-23T14:21:43Z",
      "updated_at": "2025-12-31T15:35:52Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://github.com/astral-sh/ty/issues/1354, https://github.com/astral-sh/ty/issues/1422, and https://github.com/astral-sh/ty/issues/278 are in themselves trivial, but they're all blocked on a decision on where to put rule-related settings/type checker settings other than environment.\n\nHere a few options\n\n## Top-level\n\nPut the settings directly under `ty`. \n\n```toml\n[tool.ty]\nallowed-unresolved-modules = [...]\n```\n\nThe main downside of this, and the reason why all existing settings are grouped, is that top-level settings make it more difficult to explain which settings are allowed within `.overrides`, in user-level configurations, or when we add hierarchical configurations. \n\nNo grouping can also make it more difficult to discover options, asssuming we can come up with meaningful section names. \n\n## Rule-level\n\n```toml\n[tool.ty.rules]\nunresolved-import = { level = \"warning\", allow=[...] }\n```\n\nI like that the settings are very local to the rule. However, many settings are specific to many rules (e.g. whether ty should respect `type: ignore` comments) and I worry that the configuration schema becomes very complicated and I don't know how well editors support tagged-unions... \n\n## Sub-section\n\nThis is still my favorite option, except that I'm struggling to come up with a good section name. The most obvious choice is `check`\n\n```toml\n[tool.ty.check]\nallowed-unresolved-modules = [...]\n```\n\nLong-term, what if ty also supports formatting and the options only apply to typing? Is `check` still a good name? Could we come up with something more meaningful? `tool.ty.typing`? \n\nThe other downside is that a separte section is somewhat verbose when using overrides\n\n```toml\n[[tool.ty.overrides]]\ninclude = [...]\n\n[[tool.ty.overrides.check]]\nallowed-unresolved-modules = []\n```\n\nI think the following should also work, but only for as long as the configuration fits on a single line\n\n```toml\n[[tool.ty.overrides]]\ninclude = [...]\ncheck.allowed-unresolved-modules = []\n```\n\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1612/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1610",
      "id": 3654754249,
      "node_id": "I_kwDOOje-Bs7Z1x_J",
      "number": 1610,
      "title": "Improved hover rendering for parameters",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-11-22T14:50:02Z",
      "updated_at": "2025-11-23T20:20:19Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Pylance:\n\nhttps://github.com/user-attachments/assets/96b44cc1-f27a-4344-b9a0-506153b1d71b\n\n\nty\n\nhttps://github.com/user-attachments/assets/2e24e8bd-d349-4381-a04b-02860f29eb17\n\n\nThe missing padding around parameter documentation makes the documentation much harder to scan than Pylance's version. ty also doesn't provide any special highlighting for the versionchanged section at the bottom",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1610/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1608",
      "id": 3651714646,
      "node_id": "I_kwDOOje-Bs7ZqL5W",
      "number": 1608,
      "title": "Parsed Docstring Dreams",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-11-21T13:34:54Z",
      "updated_at": "2026-01-09T03:29:54Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I don't want to file a bunch of granular issues about this right now so here's some pie-in-the-sky ideas about docstrings. All of this would require treating them like sub-ASTs (like string annotations):\n\n# LSP Features\n\n* If there are \\`singleticks\\` around an item, try to resolve the name and make it hoverable/goto-able\n* If there are \\`singleticks\\` around an item, make it a link to the item in renderings of the docstring (hovers)\n* Do semantic tokens (syntax highlighting) of doctests (and literal blocks?) \n* Make names and types hoverable/clickable in `:param str myparam:` and `:rtype: str` (any of the various formats)\n* Make items in doctests (and literal blocks?) hoverable/goto-able\n\n# Typechecker Features\n\n* Have a diagnostic if a \\`singletick\\` name doesn't resolve\n* Have a diagnostic if we parse a `:param myparam:` but `myparam` isn't a parameter (any of the various formats)\n* Have a diagnostic if we parse a `:param int myparam:` but `myparam` isn't an `int`  (any of the various formats)\n* Have a diagnostic if we parse an `:rtype: int` but the return type isn't `int` (any of the various formats)\n* Typecheck doctests (and literal blocks?)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1608/reactions",
        "total_count": 6,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 6,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1602",
      "id": 3648228230,
      "node_id": "I_kwDOOje-Bs7Zc4uG",
      "number": 1602,
      "title": "Bidirectional inference with comprehensions",
      "user": {
        "login": "gjcarneiro",
        "id": 2197096,
        "node_id": "MDQ6VXNlcjIxOTcwOTY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2197096?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gjcarneiro",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "ibraheemdev",
          "id": 34988408,
          "node_id": "MDQ6VXNlcjM0OTg4NDA4",
          "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ibraheemdev",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-11-20T17:07:10Z",
      "updated_at": "2026-01-09T05:27:16Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWith Ty a27, a simple dict literal `{\"foo\": \"abc\"}` is interpreted as `dict[Unknown | str, Unknown | str]`, which causes downstream problems.\n\nhttps://play.ty.dev/9134dfe2-2020-4bcd-8549-4d22e562a562\n\n### Version\n\nty 0.0.1-alpha.27",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1602/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1600",
      "id": 3646985784,
      "node_id": "I_kwDOOje-Bs7ZYJY4",
      "number": 1600,
      "title": "Invalid union types in `isinstance()` calls are not detected when nested in tuples",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-11-20T12:08:40Z",
      "updated_at": "2025-11-21T00:08:24Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWe currently emit a diagnostic when an invalid `types.UnionType` instance is used as the second argument to `isinstance()` or `issubclass()`. But we do not currently detect this if the `types.UnionType` instance is nested inside a tuple.\n\nIt's probably not high-priority to fix this because I'm not sure why you'd write code like this, but it's a known edge case that we don't handle currently, so it seemed worth opening an issue about.\n\n```py\nfrom typing import Literal\n\ndef f(x):\n    if isinstance(x, str | Literal[42]):  # diagnostic (good! this fails at runtime)\n        reveal_type(x)\n\n    if isinstance(x, (int, str | Literal[42])):  # no diagnostic\n        reveal_type(x)  # revealed: Unknown\n\n    if isinstance(x, (int, (str, (bytes, memoryview | Literal[42])))):  # no diagnostic\n        reveal_type(x)  # revealed: Unknown\n```\n\nAt runtime:\n\n```pycon\nPython 3.13.1 (main, Jan  3 2025, 12:04:03) [Clang 15.0.0 (clang-1500.3.9.4)] on darwin\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n>>> from typing import Literal\n>>> if isinstance(42, (bytes, str | int)):\n...     print('got you')\n...     \ngot you\n>>> if isinstance(42, (bytes, str | Literal[42])):\n...     print('got you')\n...     \nTraceback (most recent call last):\n  File \"<python-input-3>\", line 1, in <module>\n    if isinstance(42, (bytes, str | Literal[42])):\n       ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/Users/alexw/.pyenv/versions/3.13.1/lib/python3.13/typing.py\", line 1786, in __instancecheck__\n    return self.__subclasscheck__(type(obj))\n           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n  File \"/Users/alexw/.pyenv/versions/3.13.1/lib/python3.13/typing.py\", line 1790, in __subclasscheck__\n    if issubclass(cls, arg):\n       ~~~~~~~~~~^^^^^^^^^^\n  File \"/Users/alexw/.pyenv/versions/3.13.1/lib/python3.13/typing.py\", line 1378, in __subclasscheck__\n    raise TypeError(\"Subscripted generics cannot be used with\"\n                    \" class and instance checks\")\nTypeError: Subscripted generics cannot be used with class and instance checks\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1600/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1599",
      "id": 3646925374,
      "node_id": "I_kwDOOje-Bs7ZX6o-",
      "number": 1599,
      "title": "Add the ability to trigger property tests on a PR by adding a label to the PR",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568513779,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkk8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/ci",
          "name": "ci",
          "color": "905251",
          "default": false,
          "description": "Related to internal CI tooling"
        },
        "1": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-20T11:53:15Z",
      "updated_at": "2025-11-20T11:53:15Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It would be nice to be able to trigger property tests on a PR by adding a label to the PR, similar to the way we do it with ecosystem-analyzer. They're too slow to run on every PR by default, but you generally want to run them on any PR that touches our `Type::has_relation_to_impl` logic, and it's annoying to have to check out the PR locally in order to run them.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1599/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1598",
      "id": 3646908912,
      "node_id": "I_kwDOOje-Bs7ZX2nw",
      "number": 1598,
      "title": "Consolidate `type[]` types in a union when displaying them",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "mahiro72",
        "id": 70263039,
        "node_id": "MDQ6VXNlcjcwMjYzMDM5",
        "avatar_url": "https://avatars.githubusercontent.com/u/70263039?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mahiro72",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "mahiro72",
          "id": 70263039,
          "node_id": "MDQ6VXNlcjcwMjYzMDM5",
          "avatar_url": "https://avatars.githubusercontent.com/u/70263039?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mahiro72",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-11-20T11:48:53Z",
      "updated_at": "2025-12-18T14:30:09Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When displaying a union (e.g. in error messages or on hover), it would be nicer if we displayed the union `type[A] | type[B] | type[C]` as `type[A | B | C]`. The latter means the same thing, is a valid type annotation, and is much more concise. This would be similar to the way we display `Literal[\"a\"] | Literal[42] | Literal[b\"foooo\"]` as `Literal[\"a\", 42, b\"foo\"]` in diagnostics and on hover.\n\nKeeping type display concise where possible makes our diagnostics much more readable.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1598/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1597",
      "id": 3645336318,
      "node_id": "I_kwDOOje-Bs7ZR2r-",
      "number": 1597,
      "title": "Add command to generate type stubs (equivalent to mypy's `stubgen`)",
      "user": {
        "login": "MamadouSDiallo",
        "id": 29002478,
        "node_id": "MDQ6VXNlcjI5MDAyNDc4",
        "avatar_url": "https://avatars.githubusercontent.com/u/29002478?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MamadouSDiallo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239603,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPsw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/feature",
          "name": "feature",
          "color": "a2eeef",
          "default": false,
          "description": "New feature or request"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-11-20T03:54:41Z",
      "updated_at": "2025-11-20T04:53:49Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Is your feature request related to a problem? Please describe.\nI am developing a Python library that includes compiled extensions (via Cython, PyO3, or C-extensions). To ensure users receive proper IDE support (autocompletion, signatures, and docstrings), I need to distribute `.pyi` stub files alongside my compiled binaries (`.so` / `.pyd`).\n\nCurrently, `ty` does not have a mechanism to generate these stubs. This forces me to maintain `mypy` in my build chain specifically to use `stubgen`, even if I intend to use `ty` for the actual type checking.\n\n### Describe the solution you'd like\nI would like a built-in command (e.g., `ty stubgen` or `ty gen-stubs`) that can automatically generate `.pyi` files for a given package.\n\nCrucially, this feature needs to support **compiled extension introspection**. It should be able to:\n1.  Recurse through a target package.\n2.  Detect compiled modules (binary extensions).\n3.  Introspect them (similar to how `stubgen` imports modules at runtime) to extract function signatures and docstrings.\n4.  Output standard, compliant `.pyi` files to a specified directory.\n\n### Describe alternatives you've considered\n* **Using `mypy`:** This is the current workaround. I install `mypy` solely to run `stubgen -p my_package`. This introduces a heavy dependency into the build environment that I am otherwise trying to replace.\n* **Hand-writing stubs:** This is error-prone and not feasible for large or rapidly evolving codebases.\n\n### Additional context\nThis feature is critical for library authors who distribute binary wheels. It aligns with the philosophy of a unified, high-performance toolchain. If `ty` is handling type checking, it would be highly beneficial if it also handled the generation of the artifacts (stubs) required for that checking to work for end-users of compiled libraries.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1597/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1595",
      "id": 3644214137,
      "node_id": "I_kwDOOje-Bs7ZNkt5",
      "number": 1595,
      "title": "Slice is not subscriptable at runtime",
      "user": {
        "login": "joecox",
        "id": 2593686,
        "node_id": "MDQ6VXNlcjI1OTM2ODY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2593686?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/joecox",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-11-19T19:54:51Z",
      "updated_at": "2025-11-19T21:02:33Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nty should report [`not-subscriptable`](https://docs.astral.sh/ty/reference/rules/#non-subscriptable) when annotating slice types ~below 3.14:~\n\n```sh\n$ cat >slice.py <<'# EOF'\ns: slice[int]\n# EOF\n\n$ uv run --python 3.13 slice.py\nUsing CPython 3.13.7 interpreter at: /opt/homebrew/opt/python@3.13/bin/python3.13\nRemoved virtual environment at: .venv\nCreating virtual environment at: .venv\nTraceback (most recent call last):\n  File \"/Users/joe/slice.py\", line 1, in <module>\n    s: slice[int]\n       ~~~~~^^^^^\nTypeError: type 'slice' is not subscriptable\n\n$ uv run --python 3.14 slice.py\nUsing CPython 3.14.0\nRemoved virtual environment at: .venv\nCreating virtual environment at: .venv\n\n$ uvx --python 3.13 --with \"ty==0.0.1-alpha.27\" ty check slice.py\nAll checks passed!\n```\n\nI assume ty doesn't complain because typeshed has slice as generic? ~I don't even know if it's documented anywhere that subscripting slice began working on 3.14.~\n\n### Version\n\nty 0.0.1-alpha.27 (26d7b6864 2025-11-18)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1595/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1594",
      "id": 3643174509,
      "node_id": "I_kwDOOje-Bs7ZJm5t",
      "number": 1594,
      "title": "Show type qualifiers like `Final` in on-hover hints",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-11-19T15:04:54Z",
      "updated_at": "2025-11-24T09:17:12Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "> If I hovered over `X` for something like `X: Final = [\"foo\"]`, I'd expect something like\n\n```\nlist[str | Unknown] (Final)\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1594/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1593",
      "id": 3643168271,
      "node_id": "I_kwDOOje-Bs7ZJlYP",
      "number": 1593,
      "title": "Hovering over `Final` reveals `Unknown`",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-11-19T15:03:40Z",
      "updated_at": "2025-12-05T19:27:56Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "If you hover over the `Final` in `X: Final`, it shows `Unknown`\n\n```py\nfrom typing import Final, reveal_type\n\nX: Final = [\"foo\", \"bar\"]\n```\n\nGo to definition works. \n\n\n\nhttps://play.ty.dev/64da8236-5cf7-43d4-bc71-6cd7b42773c4",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1593/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1592",
      "id": 3642749368,
      "node_id": "I_kwDOOje-Bs7ZH_G4",
      "number": 1592,
      "title": "Go to definition ignores `import as`",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-11-19T13:29:22Z",
      "updated_at": "2025-11-21T19:54:36Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe title isn't great but the case I'm seeing:\n\n`foo/bar.py`\n\n```py\nALL = [1, 2, 3]\n\n```\n\n`main.py`\n\n```py\nfrom bar import ALL as all\n\n\nprint(all)\n```\n\nI'd expect that clicking on `all` in `print(all)` jumps to `from bar import ALL as all` but ty directly jumps to `ALL` in `foo/bar.py`\n\nhttps://play.ty.dev/34121ab8-f6d3-40d6-bcb5-6eb82f48945f\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1592/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1588",
      "id": 3641475502,
      "node_id": "I_kwDOOje-Bs7ZDIGu",
      "number": 1588,
      "title": "Large enum takes very long to type check.",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 9338446479,
          "node_id": "LA_kwDOOje-Bs8AAAACLJ1ijw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/enums",
          "name": "enums",
          "color": "ac72c7",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-11-19T07:41:48Z",
      "updated_at": "2026-01-09T13:43:55Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Type checking the following file takes minutes (730s and counting) on my machine\n\nhttps://gist.github.com/MichaReiser/c2ba46218ce8807356db6c6fa7d0b49e",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1588/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1587",
      "id": 3640326494,
      "node_id": "I_kwDOOje-Bs7Y-vle",
      "number": 1587,
      "title": "pair of mutually recursive generic `Protocol` definitions",
      "user": {
        "login": "gertvdijk",
        "id": 1550527,
        "node_id": "MDQ6VXNlcjE1NTA1Mjc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1550527?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gertvdijk",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 14,
      "created_at": "2025-11-18T23:05:36Z",
      "updated_at": "2025-12-19T12:07:21Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I've got a small Python typing showcase (currently using mypy) up at https://github.com/gertvdijk/mypy-sibling-generics-demo. Was wondering how `ty` would handle/show this, tried it out, but sadly it triggers `ty` to panic (tested at [this current latest commit](https://github.com/gertvdijk/mypy-sibling-generics-demo/commit/18e84d223ffb2dfdd53e5ee362db47101e15a9f5)). It told me to create this bug report, so here I am. 😄 \n\nSteps to reproduce: clone that project, and running `ty` triggers it basically. I believe the output below includes all necessary info, but please LMK if you need anything else or even a smaller MRE.\n\n```console\n$ git clone https://github.com/gertvdijk/mypy-sibling-generics-demo.git && cd mypy-sibling-generics-demo\n$ uv add --dev ty\n$ uv run ty check\nerror[panic]: Panicked at crates/ty_python_semantic/src/types/instance.rs:822:18 when checking `/path/to/mypy-sibling-generics-demo/foobar/client.py`: `Class wrapped by `Protocol` should be a protocol class`\ninfo: This indicates a bug in ty.\ninfo: If you could open an issue at https://github.com/astral-sh/ty/issues/new?title=%5Bpanic%5D, we'd be very appreciative!\ninfo: Platform: linux x86_64\ninfo: Version: 0.0.1-alpha.27\n[...]\n```\n\n<details>\n\n<summary>Full output</summary>\n\n```console\nerror[panic]: Panicked at crates/ty_python_semantic/src/types/instance.rs:822:18 when checking `/path/to/mypy-sibling-generics-demo/foobar/client.py`: `Class wrapped by `Protocol` should be a protocol class`\ninfo: This indicates a bug in ty.\ninfo: If you could open an issue at https://github.com/astral-sh/ty/issues/new?title=%5Bpanic%5D, we'd be very appreciative!\ninfo: Platform: linux x86_64\ninfo: Version: 0.0.1-alpha.27\ninfo: Args: [\"ty\", \"check\"]\ninfo: run with `RUST_BACKTRACE=1` environment variable to show the full backtrace information\ninfo: query stacktrace:\n   0: is_equivalent_to_object_inner(Id(25801))\n             at crates/ty_python_semantic/src/types/instance.rs:663\n             cycle heads: infer_definition_types(Id(300e)) -> iteration = 2\n   1: infer_deferred_types(Id(300b))\n             at crates/ty_python_semantic/src/types/infer.rs:141\n             cycle heads: infer_definition_types(Id(300d)) -> iteration = 2, TypeVarInstance < 'db >::lazy_bound_(Id(1c801)) -> iteration = 2\n   2: TypeVarInstance < 'db >::lazy_bound_(Id(1c800))\n             at crates/ty_python_semantic/src/types.rs:8734\n   3: infer_definition_types(Id(300e))\n             at crates/ty_python_semantic/src/types/infer.rs:94\n   4: infer_deferred_types(Id(300c))\n             at crates/ty_python_semantic/src/types/infer.rs:141\n   5: TypeVarInstance < 'db >::lazy_bound_(Id(1c801))\n             at crates/ty_python_semantic/src/types.rs:8734\n   6: infer_definition_types(Id(300d))\n             at crates/ty_python_semantic/src/types/infer.rs:94\n   7: infer_scope_types(Id(2400))\n             at crates/ty_python_semantic/src/types/infer.rs:70\n   8: check_file_impl(Id(c01))\n             at crates/ty_project/src/lib.rs:535\n\n\nerror[panic]: Panicked at crates/ty_python_semantic/src/types/instance.rs:822:18 when checking `/path/to/mypy-sibling-generics-demo/foobar/server.py`: `Class wrapped by `Protocol` should be a protocol class`\ninfo: This indicates a bug in ty.\ninfo: If you could open an issue at https://github.com/astral-sh/ty/issues/new?title=%5Bpanic%5D, we'd be very appreciative!\ninfo: Platform: linux x86_64\ninfo: Version: 0.0.1-alpha.27\ninfo: Args: [\"ty\", \"check\"]\ninfo: run with `RUST_BACKTRACE=1` environment variable to show the full backtrace information\ninfo: query stacktrace:\n   0: is_equivalent_to_object_inner(Id(26801))\n             at crates/ty_python_semantic/src/types/instance.rs:663\n             cycle heads: infer_definition_types(Id(380d)) -> iteration = 2\n   1: infer_deferred_types(Id(3808))\n             at crates/ty_python_semantic/src/types/infer.rs:141\n             cycle heads: infer_definition_types(Id(380c)) -> iteration = 2, TypeVarInstance < 'db >::lazy_bound_(Id(1e801)) -> iteration = 2\n   2: TypeVarInstance < 'db >::lazy_bound_(Id(1e800))\n             at crates/ty_python_semantic/src/types.rs:8734\n   3: infer_definition_types(Id(380d))\n             at crates/ty_python_semantic/src/types/infer.rs:94\n   4: infer_deferred_types(Id(3809))\n             at crates/ty_python_semantic/src/types/infer.rs:141\n   5: TypeVarInstance < 'db >::lazy_bound_(Id(1e801))\n             at crates/ty_python_semantic/src/types.rs:8734\n   6: infer_definition_types(Id(380c))\n             at crates/ty_python_semantic/src/types/infer.rs:94\n   7: infer_scope_types(Id(2800))\n             at crates/ty_python_semantic/src/types/infer.rs:70\n   8: check_file_impl(Id(c00))\n             at crates/ty_project/src/lib.rs:535\n\n\nFound 2 diagnostics\nWARN A fatal error occurred while checking some files. Not all project files were analyzed. See the diagnostics list above for details.\n```\n</details>\n",
      "closed_by": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1587/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1585",
      "id": 3639534245,
      "node_id": "I_kwDOOje-Bs7Y7uKl",
      "number": 1585,
      "title": "support try/except imports of typing special forms",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-11-18T18:40:10Z",
      "updated_at": "2025-12-19T01:09:16Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Some projects (at least graphql-core) import typing special forms like this, rather than using `sys.version_info` checks:\n\n```py\ntry:\n    from typing import TypeGuard\nexcept ImportError:\n    from typing_extensions import TypeGuard\n```\n\nWe handle this fine on Python versions in which `typing.TypeGuard` exists (in that case `typing.TypeGuard` and `typing_extensions.TypeGuard` are the same object, so the union resolves to just that object.) We don't handle it when checking on an older Python where the `typing_extensions` fallback is necessary. In that case we emit a diagnostic on the import from `typing`, of course, and then we end up with a union of `Unknown | typing_extensions.TypeGuard`, which our special-form-handling code does not treat as `TypeGuard`.\n\nMypy, pyright, and pyrefly don't handle this either.\n\nThe one thing we do differently (since https://github.com/astral-sh/ruff/pull/21503) is that we also emit a diagnostic on e.g. `TypeGuard[int]` in an annotation, when the `TypeGuard` symbol is `Unknown | typing_extensions.TypeGuard`. Arguably this is good, since it alerts you to the fact that your typeguard function is not actually doing any narrowing, and gives you a better clue as to why? But we could also silence this.\n\nIf we wanted to support this pattern, some options could be:\n1. Understand `try... except ImportError` as a statically-known branch, given existence / non-existence of the import. This would also help us in other similar import-fallback cases.\n2. Handle the union with Unknown as a special case in our type expression parsing. (This might result in false negatives if the union with Unknown comes from a weirder source that we wouldn't want to support?)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1585/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1584",
      "id": 3638716318,
      "node_id": "I_kwDOOje-Bs7Y4mee",
      "number": 1584,
      "title": "parameter-already-assigned when unpacking list in function call",
      "user": {
        "login": "Castavo",
        "id": 47494402,
        "node_id": "MDQ6VXNlcjQ3NDk0NDAy",
        "avatar_url": "https://avatars.githubusercontent.com/u/47494402?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Castavo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 9,
      "created_at": "2025-11-18T15:19:25Z",
      "updated_at": "2026-01-09T11:14:21Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen unpacking a list inside a function call, it seems as though ty interprets it as filling up all arguments available in the function.\n\nThe following : \n```py\ndef test(l1: str, l2: str, other: float):\n    ...\n\ntest(*[\"a\", \"b\"], other=0.1)\n```\n(Also found in [playground](https://play.ty.dev/a20f2bb1-e1bf-4556-aa4a-6bc8a49baf46))\n\nGives both `invalid-argument-type` and `parameter-already-assigned`.\n\nI would have expected ty to be more lenient here: trust the keyword assignment of `other`, and then fill the rest of the arguments with the unpacked list\n\n### Version\n\n7a739d6b7",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1584/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1581",
      "id": 3637795720,
      "node_id": "I_kwDOOje-Bs7Y1FuI",
      "number": 1581,
      "title": "Hover on variable in a `Callable` shows the entire signature",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-18T11:55:28Z",
      "updated_at": "2025-11-18T11:56:03Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe hover content on `P` in the following snippet shows the signature of the `Callable` instead of the type of `P`:\n\n```py\nfrom typing import Callable, ParamSpec\n\nP = ParamSpec(\"P\")\n\ndef f(c: Callable[P, int]): ...\n```\n\nScreenshot:\n\n<img width=\"576\" height=\"338\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/e1293b69-af5f-44ac-994a-e861fc7eda27\" />\n\nThis isn't specific to `ParamSpec`, any variable used in that position (even though it's invalid type form) results in the hover content being the signature display.\n\nPlayground: https://play.ty.dev/5b9cc51f-77ac-447b-b4e9-f6ac44dc4e5c\n\n### Version\n\n7a739d6b7",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1581/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1578",
      "id": 3633643619,
      "node_id": "I_kwDOOje-Bs7YlQBj",
      "number": 1578,
      "title": "Consider unsafely assuming in narrowing that multiple inheritance of user types and builtin containers won't happen",
      "user": {
        "login": "RandomBrainCode",
        "id": 60123375,
        "node_id": "MDQ6VXNlcjYwMTIzMzc1",
        "avatar_url": "https://avatars.githubusercontent.com/u/60123375?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/RandomBrainCode",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        },
        "1": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-11-17T14:44:47Z",
      "updated_at": "2025-12-26T17:48:47Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIs it possible for Ty to infer the type of the Iterator Variable when Iterator is properly defined?\n\nIn the below example running, `area` is properly defined above\n\n```\n\t\tif allowed:\n\t\t\tarea: list[Area] = await user.get_allowed_areas()\n\t\telse:\n\t\t\tarea: Area = await user.area_get()\n```\n\nbut when I run `ty check`, I get the following\n```\nerror[unresolved-attribute]: Object of type `object` has no attribute `get_model`\n   --> app/routers/me.py:113:36\n    |\n112 |     if isinstance(area, list):\n113 |         models: list[AreaModel] = [await a.get_model() for a in area]\n    |                                          ^^^^^^^^^^^\n114 |         return JSONResponse(content=loads(dumps([a.content() for a in models])), status_code=200)\n    |\ninfo: rule `unresolved-attribute` is enabled by default\n```\n\nI was able to resolve it by adding `a: Area` above line 113, but that causes ruff to throw warning `Local variable 'a' is annotated but never used`\n\nOne thing, I am not sure if this could be impacting it, but the variable `area` can actually be of type `Area` or type `list[Area]`, hence the `if isinstance(area, list):` at line 112.\n\n### Version\n\nty 0.0.1-alpha.26 (b225fd8b4 2025-11-10)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1578/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1577",
      "id": 3633322537,
      "node_id": "I_kwDOOje-Bs7YkBop",
      "number": 1577,
      "title": "lint for missing-module-source",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8760037609,
          "node_id": "LA_kwDOOje-Bs8AAAACCiOQ6Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/lint",
          "name": "lint",
          "color": "a3b2aa",
          "default": false,
          "description": "Label for features that we would implement as lint rules, not core type checker features"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-11-17T13:21:21Z",
      "updated_at": "2025-11-17T17:07:03Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "At least Pyrefly and Pyright both support linting for modules where the typing stubs can be found, but the runtime modules are missing:\n\n> reportMissingModuleSource [boolean or string, optional]: Generate or suppress diagnostics for imports that have no corresponding source file. This happens when a type stub is found, but the module source file was not found, indicating that the code may fail at runtime when using this execution environment. Type checking will be done using the type stub. The default value for this setting is \"warning\". \n> https://microsoft.github.io/pyright/#/configuration?id=type-check-diagnostics-settings",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1577/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1575",
      "id": 3632810156,
      "node_id": "I_kwDOOje-Bs7YiEis",
      "number": 1575,
      "title": "Go-to definition in hover",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-11-17T10:56:13Z",
      "updated_at": "2025-11-20T20:59:46Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In rust-analyzer, I can click on `Command` to jump to its definition. \n\n<img width=\"595\" height=\"315\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/28156db4-d882-4f3e-8458-1d08a20e4946\" />\n\nWe should also support this in ty\n\n```py\nfrom typing import TypedDict\n\nclass Test(TypedDict):\n    name: str\n    age: int\n\n\n\ntests = [Test(), Test()]\n\n\nfor test in tests:\n    pass\n```\n\nHovering `test` reveals `Test`, it should be possible to click on `Test` and navigate to its definition\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1575/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1570",
      "id": 3628745705,
      "node_id": "I_kwDOOje-Bs7YSkPp",
      "number": 1570,
      "title": "[playground] External Python packages",
      "user": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8568562675,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rnj8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/playground",
          "name": "playground",
          "color": "1C71A4",
          "default": false,
          "description": "A playground-specific issue"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-11-15T14:01:02Z",
      "updated_at": "2025-11-19T16:59:37Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Being able to use external Python packages in the ty playground would be very useful for things like bug reports.\n\nThe ty playground uses pyodide to run scripts. pyodide has a lightweight package manager called micropip, which I think we can leverage. Installed packages appear to be accessible via `pyodide.FS`.\n\nhttps://micropip.pyodide.org/en/stable/project/api.html#module-micropip\n\n```js\nawait pyodide.loadPackage(\"micropip\");\nconst micropip = pyodide.pyimport(\"micropip\");\nawait micropip.install('snowballstemmer');\n```\n\nIt seems that micropip does not have as full-featured package management as pip/uv, but being able to download Python code would be sufficient.\n\nThe interface I imagine would allow dependencies to be specified by adding a \"dependencies\" section to ty.json, or by uploading a uv.lock file. Of course, micropip doesn't understand uv.lock, but dependencies can be specified via a pyodide-lock.json, a pyodide-specific lock file. In other words, all we need to do is implement a conversion from uv.lock to pyodide-lock.json.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1570/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1568",
      "id": 3627270638,
      "node_id": "I_kwDOOje-Bs7YM8Hu",
      "number": 1568,
      "title": "Add context sensitive keyword completions for `in` and `as` in some cases",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-11-14T21:41:58Z",
      "updated_at": "2025-11-14T21:41:58Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Like we did in https://github.com/astral-sh/ruff/pull/21291, we should be able to provide very specific keyword completions for `in`. For example, `for name <CURSOR>`.\n\nWe might be able to do the same for `import module <CURSOR>`, but IMO that might be over-stepping a bit. The user could also just hit enter to go to the next line. The additional whitespace I think _suggests_ `as`, but it isn't required. We could offer `as` for `import module a<CURSOR>` though. And similarly for `from module import foo a<CURSOR>`. I think similar reasoning applies to `with`, `except` and `match` statements.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1568/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1567",
      "id": 3627266288,
      "node_id": "I_kwDOOje-Bs7YM7Dw",
      "number": 1567,
      "title": "Consider unsafely assuming that subclasses don't add `__await__`, for better `isawaitable` narrowing",
      "user": {
        "login": "alexmacnorthstar",
        "id": 242989745,
        "node_id": "U_kgDODnu6sQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/242989745?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/alexmacnorthstar",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        },
        "1": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-11-14T21:40:24Z",
      "updated_at": "2025-11-18T16:10:42Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nimport asyncio\nimport inspect\nfrom typing import Callable, Awaitable, Any\n\ndef foo_1():\n  return [1,2,3]\n\nasync def foo_2():\n  return [1,2,3]\n\nasync def test(\n  foo: list[int] | Awaitable[list[int]]\n):\n  intlist = await foo if inspect.isawaitable(foo) else foo\n  for x in intlist:\n    print(x)\n\nasync def main():\n  await test(foo_1())\n  await test(foo_2())\n\nasyncio.run(main())\n```\n\nGives\n\n```\nerror[not-iterable]: Object of type `object` is not iterable\n  --> /Users/alex/Desktop/ty_test.py:15:12\n   |\n13 | ):\n14 |   intlist = await foo if inspect.isawaitable(foo) else foo\n15 |   for x in intlist:\n   |            ^^^^^^^\n16 |     print(x)\n   |\ninfo: It doesn't have an `__iter__` method or a `__getitem__` method\ninfo: rule `not-iterable` is enabled by default\n\nFound 1 diagnostic\n```\n\nThe online playground shows that \"intlist\" is inferred as type \"object\" but it should be type \"list[int]\"\n\n### Version\n\nty 0.0.1-alpha.26 (b225fd8b4 2025-11-10)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1567/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1566",
      "id": 3627212277,
      "node_id": "I_kwDOOje-Bs7YMt31",
      "number": 1566,
      "title": "Consider unsafely narrowing non-literal type to literal based on equality check",
      "user": {
        "login": "alexmacnorthstar",
        "id": 242989745,
        "node_id": "U_kgDODnu6sQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/242989745?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/alexmacnorthstar",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        },
        "1": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-11-14T21:24:41Z",
      "updated_at": "2025-12-23T02:59:34Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nUsing a guard to check if a str is a value from a list of literals like this:\n\n```py\nfrom typing import Literal\n\ntype MyType = Literal['test1', 'test2']\n\ndef test(foo:str) -> MyType:\n  valid_vals: list[MyType] = ['test1', 'test2']\n  if foo in valid_vals:\n    return foo\n  return 'test1'\n```\n\nGives:\n\n```\nerror[invalid-return-type]: Return type does not match returned value\n --> ty_test.py:5:22\n  |\n3 | type MyType = Literal['test1', 'test2']\n4 |\n5 | def test(foo:str) -> MyType:\n  |                      ------ Expected `MyType` because of return type\n6 |   valid_vals: list[MyType] = ['test1', 'test2']\n7 |   if foo in valid_vals:\n8 |     return foo\n  |            ^^^ expected `MyType`, found `str`\n9 |   return 'test1'\n  |\ninfo: rule `invalid-return-type` is enabled by default\n\nFound 1 diagnostic\n```\n\nBut foo is constrained to only valid values of the MyType literal at this point\n\n### Version\n\nty 0.0.1-alpha.26 (b225fd8b4 2025-11-10)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1566/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1565",
      "id": 3627209590,
      "node_id": "I_kwDOOje-Bs7YMtN2",
      "number": 1565,
      "title": "LSP panic: assertion failed: old_memo.revisions.changed_at <= revisions.changed_atquery",
      "user": {
        "login": "correctmost",
        "id": 134317971,
        "node_id": "U_kgDOCAGHkw",
        "avatar_url": "https://avatars.githubusercontent.com/u/134317971?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/correctmost",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-11-14T21:23:37Z",
      "updated_at": "2025-12-31T15:35:20Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI'm not sure what triggers this panic because I've only seen it twice over the course of a few weeks.  \n\nHopefully the log has some useful info:\n\n```\n2025-11-14 15:03:01.451648045  INFO Version: 0.0.1-alpha.26\n2025-11-14 15:03:02.694769551  INFO Defaulting to python-platform `linux`\n2025-11-14 15:03:02.702819518  INFO Python version: Python 3.13, platform: linux\n2025-11-14 15:03:03.187841405  INFO Indexed 285 file(s) in 0.188s\n2025-11-14 15:05:02.050690516  INFO Initializing the default project\n2025-11-14 15:05:02.051145907  INFO Defaulting to python-platform `linux`\n2025-11-14 15:05:02.058633824  INFO Python version: Python 3.13, platform: linux\n2025-11-14 15:49:18.766983034  INFO Checking file `untitled:Untitled-1` took more than 100ms (222.307918ms)\n2025-11-14 15:50:17.476954023  INFO Checking file `untitled:Untitled-1` took more than 100ms (163.922204ms)\n2025-11-14 15:50:18.527326740  WARN Propagating panic for cycle head that panicked in an earlier execution in that revision\n2025-11-14 15:50:18.530508190 ERROR An error occurred with request ID 5449: request handler panicked at /root/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/05a9af7/src/function/backdate.rs:42:17:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_atquery stacktrace:\n\n\nrun with `RUST_BACKTRACE=1` environment variable to display a backtrace\n\n[Error - 3:50:18 PM] Request textDocument/diagnostic failed.\n  Message: request handler panicked at /root/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/05a9af7/src/function/backdate.rs:42:17:\nassertion failed: old_memo.revisions.changed_at <= revisions.changed_atquery stacktrace:\n\n\nrun with `RUST_BACKTRACE=1` environment variable to display a backtrace\n\n  Code: -32603 \n```\n\n### Version\n\n0.0.1-alpha.26",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1565/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1560",
      "id": 3626538172,
      "node_id": "I_kwDOOje-Bs7YKJS8",
      "number": 1560,
      "title": "Rename file refactor",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-11-14T17:35:12Z",
      "updated_at": "2025-11-14T17:35:13Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Update import statements when a user renames a file",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1560/reactions",
        "total_count": 12,
        "+1": 12,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1559",
      "id": 3626448508,
      "node_id": "I_kwDOOje-Bs7YJzZ8",
      "number": 1559,
      "title": "Emit a diagnostic if a `@type_check_only` symbol is imported in a runtime context",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-11-14T17:07:55Z",
      "updated_at": "2025-11-18T16:10:41Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "E.g.\n\n````md\n\n`stub.pyi`:\n\n```pyi\nfrom typing import type_check_only, Protocol\n\n@type_check_only\nclass SupportsNext(Protocol):\n    def __next__(self): ...\n\nX: SupportsNext\n```\n\n`main.py`:\n\n```py\n# We should emit a diagnostic here:\n# `SupportsNext` doesn't exist at runtime, it's only for the type checker\nfrom stub import SupportsNext\n```\n````\n\nThe diagnostic should not fire if the `import` statement is inside a stub file. Ideally we would also suppress the diagnostic if the `import` statement is inside an `if TYPE_CHECKING` block, but doing that well depends on implementing https://github.com/astral-sh/ty/issues/1553.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1559/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1558",
      "id": 3626336853,
      "node_id": "I_kwDOOje-Bs7YJYJV",
      "number": 1558,
      "title": "Auto-import completion suggestions should be ranked below other suggestions if the symbol is `@type_check_only`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "2": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-11-14T16:34:25Z",
      "updated_at": "2025-11-17T16:35:36Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://github.com/astral-sh/ruff/pull/20910 implemented a feature where `@type_check_only` symbols are ranked below other symbols in completion suggestions. However, this was implemented only for symbols in the same file -- and this has limited usefulness, since generally if your cursor in a `.py` file, most symbols in your file are not going to be marked as `@type_check_only`. It's a feature that's used much more often in stubs. Ideally, we would also rank auto-import suggestions below other auto-import suggestions if the relevant symbols are `@type_check_only`.\n\nThis is a bit of a hard problem, however, as we cannot eagerly infer the type of all auto-import suggestions. Possibly we can lazily infer the types of these symbols, but even that might be too much of a performance hit. If we can't use the type checker at all for this information, we may have to evaluate whether implementing this feature is worth the complexity.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1558/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1557",
      "id": 3626315110,
      "node_id": "I_kwDOOje-Bs7YJS1m",
      "number": 1557,
      "title": "`@type_check_only` symbols should not be ranked below other symbols in completion suggestions if the cursor is in an `if TYPE_CHECKING` block or stub file",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "2": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-14T16:28:33Z",
      "updated_at": "2025-11-14T17:03:51Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "If the user's cursor is in either of these contexts, it's okay to use or import a symbol that doesn't exist at runtime. The stub-file part of this is easy: we just need to check whether the file extension is `.pyi`. The `TYPE_CHECKING` part of this can't be done well without implementing https://github.com/astral-sh/ty/issues/1553 first, however.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1557/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1553",
      "id": 3625653293,
      "node_id": "I_kwDOOje-Bs7YGxQt",
      "number": 1553,
      "title": "`TYPE_CHECKING` constraints should apply to basic blocks, not scopes",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-14T13:33:31Z",
      "updated_at": "2025-11-18T16:10:41Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We currently track whether an entire scope is enclosed inside an `if TYPE_CHECKING` block. But there are certain semantics that it would be useful to apply to `TYPE_CHECKING` blocks where tracking this at the scope level is not sufficiently fine-grained. For example, if your code supports Python 3.9, we allow this type alias (it doesn't really matter that it uses the PEP-604 syntax, since it will never be executed at runtime, and the intent is clear):\n\n```py\nimport typing\n\nif typing.TYPE_CHECKING:\n    class Foo:\n        X = int | str\n```\n\nbut we don't support this type alias, which is something a user is much more likely to write:\n\n```py\nimport typing\n\nif typing.TYPE_CHECKING:\n    X = int | str\n```\n\nAnother case where this would be useful is `@type_check_only`. Currently we always put symbols marked as `@type_check_only` at the bottom of autocompletion suggestions, since they're not available at runtime. But this is suboptimal: ideally we wouldn't include them in the list of suggestions at all if we're outside a `TYPE_CHECKING` block (or maybe we'd keep them at the bottom of the list of suggestions), but we wouldn't apply any downranking for these symbols if the user's cursor is inside a `TYPE_CHECKING` block, e.g.\n\n```py\nif TYPE_CHECKING:\n    # we could freely suggest typeshed's `_SupportsSynchronousAnext` protocol here, for example\n    `_SupportsS<CURSOR>\n```\n\nWe could also freely suggest modules inside `TYPE_CHECKING` blocks that we know not to exist at runtime, such as the `_typeshed` module (which contains some very useful types!):\n\n```py\nif TYPE_CHECKING:\n    from _typesh<CURSOR>\n```\n\nRuff also has a number of linter rules that require a fine-grained analysis of which basic blocks are inside `if TYPE_CHECKING` conditions. If we ever want to reimplement these rules using ty's semantic model, we will need to replicate this fine-grained understanding.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1553/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1546",
      "id": 3624749625,
      "node_id": "I_kwDOOje-Bs7YDUo5",
      "number": 1546,
      "title": "Solid variable renaming",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-11-14T09:23:37Z",
      "updated_at": "2025-12-31T16:38:42Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We've gotten reports (without MRE's, unfortunately) that the rename feature often misses references. \n\nWe should revisit the rename feature and stabilizie it once we have more confidence in it. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1546/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1545",
      "id": 3624634696,
      "node_id": "I_kwDOOje-Bs7YC4lI",
      "number": 1545,
      "title": "inlay hints for return types",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 8,
      "created_at": "2025-11-14T08:51:44Z",
      "updated_at": "2025-12-09T00:49:22Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Requires https://github.com/astral-sh/ty/issues/128",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1545/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1541",
      "id": 3622689923,
      "node_id": "I_kwDOOje-Bs7X7dyD",
      "number": 1541,
      "title": "Subclass definitions should be validated against superclass `__init_subclass__` definitions",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-11-13T20:20:16Z",
      "updated_at": "2025-11-13T20:20:16Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe `Bar` definition here fails at runtime, but we currently don't catch the error:\n\n```py\nclass Foo:\n    def __init_subclass__(cls, arg: int): ...\n    \nclass Bar(Foo): ...\n```\n\n```pytb\n>>> class Bar(Foo): ...\n... \nTraceback (most recent call last):\n  File \"<python-input-2>\", line 1, in <module>\n    class Bar(Foo): ...\nTypeError: Foo.__init_subclass__() missing 1 required positional argument: 'arg'\n```\n\nIn order for it to succeed, it would need to be something like\n\n```py\nclass Foo:\n    def __init_subclass__(cls, arg: int): ...\n    \nclass Bar(Foo, arg=42): ...\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1541/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1540",
      "id": 3621884941,
      "node_id": "I_kwDOOje-Bs7X4ZQN",
      "number": 1540,
      "title": "Flaky tests in CI",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568513779,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkk8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/ci",
          "name": "ci",
          "color": "905251",
          "default": false,
          "description": "Related to internal CI tooling"
        },
        "1": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-11-13T16:19:34Z",
      "updated_at": "2026-01-09T18:13:24Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nCollecting the flaky tests that we're seeing so far, re-running them makes them pass:\n\n- ~~`ty_server::e2e pull_diagnostics::on_did_open`: https://github.com/astral-sh/ruff/actions/runs/19290646588/job/55160349507?pr=21363#step:7:5873~~\n- `ty::file_watching directory_renamed`: https://github.com/astral-sh/ruff/actions/runs/19336380853/job/55312446927?pr=21421#step:7:5706\n- `ty::file_watching unix::symlink_inside_project`: https://github.com/astral-sh/ruff/actions/runs/19322265094/job/55265874405?pr=21419#step:7:5706\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1540/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1537",
      "id": 3618777885,
      "node_id": "I_kwDOOje-Bs7Xsisd",
      "number": 1537,
      "title": "improve UX around stubs packages",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-11-13T00:26:16Z",
      "updated_at": "2025-12-18T00:50:47Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 2,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For example, if we see that you are type-checking a project that depends on a package with a stubs package, but you don't have that stubs package installed, we could suggest that you install it.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1537/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1536",
      "id": 3618773081,
      "node_id": "I_kwDOOje-Bs7XshhZ",
      "number": 1536,
      "title": "Support functools.partial",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-11-13T00:24:01Z",
      "updated_at": "2025-11-13T00:24:01Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The type stubs for `partial` can't describe its behavior in a useful way, so type checkers special case it. We should too, so that the return type of `partial` tracks the full underlying signature and the partial arguments provided, and we can later combine the partial arguments with newly-supplied arguments and check them against the wrapped signature. For example:\n\n```py\nfrom functools import partial\n\ndef f(a: int, b: str) -> bool: ...\n\ng = partial(f, 1)\n\ng(1, \"foo\") # error: too many arguments\ng(1) # error: int not assignable to str\ng(\"foo\") # good\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1536/reactions",
        "total_count": 8,
        "+1": 8,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1535",
      "id": 3618690835,
      "node_id": "I_kwDOOje-Bs7XsNcT",
      "number": 1535,
      "title": "Support Concatenate special form",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-11-12T23:51:53Z",
      "updated_at": "2025-12-15T19:35:14Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://typing.python.org/en/latest/spec/generics.html#paramspec",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1535/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1526",
      "id": 3613825896,
      "node_id": "I_kwDOOje-Bs7XZpto",
      "number": 1526,
      "title": "`import whatever.thispackage.a.b` in an `__init__.py` should introduce the submodule attribute `a`",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-11-11T20:36:49Z",
      "updated_at": "2025-11-11T20:37:05Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We do this for `from whatever.thispackage.a.b import c` but not the equivalent `import`.\n\n[Nonstandard-imports contains a test for this](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/import/nonstandard_conventions.md#import-of-nested-submodule-in-__init__)\n\nThis is just a random inconsistency because `ImportFromSubmoduleDefinitionNodeRef` is *only* for `from...import`.\n\nThe fix would be to introduce an equivalent of this logic:\n\nhttps://github.com/astral-sh/ruff/blob/e4374f14ed12873541d9a9ccca7eea92456684f6/crates/ty_python_semantic/src/semantic_index/builder.rs#L1452-L1497\n\nTo here:\n\nhttps://github.com/astral-sh/ruff/blob/e4374f14ed12873541d9a9ccca7eea92456684f6/crates/ty_python_semantic/src/semantic_index/builder.rs#L1420-L1422\n\nAnd then you need to either:\n\n* change `ImportFromSubmoduleDefinitionNode(Ref)` to take either an `ast::StmtImportFrom` *or* an `ast::StmtImport` (make an `AnyImport` enum?)\n* introduce `ImportSubmoduleDefinitionNode(Ref)` that just copy-pastes all the logic\n\nThe enum approach is probably the better one.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1526/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1522",
      "id": 3612659357,
      "node_id": "I_kwDOOje-Bs7XVM6d",
      "number": 1522,
      "title": "dataclass: wrong type on field access via class",
      "user": {
        "login": "Tinche",
        "id": 1909233,
        "node_id": "MDQ6VXNlcjE5MDkyMzM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1909233?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Tinche",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592544541,
          "node_id": "LA_kwDOOje-Bs8AAAACACfTHQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/dataclasses",
          "name": "dataclasses",
          "color": "1d76db",
          "default": false,
          "description": "Issues relating to dataclasses and dataclass_transform"
        },
        "1": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-11-11T14:55:02Z",
      "updated_at": "2025-11-11T19:34:52Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nMRE:\n\n```python\nfrom dataclasses import dataclass\n\n@dataclass\nclass A:\n    a: int\n\n@dataclass(slots=True)\nclass ASlot:\n    a: int\n\nreveal_type(A.a)\nreveal_type(ASlot.a)\n```\n\nPlayground link: https://play.ty.dev/1eb91b94-d161-45d1-9e98-81630885079e\n\nIn both cases, ty reveals `int`. At runtime, the first case will raise an AttributeError (`a` does not exist on the class), and in the second the type is completely different [a member_descriptor instance that all slot classes have]).\n\n### Version\n\nty 0.0.1-alpha.26 (b225fd8b4 2025-11-10)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1522/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1520",
      "id": 3610381818,
      "node_id": "I_kwDOOje-Bs7XMg36",
      "number": 1520,
      "title": "File level `ty` suppression comments",
      "user": {
        "login": "klonuo",
        "id": 361447,
        "node_id": "MDQ6VXNlcjM2MTQ0Nw==",
        "avatar_url": "https://avatars.githubusercontent.com/u/361447?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/klonuo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568539448,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmJOA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/suppression",
          "name": "suppression",
          "color": "705393",
          "default": false,
          "description": "Related to supression of violations e.g. ty:ignore"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-11T02:05:45Z",
      "updated_at": "2025-11-18T16:10:41Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHi,\n\nI had a file with typing issue on several locations and thought to make file level comment to suppress it.\n\nI tried to add the directive in the top of the file:\n```\n# ty: ignore[possibly-missing-attribute]\n```\nas such approach works for ruff, but it didn't work.\n\nReading the docs I couldn't find a solution either (besides editing config file).\n\nI then read about `type:ignore` PEP 484 directive and that worked:\n\n```\n# type: ignore[possibly-missing-attribute]\n```\n\nNow I solved my problem and know the approach, but thought to write that maybe allowing also `ty: ignore` for file level suppression would be intuitive.\n\n### Version\n\nty 0.0.1-alpha.25",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1520/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1519",
      "id": 3610216969,
      "node_id": "I_kwDOOje-Bs7XL4oJ",
      "number": 1519,
      "title": "add a diagnostic for NewTypes with TypeVars in their base type",
      "user": {
        "login": "oconnor663",
        "id": 860932,
        "node_id": "MDQ6VXNlcjg2MDkzMg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/860932?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/oconnor663",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-11-11T00:42:19Z",
      "updated_at": "2025-11-11T00:44:56Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "TODO from: https://github.com/astral-sh/ruff/pull/21157#pullrequestreview-3445518919\n\nSomething like this should be an error:\n\n```py\nT = TypeVar(\"T\")\nN = NewType(\"N\", list[T])  # currently accepted, but not a \"proper class\"\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1519/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1503",
      "id": 3603343006,
      "node_id": "I_kwDOOje-Bs7Wxqae",
      "number": 1503,
      "title": "Method call on constrained typevar emits invalid-argument-type",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "2": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-11-08T10:14:55Z",
      "updated_at": "2025-12-26T09:11:31Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Consider the following example. ty currently emits two errors for the `t.method()` call because `t.method` creates a union of bound method objects where `C.method` and `D.method` are bound to `T@f`, respectively. Instead, attribute access should properly distribute across the union `C | D` and yield a union of bound method objects where `C.method` is bound to an instance of `C`, and `D.method` is bound to an instance of `D`:\n\n```py\nclass C:\n    def method(self) -> int:\n        return 0\n\nclass D:\n    def method(self) -> str:\n        return \"\"\n\ndef f[T: (C, D)](t: T):\n    # Argument to bound method `method` is incorrect: Expected `C`, found `T@f` (invalid-argument-type)\n    # Argument to bound method `method` is incorrect: Expected `D`, found `T@f` (invalid-argument-type)\n    reveal_type(t.method())\n```\nhttps://play.ty.dev/c102d2bd-de4d-497c-9144-9f45def4196a\n\n\nRelated: https://github.com/astral-sh/ty/issues/138",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1503/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1501",
      "id": 3602663865,
      "node_id": "I_kwDOOje-Bs7WvEm5",
      "number": 1501,
      "title": "Auto-remove unused `type: ignore`",
      "user": {
        "login": "janosh",
        "id": 30958850,
        "node_id": "MDQ6VXNlcjMwOTU4ODUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/30958850?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/janosh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568539448,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmJOA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/suppression",
          "name": "suppression",
          "color": "705393",
          "default": false,
          "description": "Related to supression of violations e.g. ty:ignore"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-11-08T03:10:46Z",
      "updated_at": "2025-11-23T14:09:44Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "going one step beyond #278 (which would be much appreciated!), would be great if there was a flag to enable automatically remove any unused `# type: ignore` comments",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1501/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1496",
      "id": 3596584548,
      "node_id": "I_kwDOOje-Bs7WX4Zk",
      "number": 1496,
      "title": "Reduce verbosity of inlay hints for assignments that use unpacking",
      "user": {
        "login": "smortezah",
        "id": 19313488,
        "node_id": "MDQ6VXNlcjE5MzEzNDg4",
        "avatar_url": "https://avatars.githubusercontent.com/u/19313488?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/smortezah",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-11-06T16:31:01Z",
      "updated_at": "2026-01-09T04:10:35Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nHow can I hide inferred types for a specific line since it exceeds my line limit and I can’t hard wrap the code on that line?\n\nIs there any tag we could use at the end of the line, like `# ty: ignore`?\n\n```python\n# What I've written\nmodel_instance, model_settings = create_model_and_settings(model=model)\n\n# What is shown in VS Code (extra info is in faint grey)\nmodel_instance: OpenAIChatCompletionsModel, model_settings: ModelSettings = create_model_and_settings(model=model)\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1496/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1495",
      "id": 3596533594,
      "node_id": "I_kwDOOje-Bs7WXr9a",
      "number": 1495,
      "title": "provide a good option for users who want callable types with all `FunctionType` attributes",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9597629813,
          "node_id": "LA_kwDOOje-Bs8AAAACPBA1dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/callables",
          "name": "callables",
          "color": "5d4406",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 9,
      "created_at": "2025-11-06T16:18:22Z",
      "updated_at": "2025-12-23T00:21:58Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "See https://github.com/astral-sh/ty/issues/491#issuecomment-3462267064 for more detailed discussion.\n\nIn particular, other type-checkers will assume all Callable types have `FunctionType.__get__`, while simultaneously assuming that they _don't_ necessarily always behave as a bound-method descriptor. This is of course inconsistent, but we may need to do the same for compatibility.\n\nSimilar for existence of other `FunctionType` attributes, such as `__name__`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1495/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1493",
      "id": 3594538005,
      "node_id": "I_kwDOOje-Bs7WQEwV",
      "number": 1493,
      "title": "Unpacking a typed dictionary into another should transfer defined keys.",
      "user": {
        "login": "lypwig",
        "id": 1665542,
        "node_id": "MDQ6VXNlcjE2NjU1NDI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1665542?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/lypwig",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9596740363,
          "node_id": "LA_kwDOOje-Bs8AAAACPAKjCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typeddict",
          "name": "typeddict",
          "color": "46775a",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-11-06T07:43:49Z",
      "updated_at": "2025-12-30T00:48:00Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```python\nfrom typing import TypedDict\n\nclass MyTypedDict1(TypedDict):\n    aaa: int\n    bbb: int\n\n\nclass MyTypedDict2(TypedDict):\n    aaa: int\n    bbb: int\n    ccc: int\n\nd1: MyTypedDict1 = {\n    \"aaa\": 1,\n    \"bbb\": 2,\n}\n\nd2: MyTypedDict2 = {\n    **d1,\n    \"ccc\": 3,\n}\n```\n\n> Missing required key 'aaa' in TypedDict `MyTypedDict2` constructor (missing-typed-dict-key) [Ln 18, Col 20]\n> Missing required key 'bbb' in TypedDict `MyTypedDict2` constructor (missing-typed-dict-key) [Ln 18, Col 20]\n\nhttps://play.ty.dev/5bf7c51c-fb7d-4a32-8fc3-799f1e014d76\n\n### Version\n\n0.0.1a25",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1493/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1490",
      "id": 3592164397,
      "node_id": "I_kwDOOje-Bs7WHBQt",
      "number": 1490,
      "title": "`from .a.b import c` in `__init__.py(i)` should define submodule attributes for *all* files",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-05T17:45:40Z",
      "updated_at": "2025-11-11T21:20:08Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is kind of a followup to https://github.com/astral-sh/ruff/pull/21173 and pertains to behaviours described in [imports/nonstandard_conventions.md](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/import/nonstandard_conventions.md)\n\nWe do not currently consider `from .a.b import c` in an `__init__.py(i)` as ensuring `thispackage.a.b` or `thispackage.a.b.c` are submodule attributes in files that import `thispackage`, even though logically anything that acquires a reference to that module must have executed that import.\n\nIdeally it should, but I think for safety it requires:\n\n* #1488\n\n(This one may be a bad idea for performance/caching/isolation reasons, but I think it might be ok since we have to load and analyze that package's module anyway when you access an attribute on it?)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1490/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1489",
      "id": 3592157057,
      "node_id": "I_kwDOOje-Bs7WG_eB",
      "number": 1489,
      "title": "`from a.b import c` should define submodule attributes in the current file",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-05T17:43:32Z",
      "updated_at": "2025-11-11T21:20:11Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is kind of a followup to https://github.com/astral-sh/ruff/pull/21173 and pertains to behaviours described in [imports/nonstandard_conventions.md](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/import/nonstandard_conventions.md)\n\nWe do not currently consider `from a.b import c` as ensuring `a.b` or `a.b.c` are submodule attributes in the current file, meaning (e.g. if you then `import a` or otherwise get access to that module).\n\nIdeally it should, but I think for safety it requires:\n\n* #1488",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1489/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1488",
      "id": 3592140599,
      "node_id": "I_kwDOOje-Bs7WG7c3",
      "number": 1488,
      "title": "`available_submodule_attributes` should probably be considered last instead of first",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-11-05T17:38:51Z",
      "updated_at": "2025-11-11T21:20:14Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "See here for background on `available_submodule_attributes`:\n\nhttps://github.com/astral-sh/ruff/blob/cef6600cf3a7a22db214c6cb5d2393ede4209c37/crates/ty_python_semantic/src/types.rs#L10997-L11060\n\nAs discussed there, `available_submodule_attributes` is dangerously high priority and early in our analysis right now (\"wins all tie-breaks\"). In  https://github.com/astral-sh/ruff/pull/21173 I actually rolled back my own attempts to expand the functionality of it, after we determined it was too semantically limited and heavy of a hammer for the problem we wanted to solve.\n\nThat said, `available_submodule_attributes` still has value, as this is basically the only way to introduce sub-attributes on modules other than the current file (i.e. to encode the effect that `import a.b.c` should make `a.b` and `a.b.c` available in-scope).\n\nI believe we would be able to expand its functionality if we inverted its priority: instead of being the *first* thing we check, it should be the *last* thing we check. That is, if a module otherwise defines a local with that name, it should shadow the submodule attribute. This would make it more ok to eagerly shove as much as possible into `available_submodule_attributes`.\n\n(I'm filling a couple issues that IMO \"need\" this as a prerequisite.) ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1488/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1485",
      "id": 3592076735,
      "node_id": "I_kwDOOje-Bs7WGr2_",
      "number": 1485,
      "title": "`from . import a as b` should still introduce `a` as a local in packages",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-11-05T17:20:29Z",
      "updated_at": "2025-11-11T21:20:17Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is a followup to https://github.com/astral-sh/ruff/pull/21173 and pertains to behaviours described in [imports/nonstandard_conventions.md](https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/import/nonstandard_conventions.md)\n\nCurrently `from .a import b` in an `__init__.py(i)` can introduce a local for `a` (via `ImportFromSubmoduleDefinitionNodeRef`).\n\nSimilarly, `from . import a` introduces the same local (via `ImportFromDefinitionNodeRef`).\n\nWe should *also* support `from . import a as c` in an `__init__.py(i)` introducing the local `a` (via `ImportFromSubmoduleDefinitionNodeRef`). (Ditto for `from whatever.thispackage import a as c` - #1484) \n\nThis reflects the fact that the python runtime introduces the submodule attribute for the first import of `thispackage.a` regardless of how it gets imported, even if you rename it in the import.\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1485/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1483",
      "id": 3591528849,
      "node_id": "I_kwDOOje-Bs7WEmGR",
      "number": 1483,
      "title": "Type variables defined in typeshed's `builtins.pyi` are usable in all files",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-11-05T15:06:54Z",
      "updated_at": "2026-01-09T03:25:28Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWe don't emit a diagnostic on this snippet... but we should, because `_T_co` is not defined 😆\n\n```py\nclass SupportsNext:\n    def __next__(self) -> _T_co:\n        raise NotImplementedError\n```\n\nWe infer `_T_co` as being available here because of its definition in `builtins.pyi` [here](https://github.com/python/typeshed/blob/07b69ab9e92dbe4ca55c48b1c23ebf34b41538f1/stdlib/builtins.pyi#L83). But that definition should be treated as private-to-the-stub, I think.\n\nPossibly we should just filter out typevar definitions when falling back to the builtin scope in name lookup? The same could also be said for type-alias definitions and protocol definitions in `builtins.pyi`, but they're arguably both more useful and less confusing to have available (you might want to use them quoted in type annotations, e.g. `x: \"_PositiveInteger\"` wouldn't be an unreasonable type annotation.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1483/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1480",
      "id": 3590149064,
      "node_id": "I_kwDOOje-Bs7V_VPI",
      "number": 1480,
      "title": "Time Machine pytest fixture hidden behind conditional",
      "user": {
        "login": "mzealey",
        "id": 6083471,
        "node_id": "MDQ6VXNlcjYwODM0NzE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6083471?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mzealey",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-11-05T09:43:09Z",
      "updated_at": "2025-11-05T21:45:16Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nSomehow mypy makes this work, but you can see that https://github.com/adamchainz/time-machine/blob/main/src/time_machine/__init__.py#L409 is hidden behind an `if HAVE_PYTEST` conditional, meaning that it is mentioned by `ty` as a `possibly-missing-attribute`.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1480/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1479",
      "id": 3586922525,
      "node_id": "I_kwDOOje-Bs7VzBgd",
      "number": 1479,
      "title": "Implement \"tagged union\" narrowing for namedtuples and arbitrary nominal types",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 11,
      "created_at": "2025-11-04T14:49:06Z",
      "updated_at": "2026-01-09T15:53:04Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "```py\nclass A:\n    tag: Literal[\"a\"]\n\nclass B:\n    tag: Literal[\"b\"]\n\ndef _(x: A | B):\n    if x.tag == \"a\":\n        reveal_type(x)  # revealed: A\n    else:\n        reveal_type(x)  # revealed: B\n```\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1479/reactions",
        "total_count": 4,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1477",
      "id": 3586815054,
      "node_id": "I_kwDOOje-Bs7VynRO",
      "number": 1477,
      "title": "Show the type alias's name on hover",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "2": {
          "id": 9807383197,
          "node_id": "LA_kwDOOje-Bs8AAAACSJDKnQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20aliases",
          "name": "type aliases",
          "color": "ebd684",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-11-04T14:19:42Z",
      "updated_at": "2025-12-19T12:15:04Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Hovering a type alias currently reveals the aliased type. \n\n<img width=\"313\" height=\"316\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/c2ff2c32-6f9c-4c94-8efc-f5a6ccc74b7a\" />\n\n\nWe should show the type alias's definition instead, similar to pylance and resolve the documentation etc from the target\n\n<img width=\"885\" height=\"408\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/30f7865c-6464-48e3-ba17-7e289cbb6b15\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1477/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1476",
      "id": 3584510652,
      "node_id": "I_kwDOOje-Bs7Vp0q8",
      "number": 1476,
      "title": "Implementing junit style reports",
      "user": {
        "login": "cetanu",
        "id": 2289018,
        "node_id": "MDQ6VXNlcjIyODkwMTg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2289018?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/cetanu",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-11-04T02:53:59Z",
      "updated_at": "2025-12-22T11:18:12Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nHello friends,\n\nI'd like to contribute some code to this project, which as the title alludes to, is JUnit style XML reports!\nThis format is commonly used by CI servers to produce a formatted report that is easy for users to read.\n\nI thought I would firstly ask if this is something you'd like in your project.\nI anticipate some portion of people moving across from mypy to ty will want this feature (me included)\n\nThe second part of my question, is for guidance as to how and where I would start on this because I assume there may be a preference from the maintainers.\n\nFrom a brief glance, it seems that I may have to write this code in rust, and add it to the ruff codebase, in the `ty` crate, possibly by modifying the Printer? If there is a better crate for this, or a new crate would be required, I am happy to do it in whatever way is desired.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1476/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1475",
      "id": 3584218488,
      "node_id": "I_kwDOOje-Bs7VotV4",
      "number": 1475,
      "title": "Narrowing of constrained typevar discards constraint static type generic information",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        },
        "2": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-11-04T00:19:54Z",
      "updated_at": "2026-01-09T20:52:52Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhile reading https://github.com/astral-sh/ruff/pull/21172 , I wanted to try using the changes that PR made, but found a bug. With this code:\n\nhttps://play.ty.dev/a370a55d-5dc3-4da3-aa4b-62a0553b9c16\n```py\nfrom typing import reveal_type\n\n\ndef foo[T: (list[int], None)](x: T) -> T:\n    match x:\n        case list():\n            reveal_type(x)  # Revealed type: `Top[list[Unknown]]`\n    if isinstance(x, list):\n        reveal_type(x)  # Revealed type: `Top[list[Unknown]]`\n    return x\n```\n\nThe two `x`s should be narrowed to `list[int]`, not `Top[list[Unknown]]`. From what I understand reading https://github.com/astral-sh/ruff/pull/21172 , the code now converts the constraint to the union of the top of it's members in the narrowing, so `T` becomes `Top[list[int]] | Top[None]`, but since `list[int]` is a fully static type, `Top[list[int]]` should just be `list[int]`. So it looks like the generic information is getting discarded somewhere along the way.\n\nEdit:\n\nI did some messing around with ty versions, and I found some interesting things:\nIn <=alpha.21 both reveal `T@foo & list[Unknown]`\nIn alpha.22 - alpha.25 only the `isinstance` gives `Top[list[Unknown]]`, the match is still `T@foo & list[Unknown]`\nIn the playground (and presumably in the future alpha.26) the above behavior happens.\n\nSo it looks like this is not a new issue, at least for `isinstance` narrowing.\n\n### Version\n\nplayground (3c8fb6876)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1475/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1473",
      "id": 3583893021,
      "node_id": "I_kwDOOje-Bs7Vnd4d",
      "number": 1473,
      "title": "better inference for generics not fully constrained at their construction",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "ibraheemdev",
          "id": 34988408,
          "node_id": "MDQ6VXNlcjM0OTg4NDA4",
          "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ibraheemdev",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-11-03T21:58:50Z",
      "updated_at": "2026-01-10T08:59:17Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The canonical case of this is an empty list literal, but in everything that follows, we should assume it is generalized to all generic classes, not special-cased for builtin collection types.\n\nWe discussed these two code examples:\n\n```py\ndef a() -> list[int]:\n    x = []\n    y = x\n    return y\n\ndef b() -> list[int | str]:\n    x = []\n    x.append(1)\n    x.append(\"foo\")\n    return x\n```\n\n[Today in both of these cases](https://play.ty.dev/e0499334-8edf-45bb-8533-59ce00b60549) we infer `list[Unknown]` at the list construction, and don't emit any diagnostics on either of these examples. So we avoid false positives by using gradual types, but this is also quite unsound: if the return type of `b` were `list[bytes]`, we still wouldn't emit any diagnostics!\n\n(Similarly, for non-empty list literals without a declared type, we infer the union of `Unknown` with the elements present, which is compatible with the gradual guarantee and avoids false positives, but is similarly unsound with respect to later constraints on the type of the list.)\n\n[Pyright in non-strict mode](https://pyright-play.net/?pyrightVersion=1.1.405&code=CYUwZgBAhgFAlBAtAPggGwJYGcAuBtDAOxwF0AuAWACgJaIAPCAXgjxOrogE9mGO6ATiBwBXAYW7VqoSACN4SVJlwFiEAD4RcA8v1qMWbPQwB0UAA7mQhYDACMcY-TOXrtgERgA9l-eOagsJiEvRAA) effectively does the same thing we do today. In strict mode it adds some diagnostics warning that there's an `Unknown` type (for which the solution is \"add an annotation.\")\n\n[Mypy](https://mypy-play.net/?mypy=latest&python=3.12&gist=01e6b81029f45bfde3eb8e95da5d021b) similarly just asks you to add an annotation in the first case, since it has nothing to go on, but in the second case it uses the (first, and only the first) append to infer a type for the list (promoting literal types), so it infers `list[int]` and then errors on the second append, and on the return (because `list[int]` is not assignable to `list[int | str]`.)\n\n[Pyrefly](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeSImMYABKgBQCUNAtAHw1QRwAuA2hHQ8AuogA66GlJr4aAXhp9hE6TVLyZK6QCcYPAK7bJpCRKq1sTVhy68BQmgB8avbaK1TZCpR5mFUxMQwWPQAjIy%2BRAFBIWLguLhxEZI6eoaS%2BCAANCD6PNBwJOSIIADENACq%2BVw86mD66ADG%2BbjocKZY1DRguNoAtqg8APro%2Bn3YMNr0%2BIg0gjzM7C482uIpUroGRt1xAHJjE6s0wPgAvnES2SBkumBQpIQ8uH1QFOUACqS39y4YOAQ0RqtSAAc0MgwgrUIEnKAGUYDAaAALHg8YhwRAAekxN2o90IvRBmOCmMwuEacExQPQoPBLXQmO6vToADdUNBUNhYIDgRAwdoIa0aLhiPTChIyDwka0WCzJnBIZIFHEAMyEUIAJgu6BApxyqGaEDlADFoDAKGgsHgiGRdUA) does not include the \"please add an annotation\" or \"there's an unknown type!\" diagnostics that mypy and pyright-strict have on the first example. On the second example, it behaves the same as mypy. Its handling [is not special-cased to builtin collection types or methods, but works for any generic class and its methods.](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeSIAxlKnHAAQDCA2gCoC6iAOuvX-Zhhh6qTJgAUcGFDAAaetJgBbRPVYBKbr347itODx6DhlcZp47K9ALxMzF-pUKiJARnUO%2BAJxgA3GKhQAPoALqTEMOKU6iCyIACuIdBwJOSIIADE9ACqSVAQYfRg8eiUSbjoBuhGQkW4XkqoIUHo8UrYMF7i%2BKoQ6CHq9AC0AHz0cCFeWjo%2BIfFevGBcIABybR1T9MD4AL7LPLEgZD5gUKSEIbhKUBRZAAqkJ2fjGDgE9JQVkADm800QFUIPCyAGUYDB6AALEIhYhwRAAegRxyEZ0I9W%2BCJg6ARmFwlDgCM%2B6B%2Bf3KOLqXhEvlQ0FQ2FgHy%2BEF%2BXn%2BFXouGI5JSPDIIUhFSG-i8cABvFsywAzIRXAAmfboEA7OKoMoQfwAMWgMAoaCweCIZGVQA) It [gives up if the list is aliased at all](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeSIAxlKnHAAQDCA2gCoC6iAOuvX-Zhhh6qTJgAUcGFDAAaetJgBbRPVYBKbr347itODx6DhlcZp47K9ALxMzF-phv1KDvpUKiJARnVv6AE4wAG4wqFAA%2BgAupMQw4pTqILIgAK5R0HAk5IggAMT0AKoZUBAx9GCp6JQZuOgG6EZCFbgBSqhREeipStgwAeL4qhDoUer0ALQAfPRwUQFaOkFRqQG8YFwgAHI9fQv0wPgAvps8ySBkQWBQpIRRuEpQFAUACqRXN7MYOAQudZAAc1WHQgdUIPAKAGUYDB6AALKJRYhwRAAelRlyEN0IrQBqJg6FRmFwlDgqMo-wgQICILqqJaAREwVQ0FQ2Fgf3QgOBtV4uGIvKyPDIUThdQmoQCcFBvFsmwAzIRvAAmU7oEBHFKoGoQUIAMWgMAoaCweCIZA1QA).\n\nSome characteristics it seemed like we felt were desirable for our future handling of these cases (we didn't list these explicitly, I'm inferring from the direction of the conversation):\n\n1. Errors are attributed to a reasonable location.\n2. Hover shows a comprehensible type for the list that helps identify the problem when there is an error.\n3. Gradual guarantee: if there is no annotation on the list creation, we shouldn't invent limitations on what you are allowed to put into the list, based on what you happen to put in first.\n4. Our approach isn't broken by aliasing.\n\nWe focused on two primary potential strategies, which are ultimately two different implementation paths to a similar user experience:\n\n## Back-propagate type contexts\n\nIn this approach, we would track in semantic indexing, for each definition, all the later type contexts which may apply to it. So in `a()` we'd track that `x = []` has a later type context from `y = x`, and that that definition of `y` in turn has a type context from `return y` (which is the return annotation). In `b()` we'd track that `x = []` has multiple later type contexts from `x.append(1)`, from `x.append(\"foo\")`, and from `return x`.\n\nSo in `a()` we would follow the chain and arrive at the single type context `list[int]`, and thus use that as the type of `x` right at `x = []`.\n\nIn `b()` we would unify all three type contexts and arrive at the solution `list[int | str]` which works for all three of them.\n\nIf the type contexts for a definition don't unify, we just have to make a best-effort choice (prefer the first context? prefer the \"widest\" context?), naturally resulting in some diagnostics later on.\n\nOne challenge of this approach is avoiding big increase in memory usage from the additional def -> context mappings we'd have to store in semantic indexing. Another challenge is finding the right level of \"context\" to store in that mapping for all cases. For example, in `x.append(1)` we need the entire statement, not just the `x` expression (we can't traverse up our AST). Similarly in `foo(x)` we'd need the entire call expression.\n\n## Synthesize type variables and build up constraint sets, solve them for the scope\n\nIn this approach we'd synthesize a typevar `T` at `x = []` so the type of `x` is `list[T]`, and then as we type-check the body of the function, collect constraints on the type of `T`. So `x.append(1)` would add a `T :> Literal[1]` constraint and `return x` would add a `T == int | str` constraint (due to invariance of `list`). At the end of inferring the scope, we'd solve this constraint set. If it doesn't unify, we'd have to then figure out where to place diagnostics (which would mean that we needed to also collect the range-source of each constraint, and there might be a challenge here with preserving that information when simplifying the constraint set). If it does unify we'd have to record our solution so that hover shows the solution rather than the synthesized typevar.\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1473/reactions",
        "total_count": 18,
        "+1": 9,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 9,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1472",
      "id": 3583888393,
      "node_id": "I_kwDOOje-Bs7VncwJ",
      "number": 1472,
      "title": "Duplicated `TypedDict` assignability diagnostics",
      "user": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        },
        "2": {
          "id": 9596740363,
          "node_id": "LA_kwDOOje-Bs8AAAACPAKjCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typeddict",
          "name": "typeddict",
          "color": "46775a",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-11-03T21:56:44Z",
      "updated_at": "2026-01-09T03:18:56Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "See https://github.com/astral-sh/ruff/pull/21238#issuecomment-3481227585. In cases where we may perform multi-inference, or don't have access to the RHS expression, we emit a diagnostic for `TypedDict` assignability as well as the existing `invalid-key` diagnostic.\n```py\nclass Person(TypedDict):\n    name: str\n\n# error: [invalid-argument-type]\n# error: [invalid-argument-type] \"Invalid argument to key \"name\" with declared type `str` on TypedDict `Person`: value of type `None`\"\naccepts_person({\"name\": None})\n```\n\nIdeally we could avoid the former.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1472/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1471",
      "id": 3582313768,
      "node_id": "I_kwDOOje-Bs7VhcUo",
      "number": 1471,
      "title": "Reconsider how we display class definitions in the LSP",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-11-03T14:23:43Z",
      "updated_at": "2026-01-03T17:46:45Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "> Most classes and types will have lsp description of <class 'Foo'> (which is especially weird for built-in ones like <class 'int'>) and doesn't seem to carry much info\n\n\nPylance:\n\nhttps://github.com/user-attachments/assets/ad50fd03-70b5-485d-a5fe-0d7e41c1f68f\n\nty\n\nhttps://github.com/user-attachments/assets/02a7ea6e-2c40-45db-abaa-454be4971204\n\n\nBoth ty and pylance show that the type is a class, but IMO, pylance does so in a more idiomatic way in the LSP by using `class <TYPE>` over `<class <TYPE>>`. \n\nWe should consider changing how we render class definitions within the LSP (across operations)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1471/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1461",
      "id": 3574800295,
      "node_id": "I_kwDOOje-Bs7VEx-n",
      "number": 1461,
      "title": "Signatures of methods in generic classes should not use `Unknown` specialization",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-10-31T12:38:16Z",
      "updated_at": "2025-10-31T18:00:17Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The signature of `C.f` should include the `T` type parameter, not `Unknown`:\n```py\nfrom typing import reveal_type\n\nclass C[T]:\n    def f(self, x: T) -> None:\n        pass\n\nreveal_type(C.f)  # ty: def f(self, x: Unknown) -> None\n\nC.f(C[int](), \"foo\")  # this should be an error\n```\nhttps://play.ty.dev/83603661-a572-4022-b155-e560f5bbbe85",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1461/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1459",
      "id": 3572866040,
      "node_id": "I_kwDOOje-Bs7U9Zv4",
      "number": 1459,
      "title": "Specialized typevars are wrongly considered still generic for variance inference",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-10-30T23:53:42Z",
      "updated_at": "2025-10-31T18:28:44Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHopefully I understand variance enough for this.\n\nA type being given to `self` in a method should not affect the variance of a class generic. Even if there is some reason I don't know about why it should, then since both covariance and contravariance are affected bivariance should be too,\n\nhttps://play.ty.dev/37f6360e-1d6d-42f7-9551-6f7cd441efae\n```py\nfrom ty_extensions import static_assert, is_subtype_of\n\nclass Bivariant[T]:\n    def uses_int_self(self: Bivariant[int]):\n        ...\n\nstatic_assert(is_subtype_of(Bivariant[int], Bivariant[object]))\nstatic_assert(is_subtype_of(Bivariant[object], Bivariant[int]))\n\nclass Covariant[T]:\n    def make_cls_covariant(self) -> T:\n        raise NotImplemented\n\n    def uses_int_self(self: Covariant[int]):\n        ...\n\n# Should not raise?\nstatic_assert(is_subtype_of(Covariant[int], Covariant[object]))\n\nclass Contravariant[T]:\n    def make_cls_contravariant(self, value: T):\n        raise NotImplemented\n\n    def uses_int_self(self: Contravariant[int]):\n        ...\n\n# Should not raise?\nstatic_assert(is_subtype_of(Contravariant[object], Contravariant[int]))\n```\n\n### Version\n\nplayground (3be3a10a2)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1459/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1454",
      "id": 3567552084,
      "node_id": "I_kwDOOje-Bs7UpIZU",
      "number": 1454,
      "title": "Incorrect narrowing of enums with custom `__eq__` methods in `match` statements",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        },
        "2": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        },
        "3": {
          "id": 9338446479,
          "node_id": "LA_kwDOOje-Bs8AAAACLJ1ijw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/enums",
          "name": "enums",
          "color": "ac72c7",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-10-29T19:32:49Z",
      "updated_at": "2026-01-01T13:43:39Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nOriginally reported in https://discuss.python.org/t/amend-pep-586-to-make-enum-values-subtypes-of-literal/59456/9.\n\nAt runtime, `case` statements that use [literal patterns](https://peps.python.org/pep-0634/#literal-patterns) or [value patterns](https://peps.python.org/pep-0634/#value-patterns) dispatch based on equality, and `Color.GREEN == \"g\"` in the following example (since `Color` has `str` in its MRO as well as `Enum`, and inherits its `__eq__` method from `str`). We don't recognise this correctly in ty currently:\n\n```py\nfrom enum import StrEnum\nfrom typing import Literal, assert_never, reveal_type\n\nclass Color(StrEnum):\n    RED = \"r\"\n    GREEN = \"g\"\n    BLUE = \"b\"\n\ndef test_literal_as_enum(x: Literal[\"g\"]) -> None:\n    match x:\n        case Color.RED:\n            assert_never(x)\n        case Color.GREEN:\n            reveal_type(x)  # this branch is taken at runtime\n        case Color.BLUE:\n            assert_never(x)\n        case _:\n            assert_never(x)  # false-positive error here\n\ndef test_enum_as_literal(y: Literal[Color.BLUE]) -> None:\n    match y:\n        case \"r\":\n            assert_never(y)\n        case \"g\":\n            assert_never(y)\n        case \"b\":\n            reveal_type(y)  # this branch is taken at runtime\n        case _:\n            assert_never(y)  # false-positive error here\n```\n\nhttps://play.ty.dev/e106f66f-339a-4d1f-a6e4-95f8a4f3bed9\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1454/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1452",
      "id": 3566387447,
      "node_id": "I_kwDOOje-Bs7UksD3",
      "number": 1452,
      "title": "Classmethods and staticmethods should not be considered instances of `types.FunctionType`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-10-29T14:49:10Z",
      "updated_at": "2025-10-30T17:14:01Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nClassmethods and staticmethods should not be considered instances of `types.FunctionType`, but they currently are by ty. This means that the following assertion fails:\n\n```py\nfrom ty_extensions import static_assert, is_subtype_of, TypeOf\nfrom typing import reveal_type\nimport types\nimport inspect\n\nclass F:\n    @classmethod\n    def f(): ...\n\ntype Fff = TypeOf[inspect.getattr_static(F, 'f')]\nstatic_assert(not is_subtype_of(Fff, types.FunctionType))\n```\n\nIt also means that we incorrectly believe that classmethods/staticmethods have attributes such as `__kwdefaults__` that actually only exist on functions, and it means that we emit false-positive diagnostics if you access an attribute such as `__func__` that only exists on a classmethod/staticmethod, but not on a function:\n\n```py\ninspect.getattr_static(F, 'f').__kwdefaults__  # no error here (false negative)\ninspect.getattr_static(F, 'f').__func__  # error here (false positive)\n```\n\nSee https://play.ty.dev/5daebf80-6f88-4bde-83b4-796e3a965665",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1452/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1446",
      "id": 3557517392,
      "node_id": "I_kwDOOje-Bs7UC2hQ",
      "number": 1446,
      "title": "Support `cached_property`",
      "user": {
        "login": "graipher",
        "id": 984262,
        "node_id": "MDQ6VXNlcjk4NDI2Mg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/984262?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/graipher",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-10-27T16:06:02Z",
      "updated_at": "2025-12-19T23:32:09Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 1,
        "total_blocked_by": 1,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nCurrently the type of a `functools.cached_property` is `Unknown`, as the standardlibrary `functools` does not have type annotations.\n\n```python\nfrom functools import cached_property\nfrom typing import reveal_type\n\n\nclass Foo:\n    @cached_property\n    def foo(self) -> str:\n        return \"This is expensive\"\n\n\nreveal_type(Foo().foo)\n```\n\n**Output:**\n```\ninfo[revealed-type]: Revealed type\n  --> main.py:11:11\n   |\n11 | reveal_type(Foo().foo)\n   |             ^^^^^^^^^ `Unknown`\n   |\n```\n\n**Expected:**\nSome variant of `bound method Foo.foo() -> str`, which is what `ty` reveals without the decorator.\n\n[Playground link](https://play.ty.dev/15997923-202e-4ca2-a82d-cf8f1a0f5b5a)\n\nIs this an issue with typeshed?\n\n### Version\n\nty 0.0.1-alpha.24",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1446/reactions",
        "total_count": 4,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1444",
      "id": 3556243765,
      "node_id": "I_kwDOOje-Bs7T9_k1",
      "number": 1444,
      "title": "`_MISSING_TYPE` is not callable for `@<field>.default` in `attrs` class",
      "user": {
        "login": "my1e5",
        "id": 10064103,
        "node_id": "MDQ6VXNlcjEwMDY0MTAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/10064103?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/my1e5",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-10-27T11:06:09Z",
      "updated_at": "2026-01-09T03:13:10Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n`attrs` allows you to define a default factory by decorating a function. Since ty `0.0.1a24` this gives an error: `error[call-non-callable]: Object of type _MISSING_TYPE is not callable`.\n\n## MRE\n\n```py\nfrom attrs import define, field\n\n\n@define\nclass Foo:\n    x: int = 1\n    y: int = field()\n\n    @y.default\n    def _default_y(self) -> int:\n        return self.x + 1\n```\n## ty `0.0.1a24`\n```\n$ uvx --with attrs==25.4.0 --with ty==0.0.1a24 ty check dev/attrs_ty.py\nChecking ------------------------------------------------------------ 1/1 files\nerror[call-non-callable]: Object of type `_MISSING_TYPE` is not callable\n  --> dev\\attrs_ty.py:9:5\n   |\n 7 |     y: int = field()\n 8 |\n 9 |     @y.default\n   |     ^^^^^^^^^^\n10 |     def _default_y(self) -> int:\n11 |         return self.x + 1\n   |\ninfo: Union variant `_MISSING_TYPE` is incompatible with this call site\ninfo: Attempted to call union type `Unknown | _MISSING_TYPE`\ninfo: rule `call-non-callable` is enabled by default\n\nFound 1 diagnostic\n```\n## ty `0.0.1a23`\n```\n$ uvx --with attrs==25.4.0 --with ty==0.0.1a23 ty check dev/attrs_ty.py\nChecking ------------------------------------------------------------ 1/1 files\nAll checks passed!\n```\n\n\nOn a similar theme but possibly not related:\n* https://github.com/astral-sh/ty/issues/267\n\n### Version\n\nty 0.0.1-alpha.24 (1fee7da8b 2025-10-23)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1444/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1438",
      "id": 3554681533,
      "node_id": "I_kwDOOje-Bs7T4CK9",
      "number": 1438,
      "title": "Add support for Pydantic's `populate_by_name`, `validate_by_name`, etc.",
      "user": {
        "login": "moredatarequired",
        "id": 1124196,
        "node_id": "MDQ6VXNlcjExMjQxOTY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1124196?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/moredatarequired",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-10-27T01:12:36Z",
      "updated_at": "2026-01-09T03:12:03Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nPrior to 0.0.1a24 Pydantic models using aliases and either `populate_by_name` or `validate_by_name` were correctly assessed by ty when passed the field name (rather than the alias name).\n\nRepro:\n```python\nfrom pydantic import BaseModel, ConfigDict, Field\n\nclass A(BaseModel):\n    model_config = ConfigDict(validate_by_name=True)\n    a: int = Field(alias=\"x\")\n\na = A(a=5)\n```\n\npreviously `ty` understood that `a` was a valid keyword argument.\n```\n❯ uvx --with 'pydantic==2.12.3' --with 'ty==0.0.1a23' ty check a.py\nChecking ------------------------------------------------------------ 1/1 files                                                                                                                          All checks passed!\n```\n\nnow it no longer does:\n```\n❯ uvx --with 'pydantic==2.12.3' --with 'ty==0.0.1a24' ty check a.py\nChecking ------------------------------------------------------------ 1/1 files\nerror[missing-argument]: No argument provided for required parameter `x`\n --> a.py:7:5\n  |\n5 |     a: int = Field(alias=\"x\")\n6 |\n7 | a = A(a=5)\n  |     ^^^^^^\n8 | print(a.model_dump())\n  |\ninfo: rule `missing-argument` is enabled by default\n\nerror[unknown-argument]: Argument `a` does not match any known parameter\n --> a.py:7:7\n  |\n5 |     a: int = Field(alias=\"x\")\n6 |\n7 | a = A(a=5)\n  |       ^^^\n8 | print(a.model_dump())\n  |\ninfo: rule `unknown-argument` is enabled by default\n\nFound 2 diagnostics\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1438/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1431",
      "id": 3548510670,
      "node_id": "I_kwDOOje-Bs7TgfnO",
      "number": 1431,
      "title": "Consider enabling goto definition for augmented-assignment operators",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-24T09:35:52Z",
      "updated_at": "2025-11-18T16:10:40Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Previously discussed in https://github.com/astral-sh/ty/issues/1151#issuecomment-3430803296\n\nIn this snippet, we currently allow you to jump from the `+` operator to `Foo.__add__`, but we do not jump from the `+=` operator to `Bar.__iadd__`. For consistency, I would intuitively expect `+=` to work for `__iadd__` here exactly the same as `+` works for `__add__`: they're both operators in Python, and they both have well-defined semantics at runtime:\n\n```py\nclass Foo:\n    def __add__(self, other): ...\n\nFoo() + Foo()\n\nclass Bar:\n    def __iadd__(self, other): ...\n\na = Bar()\na += Bar()\n```\n\nPylance does not support this, but I'm not sure why that is; it may just be an oversight?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1431/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1430",
      "id": 3548496118,
      "node_id": "I_kwDOOje-Bs7TgcD2",
      "number": 1430,
      "title": "Goto-definition for binary operators only works if the relevant dunder has exactly the correct signature",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-10-24T09:32:27Z",
      "updated_at": "2025-12-31T15:34:32Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWe're fixing this issue in https://github.com/astral-sh/ruff/pull/21049 for goto-definition for unary operators, but the issue also exists for goto-definition for binary operators. Goto-definition allows you to jump from the first `+` in this snippet to `Foo.__add__`, but doesn't currently allow you to jump from the second `+` in this snippet to `Bar.__add__` (because `Bar.__add__` has an invalid definition):\n\n```py\nclass Foo:\n    def __add__(self, other): ...\n\nFoo() + Foo()\n\nclass Bar:\n    def __add__(self): ...\n\nBar() + Bar()\n```\n\nIdeally goto-definition wouldn't care about such details, and would jump to `Bar.__add__` even though it's invalid here. It's also probably not high-priority to fix this, though.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1430/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1429",
      "id": 3547611760,
      "node_id": "I_kwDOOje-Bs7TdEJw",
      "number": 1429,
      "title": "Infers wrong type from numpy's `np.interp`",
      "user": {
        "login": "cooperoptigrid",
        "id": 219587846,
        "node_id": "U_kgDODRalBg",
        "avatar_url": "https://avatars.githubusercontent.com/u/219587846?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/cooperoptigrid",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-10-24T04:30:41Z",
      "updated_at": "2025-12-20T09:21:51Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "`ty`  incorrectly infer `numpy.interp`’s return type as a scalar `float64` instead of an `NDArray[float64]`\n\n## Example code snippet\n\n```python\nfrom typing import TYPE_CHECKING\nimport numpy as np\n\ndef main() -> None:\n    x = np.array([0, 1, 2], dtype=np.int64)  # same behaviour with or without this extra dtype (although mypy gives me \"Any\" without)\n    xp = np.array([0, 2, 4], dtype=np.int64)\n    fp = np.array([0, 1, 2], dtype=np.int64)\n\n    interpolated_values = np.interp(x, xp, fp)\n\n    if TYPE_CHECKING:\n        reveal_type(interpolated_values)  \n\n    print(interpolated_values)\n\n\nif __name__ == \"__main__\":\n    main()\n```\n\n## ty\n```sh\nty check main.py\ninfo[revealed-type]: Revealed type\n  --> main.py:12:21\n   |\n11 |     if TYPE_CHECKING:\n12 |         reveal_type(interpolated_values)\n   |                     ^^^^^^^^^^^^^^^^^^^ `float64`\n13 |\n14 |     print(interpolated_values)\n   |\n```\n\n## mypy\n```sh\nmypy main.py\nmain.py:12: note: Revealed type is \"numpy.ndarray[builtins.tuple[Any, ...], numpy.dtype[numpy.float64]]\"\n```\n\n## pyright & basedpyright\n```sh\npyright main.py  # or basedpyrightmain.py\n...:12:21 - information: Type of \"interpolated_values\" is \"ndarray[tuple[Any, ...], dtype[float64]]\"\n```\n\n## venv\n```\nPackage               Version\n--------------------- --------\nbasedpyright          1.32.1\nmypy                  1.18.2\nmypy-extensions       1.1.0\nnodeenv               1.9.1\nnodejs-wheel-binaries 22.20.0\nnumpy                 2.3.4\npathspec              0.12.1\npyright               1.1.406\nty                    0.0.1a24\ntyping-extensions     4.15.0\n```\n\n## numpy type hints\n\nFrom [numpy/lib/_function_base_impl.pyi](https://github.com/numpy/numpy/blob/main/numpy/lib/_function_base_impl.pyi#L384) we see\n\n```python\n) -> NDArray[complex128 | float64] | complex128 | float64: ...\n```\n\nSo rather than choosing the `NDArray` overload, it picks the `float64` for some reason.\n\nI assume similar issues are present with other similarly typed numpy functions.\n\n### Version\n\n0.0.1a24",
      "closed_by": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1429/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1425",
      "id": 3545768233,
      "node_id": "I_kwDOOje-Bs7TWCEp",
      "number": 1425,
      "title": "Third-party dataclass-like libraries (pydantic, attrs) will sometimes treat unannotated assignments as dataclass fields",
      "user": {
        "login": "franzkurt",
        "id": 18050892,
        "node_id": "MDQ6VXNlcjE4MDUwODky",
        "avatar_url": "https://avatars.githubusercontent.com/u/18050892?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/franzkurt",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592544541,
          "node_id": "LA_kwDOOje-Bs8AAAACACfTHQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/dataclasses",
          "name": "dataclasses",
          "color": "1d76db",
          "default": false,
          "description": "Issues relating to dataclasses and dataclass_transform"
        },
        "1": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 8,
      "created_at": "2025-10-23T17:22:06Z",
      "updated_at": "2025-12-01T23:38:58Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nFor example if my class is a validator like\n```python\nfrom pydantic import BaseModel\n\nclass ResponseOk(BaseModel):\n    status_code = Field(..., alias='$status')\n```\n`ty` provide the error even enabling the config `allow_population_by_field_name`\n\n```bash\nChecking ------------------------------------------------------------ 1/1 files                                                                                                                                                                            error[unknown-argument]: Argument `status_code` does not match any known parameter\n --> /Users/jusbrasil/Desktop/issue.py.py:6:12\n  |\n4 |     status_code = Field(..., alias='$status')\n5 |\n6 | ResponseOk(status_code=200)\n  |            ^^^^^^^^^^^^^^^\n  |\ninfo: rule `unknown-argument` is enabled by default\nFound 1 diagnostic\n```\n\n\n### Version\n\nty 0.0.1a24",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1425/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1418",
      "id": 3544731649,
      "node_id": "I_kwDOOje-Bs7TSFAB",
      "number": 1418,
      "title": "Reconsider hiding all subdiagnostics when `--output-format=concise` is specified",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 24,
      "created_at": "2025-10-23T13:33:38Z",
      "updated_at": "2025-11-14T08:25:11Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Many of our existing diagnostics are unactionable when using `--output-format=concise`. For example:\n\n```\n~/dev [1] % cat foo.py                      \nsum(1, 2)\n~/dev % uvx ty check foo.py --output-format=concise\nChecking ------------------------------------------------------------ 1/1 files\nfoo.py:1:1: error[no-matching-overload] No overload of function `sum` matches arguments\nFound 1 diagnostic\n```\n\nSome other type checkers do a much better job here: mypy defaults to concise diagnostics (you have to enable verbose annotations using the `--pretty` flag), but even with mypy's default, concise, output format it displays subdiagnostics that tell you what the available overloads are:\n\n```\n~/dev [1] % uvx mypy foo.py                            \nfoo.py:1: error: No overload variant of \"sum\" matches argument types \"int\", \"int\"  [call-overload]\nfoo.py:1: note: Possible overload variants:\nfoo.py:1: note:     def sum(Iterable[bool], /, start: int = ...) -> int\nfoo.py:1: note:     def [_SupportsSumNoDefaultT: _SupportsSumWithNoDefaultGiven] sum(Iterable[_SupportsSumNoDefaultT], /) -> _SupportsSumNoDefaultT | Literal[0]\nfoo.py:1: note:     def [_AddableT1: SupportsAdd[Any, Any], _AddableT2: SupportsAdd[Any, Any]] sum(Iterable[_AddableT1], /, start: _AddableT2) -> _AddableT1 | _AddableT2\nFound 1 error in 1 file (checked 1 source file)\n```\n\nThere are many situations where it's implausible to put all information to make a diagnostic actionable on a single line; I think there will often be situations when important information needs to be shunted to a subdiagnostic. We should add a way to specify for some subdiagnostics that they should be displayed (in a concise format) even if `--output-format=concise` is specified on the CLI.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1418/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1417",
      "id": 3544677122,
      "node_id": "I_kwDOOje-Bs7TR3sC",
      "number": 1417,
      "title": "Reconsider union truncation",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-10-23T13:20:11Z",
      "updated_at": "2026-01-09T04:51:37Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Our current union truncation is too aggressive and it often makes diagnostics (e.g. when using `--output-format=concise` or in editors not supporting related information) unactionable. \n\nFor context, see the discussion here https://github.com/astral-sh/ruff/pull/21044#discussion_r2454860309\n\nI'd prefer a smart union truncation where the diagnostic can say: Display this type, but don't dare to hide `<X>`. \n\nWe should also disable truncation for hover or use a much larger limit",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1417/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1410",
      "id": 3541418948,
      "node_id": "I_kwDOOje-Bs7TFcPE",
      "number": 1410,
      "title": "Hover for subscript when the argument is a Literal",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-10-22T15:47:02Z",
      "updated_at": "2025-11-14T14:35:45Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "```py\narg = {\n    \"something\": \"else\",\n    \"metadata\": {\"foo\": \"bar\"},\n    \"configurable\": {\"baz\": \"qux\"},\n    \"callbacks\": [],\n    \"tags\": [\"tag1\", \"tag2\"],\n    \"max_concurrency\": 1,\n    \"recursion_limit\": 100,\n    \"run_id\": 1,\n    \"run_name\": \"test\",\n}\n\nassert len(arg[\"callbacks\"]) == 1, (\n    \"ensure_config should not modify the original config\"\n)\n```\n\nty should show the type of `arg[\"callback\"]` when hovering the subscript expression. \n\nhttps://play.ty.dev/e30bc826-2028-4739-8fbb-f70f83d6531d",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1410/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1397",
      "id": 3529914416,
      "node_id": "I_kwDOOje-Bs7SZjgw",
      "number": 1397,
      "title": "Go to Definition Missing correct path",
      "user": {
        "login": "YoniChechik",
        "id": 16686924,
        "node_id": "MDQ6VXNlcjE2Njg2OTI0",
        "avatar_url": "https://avatars.githubusercontent.com/u/16686924?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/YoniChechik",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-19T09:55:45Z",
      "updated_at": "2025-11-18T16:10:40Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Summary\nWhen using \"Go to Definition\" (Ctrl+Click) on a function in a Python project with git worktrees, ty navigates to the definition in a different worktree instead of the current worktree.\n\n\n## Repository Structure\n\nWe have a Python project using git worktrees. The issue occurs in both configurations:\n\n### Configuration 1: Worktrees in Separate Directory\n```\n/workspace/\n├── my-project/                            (main repo, main branch)\n│   ├── .git/                              (main .git directory)\n│   │   └── worktrees/                     (git worktree metadata)\n│   │       ├── feature-branch-1/\n│   │       └── feature-branch-2/\n│   ├── mypackage/                         (Python package)\n│   │   ├── __init__.py\n│   │   ├── module.py\n│   │   └── utils.py\n│   └── tests/\n│\n└── worktrees/                             (worktrees directory)\n    ├── feature-branch-1/                  (worktree, feature branch)\n    │   ├── .git                           (file pointing to main repo)\n    │   ├── mypackage/\n    │   │   ├── __init__.py\n    │   │   ├── module.py                  (modified in this branch)\n    │   │   └── utils.py\n    │   └── tests/\n    │\n    └── feature-branch-2/                  (worktree, another feature branch)\n        ├── .git                           (file pointing to main repo)\n        ├── mypackage/\n        │   ├── __init__.py\n        │   ├── module.py                  (modified in this branch)\n        │   └── utils.py\n        └── tests/\n```\n\n### Configuration 2: Worktrees Inside Main Repo (also affected)\n```\n/workspace/my-project/\n├── .git/                                  (main .git directory)\n├── mypackage/                             (main branch code)\n│   ├── __init__.py\n│   ├── module.py\n│   └── utils.py\n├── tests/\n└── worktrees/                             (worktrees inside main repo)\n    ├── feature-branch-1/\n    │   ├── .git                           (file pointing to main repo)\n    │   ├── mypackage/\n    │   │   ├── module.py                  (modified)\n    │   │   └── utils.py\n    │   └── tests/\n    └── feature-branch-2/\n        └── ...\n```\n\n## Steps to Reproduce\n\n1. Open VS Code in a git worktree directory (e.g., `/workspace/worktrees/feature-branch-1/`)\n2. Open a Python file that imports and uses a function from your package (e.g., `from mypackage.module import some_function`)\n3. Ctrl+Click (or F12) on the function name to \"Go to Definition\"\n\n## Expected Behavior\nty should navigate to the function definition in the **current worktree** at:\n```\n/workspace/worktrees/feature-branch-1/mypackage/module.py\n```\n\n## Actual Behavior\nty sometimes navigates to the function definition in a **different worktree** or the main repo at:\n```\n/workspace/worktrees/feature-branch-2/mypackage/module.py\n```\nor\n```\n/workspace/my-project/mypackage/module.py\n```\n\n## Impact\nThis is problematic because:\n1. Different worktrees contain different branch implementations of the same functions\n2. Developers end up viewing/editing the wrong version of code\n3. It breaks the expected isolation between branches when using worktrees\n\n## Additional Context\n- All worktrees share the same `.git` directory structure (normal git worktree behavior)\n- The issue occurs regardless of whether worktrees are in a separate directory or nested within the main repo\n- Python environment is properly configured with the package installed in editable mode\n\n## Suggested Fix\nty should respect the currently open workspace folder and prioritize symbol resolution within that workspace, treating each worktree as an isolated environment.\n\nthis also happens in pylance but I was hoping it will work properly in ty: https://github.com/microsoft/pylance-release/issues/7642\n\nexample repo for reproduction and actual visual bug can be seen here: https://github.com/microsoft/pylance-release/issues/7642#issuecomment-3412364298\n\n### Version\n\nty vscode version 2025.47.12891834",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1397/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1394",
      "id": 3528208414,
      "node_id": "I_kwDOOje-Bs7STDAe",
      "number": 1394,
      "title": "Set distributive law does not hold when using complements sometimes",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-10-18T06:55:09Z",
      "updated_at": "2025-10-24T18:50:07Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nPer the distributive law:\n`A∪(B∩C)=(A∪B)∩(A∪C)`\nReplacing `B` with `A'`, the distributive law should still hold, but it does not, [example](https://play.ty.dev/dfa369c0-1001-4d33-8e13-6c95fb719cca):\n```py\nfrom ty_extensions import static_assert, is_equivalent_to, Intersection, Not\nfrom typing import Literal\n\nclass A: ...\nclass B: ...\nclass C: ...\n# Works correctly (no error)\nstatic_assert(is_equivalent_to(A | Intersection[B, C], Intersection[A | B, A | C]))\n# Fails incorrectly (error)\nstatic_assert(is_equivalent_to(A | Intersection[Not[A], C], Intersection[A | Not[A], A | C]))\n```\n\n<details>\n<summary> powershell demo </summary>\n\n```powershell\nPS D:\\python_projects\\ty_issues> echo @'\nfrom ty_extensions import static_assert, is_equivalent_to, Intersection, Not\nfrom typing import Literal\n\nclass A: ...\nclass B: ...\nclass C: ...\n# Works correctly (no error)\nstatic_assert(is_equivalent_to(A | Intersection[B, C], Intersection[A | B, A | C]))\n# Fails incorrectly (error)\nstatic_assert(is_equivalent_to(A | Intersection[Not[A], C], Intersection[A | Not[A], A | C]))\n'@ > main.py\nPS D:\\python_projects\\ty_issues> uvx ty check main.py\nChecking ------------------------------------------------------------ 1/1 files                                         error[static-assert-error]: Static assertion error: argument of type `ty_extensions.ConstraintSet[never]` is statically known to be falsy\n  --> main.py:10:1\n   |\n 8 | static_assert(is_equivalent_to(A | Intersection[B, C], Intersection[A | B, A | C]))\n 9 | # Fails incorrectly (error)\n10 | static_assert(is_equivalent_to(A | Intersection[Not[A], C], Intersection[A | Not[A], A | C]))\n   | ^^^^^^^^^^^^^^------------------------------------------------------------------------------^\n   |               |\n   |               Inferred type of argument is `ty_extensions.ConstraintSet[never]`\n   |\ninfo: rule `static-assert-error` is enabled by default\n\nFound 1 diagnostic\nPS D:\\python_projects\\ty_issues> uvx ty version\nty 0.0.1-alpha.23 (5c51b8480 2025-10-16)\n```\n\n</details>\n\n### Version\n\nty 0.0.1-alpha.23 (5c51b8480 2025-10-16)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1394/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1393",
      "id": 3528168524,
      "node_id": "I_kwDOOje-Bs7SS5RM",
      "number": 1393,
      "title": "Slow processing of some invalid python files",
      "user": {
        "login": "qarmin",
        "id": 41945903,
        "node_id": "MDQ6VXNlcjQxOTQ1OTAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/41945903?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/qarmin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8608317604,
          "node_id": "LA_kwDOOje-Bs8AAAACARiApA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/hang",
          "name": "hang",
          "color": "b60205",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-10-18T06:22:28Z",
      "updated_at": "2026-01-08T23:58:30Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI ran the `ty check . command` on each file individually — each filename includes the time it took to scan on my machine.\n\n```\n40K   07774379___10.531_seconds___invalid_python.py\n40K   13832638___7.077_seconds___invalid_python.py\n68K   16059136___14.184_seconds___invalid_python.py\n12K   28136638___6.122_seconds___invalid_python.py\n11K   35138501___4.671_seconds___invalid_python.py\n12K   41326180___5.628_seconds___invalid_python.py\n46K   48769042___timeout_20_seconds___invalid_python.py\n44K   56867334___timeout_20_seconds___invalid_python.py\n2,0K   86099013___14.385_seconds___invalid_python.py\n32K   94313466___7.124_seconds___invalid_python.py\n5,1K   97114626___timeout_20_seconds___invalid_python.py\n\n```\n[files.zip](https://github.com/user-attachments/files/22982706/thunderbird.tmp.zip)\n\n[BBB.zip](https://github.com/user-attachments/files/23373565/BBB.zip)\n\nMost of the larger files probably share the same root cause as https://github.com/astral-sh/ty/issues/71\n\nHowever, the file `5,1K 97114626___timeout_20_seconds___invalid_python.py` is particularly interesting, as it doesn’t contain even small tuples.\n\n### Version\n\nty 0.0.1-alpha.23",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1393/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1389",
      "id": 3526518595,
      "node_id": "I_kwDOOje-Bs7SMmdD",
      "number": 1389,
      "title": "Non-deterministic overload matching failure",
      "user": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-10-17T15:10:36Z",
      "updated_at": "2025-11-21T21:15:32Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nAn error has been observed randomly appearing and disappearing in the mypy_primer report.\nThis has been seen in many PRs (e.g. https://github.com/astral-sh/ruff/pull/20871).\n\n```\nscikit-build-core (https://github.com/scikit-build/scikit-build-core)\n+ src/scikit_build_core/build/_wheelfile.py:51:22: error[no-matching-overload] No overload of function `field` matches arguments\n```\n\nhttps://github.com/scikit-build/scikit-build-core/blob/3f371fff3d0dd424811ef73f58d88389263d79db/src/scikit_build_core/build/_wheelfile.py#L51\n\nUnfortunately, this is not easy to reproduce locally, and the only known way is to run mypy_primer.\nSo I haven't been able to identify the cause of this error.\n\nBased on my current investigation, this error appears to have become apparent from https://github.com/astral-sh/ruff/pull/20476. However, I believe that the PR only exposed the error, and the seed of nondeterminism was likely planted before that.\n\nPossibly related: https://github.com/astral-sh/ty/issues/369\n\n### Version\n\n_No response_",
      "closed_by": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1389/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1381",
      "id": 3525339853,
      "node_id": "I_kwDOOje-Bs7SIGrN",
      "number": 1381,
      "title": "Support `@staticmethod` protocol members and `@classmethod` protocol members",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-10-17T09:58:16Z",
      "updated_at": "2025-10-17T09:58:16Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Get rid of this `todo_type!()` here: https://github.com/astral-sh/ruff/blob/a21cde8a5a5143db4fae5413869def2dd9f74c96/crates/ty_python_semantic/src/types/protocol_class.rs#L841-L847",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1381/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1380",
      "id": 3525334192,
      "node_id": "I_kwDOOje-Bs7SIFSw",
      "number": 1380,
      "title": "Support `ClassVar` protocol members",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-10-17T09:56:25Z",
      "updated_at": "2025-10-17T09:56:58Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Consider the following two protocols:\n\n```py\nfrom typing import Protocol, ClassVar\n\nclass P1(Protocol):\n    x: int\n\nclass P2(Protocol):\n    x: ClassVar[int]\n```\n\nIn order for a type `N` to satisy `P1`'s interface, an `x` attribute needs to be readable with type `int` on instances of `N` and also writable with type `int` on instances of `N`. The `x` attribute does not need to be readable or writable on instances of `type[N]`.\n\nIn order for a type `N` to satsify `P2`'s interface, however, an `s` attribute needs to be readable with type `int` on instances of `N` _and_ instances of `type[N]`. It does not need to be writable on instances of `N`, but it _does_ need to be writable on instances of `type[N]`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1380/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1379",
      "id": 3525321169,
      "node_id": "I_kwDOOje-Bs7SICHR",
      "number": 1379,
      "title": "Properly support `@property` members on protocols",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-10-17T09:52:33Z",
      "updated_at": "2025-10-17T09:52:33Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "If a protocol `P` has an `@property` member `foo`, we currently say that any nominal type `N` will satisfy `P`'s interface if `N` has an attribute `foo`. This is obviously incorrect; we should also consider the type of the member `foo` on the protocol. For `@property` members with setters, we should also check whether the `foo` attribute can be set on `N` with the type the setter specifies.\n\nDetailed tests for this are already in place at https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/resources/mdtest/protocols.md",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1379/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1367",
      "id": 3521482494,
      "node_id": "I_kwDOOje-Bs7R5Y7-",
      "number": 1367,
      "title": "Within-revision LRU collection for queries returning values with lifetime `&'static`",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8653735457,
          "node_id": "LA_kwDOOje-Bs8AAAACA82GIQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/memory",
          "name": "memory",
          "color": "e99695",
          "default": false,
          "description": "related to memory usage"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-10-16T11:33:15Z",
      "updated_at": "2025-12-31T15:33:52Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Salsa's fixpoint iteration is a very convenient feature to handle recursive queries as seen in https://github.com/astral-sh/ruff/pull/20477. The caching of some of the type operations can also help with performance. \n\nHowever, queries like `is_redundant_with` come at a high memory cost because there are simply so many instances that need to be cached. \n\nWe should explore adding within-revision LRU garbage collection to Salsa for queries that return values with lifetime `&'static` (and don't return references). That is, values that are copied or cloned and, thus, collecting them in salsa can't lead to dangling references. \n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1367/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1364",
      "id": 3519805031,
      "node_id": "I_kwDOOje-Bs7Ry_Zn",
      "number": 1364,
      "title": "Playground crashes on trying to rename a file to nothing",
      "user": {
        "login": "MeGaGiGaGon",
        "id": 107241144,
        "node_id": "U_kgDOBmReuA",
        "avatar_url": "https://avatars.githubusercontent.com/u/107241144?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MeGaGiGaGon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "1": {
          "id": 8568562675,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rnj8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/playground",
          "name": "playground",
          "color": "1C71A4",
          "default": false,
          "description": "A playground-specific issue"
        },
        "2": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-15T22:59:16Z",
      "updated_at": "2025-11-14T08:31:44Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nSee attached video, the process is\n1. Delete a file's name\n2. Press enter\n\nThe playground will error in the console and be in an unstable state, where then navigating from and back to that file crashes the playground.\n\nWhile doing this, the playground will first error with `Uncaught Error: Is a directory` and then crash with `Uncaught Error: null pointer passed to rust`\n\nEdit: I did some more testing, and this same crash also happens if you try renaming the file to `.` or `..` or similar things (ie, `./a` works but `./..` crashes)\n\nhttps://github.com/user-attachments/assets/ccaf02f1-e416-41e2-bd41-f602a3e8bd87\n\n<details>\n<summary>Full console errors when causing the crash</summary>\n\nError on trying to rename the file to nothing:\n```\nindex-FQR4vDKH.js:64 Uncaught Error: Is a directory\n    at Bp.l.wbg.__wbg_new_97ddeb994a38bb69 (index-FQR4vDKH.js:64:25749)\n    at ty_wasm_bg-Uf3CeSIQ.wasm:0x81c9e1\n    at ty_wasm_bg-Uf3CeSIQ.wasm:0x764aaa\n    at ty_wasm_bg-Uf3CeSIQ.wasm:0x7e18a4\n    at go.openFile (index-FQR4vDKH.js:64:18602)\n    at ne (index-FQR4vDKH.js:87:7690)\n    at le (index-FQR4vDKH.js:87:3379)\n    at onRenamed (index-FQR4vDKH.js:76:63643)\n    at h (index-FQR4vDKH.js:76:64469)\n    at onBlur (index-FQR4vDKH.js:76:65036)\nBp.l.wbg.__wbg_new_97ddeb994a38bb69 @ index-FQR4vDKH.js:64\n$func10208 @ ty_wasm_bg-Uf3CeSIQ.wasm:0x81c9e1\n$func5269 @ ty_wasm_bg-Uf3CeSIQ.wasm:0x764aaa\n$workspace_openFile @ ty_wasm_bg-Uf3CeSIQ.wasm:0x7e18a4\nopenFile @ index-FQR4vDKH.js:64\nne @ index-FQR4vDKH.js:87\nle @ index-FQR4vDKH.js:87\nonRenamed @ index-FQR4vDKH.js:76\nh @ index-FQR4vDKH.js:76\nonBlur @ index-FQR4vDKH.js:76\nGg @ index-FQR4vDKH.js:49\n(anonymous) @ index-FQR4vDKH.js:49\nKc @ index-FQR4vDKH.js:49\nAs @ index-FQR4vDKH.js:49\nUs @ index-FQR4vDKH.js:50\nM_ @ index-FQR4vDKH.js:50\nonKeyDown @ index-FQR4vDKH.js:76\nGg @ index-FQR4vDKH.js:49\n(anonymous) @ index-FQR4vDKH.js:49\nKc @ index-FQR4vDKH.js:49\nAs @ index-FQR4vDKH.js:49\nUs @ index-FQR4vDKH.js:50\nM_ @ index-FQR4vDKH.js:50\n```\n\nError on playground crash:\n```\nindex-FQR4vDKH.js:64 Uncaught Error: null pointer passed to rust\n    at Bp.l.wbg.__wbg_wbindgenthrow_4c11a24fca429ccf (index-FQR4vDKH.js:64:29195)\n    at ty_wasm_bg-Uf3CeSIQ.wasm:0x819901\n    at ty_wasm_bg-Uf3CeSIQ.wasm:0x81990e\n    at ty_wasm_bg-Uf3CeSIQ.wasm:0x805f9b\n    at Ge.path (index-FQR4vDKH.js:64:6385)\n    at Xv (index-FQR4vDKH.js:76:65256)\n    at index-FQR4vDKH.js:87:5887\n    at Object.yd [as useMemo] (index-FQR4vDKH.js:49:42702)\n    at ge.useMemo (index-FQR4vDKH.js:18:7241)\n    at h1 (index-FQR4vDKH.js:87:5785)\nBp.l.wbg.__wbg_wbindgenthrow_4c11a24fca429ccf @ index-FQR4vDKH.js:64\n$func10107 @ ty_wasm_bg-Uf3CeSIQ.wasm:0x819901\n$func10108 @ ty_wasm_bg-Uf3CeSIQ.wasm:0x81990e\n$filehandle_path @ ty_wasm_bg-Uf3CeSIQ.wasm:0x805f9b\npath @ index-FQR4vDKH.js:64\nXv @ index-FQR4vDKH.js:76\n(anonymous) @ index-FQR4vDKH.js:87\nyd @ index-FQR4vDKH.js:49\nge.useMemo @ index-FQR4vDKH.js:18\nh1 @ index-FQR4vDKH.js:87\ng1 @ index-FQR4vDKH.js:87\nRu @ index-FQR4vDKH.js:49\nFu @ index-FQR4vDKH.js:49\nPd @ index-FQR4vDKH.js:49\nTg @ index-FQR4vDKH.js:49\nQm @ index-FQR4vDKH.js:49\nms @ index-FQR4vDKH.js:49\nvg @ index-FQR4vDKH.js:49\nUg @ index-FQR4vDKH.js:49\ndl @ index-FQR4vDKH.js:49\nHg @ index-FQR4vDKH.js:49\n(anonymous) @ index-FQR4vDKH.js:49\n```\n\n</details>\n\n### Version\n\nPlayground (73520e4ac)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1364/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1354",
      "id": 3514402860,
      "node_id": "I_kwDOOje-Bs7ReYgs",
      "number": 1354,
      "title": "Support for ignoring unresolved-import per library",
      "user": {
        "login": "miloszwatroba",
        "id": 19204604,
        "node_id": "MDQ6VXNlcjE5MjA0NjA0",
        "avatar_url": "https://avatars.githubusercontent.com/u/19204604?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/miloszwatroba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-10-14T15:17:41Z",
      "updated_at": "2026-01-09T09:55:42Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nHi,\n\nI'd like to ask if there are plans for supporting a feature for ignoring `unresolved-import` per library, i.e. similarly to how `mypy` does it with:\n\n```\n[[tool.mypy.overrides]]\nmodule = [\"foobar.*\"]\nignore_missing_imports = true \n```\n\nThe behaviour I'd expect is that all unresolved imports of `foobar` are silenced (e.g. `from foobar import X`).\n\nI have already checked the documentation and haven't found anything similar in `ty`. \n\nThanks,\nMilosz\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1354/reactions",
        "total_count": 4,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1351",
      "id": 3512636472,
      "node_id": "I_kwDOOje-Bs7RXpQ4",
      "number": 1351,
      "title": "On-hover on constructor call",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-10-14T07:05:02Z",
      "updated_at": "2025-11-14T08:35:40Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "\n\n```py\nclass Bar2:\n    def __init__(self, a :int):\n        self.y = 2\n\nb = Bar2(30)\n```\n\nHovering `Bar(30)` should show the signature of the constructor rather than the class\n\nPylance:\n<img width=\"412\" height=\"186\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/1d4422bf-92b0-4cf6-b7c9-33f921013214\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1351/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1350",
      "id": 3512623755,
      "node_id": "I_kwDOOje-Bs7RXmKL",
      "number": 1350,
      "title": "On-hover for keyword arguments",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-10-14T07:00:14Z",
      "updated_at": "2026-01-05T15:07:54Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Should show the documentation of the matching parameter\n\n<img width=\"498\" height=\"283\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/62174863-9607-4aed-8cdb-4b6673a6c147\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1350/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1345",
      "id": 3509942393,
      "node_id": "I_kwDOOje-Bs7RNXh5",
      "number": 1345,
      "title": "Allow an attribute declared in a superclass's class body to be overridden by an attribute redeclared in a subclass's `__init__` method",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-10-13T12:48:49Z",
      "updated_at": "2025-11-28T15:52:18Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nConsider the following snippet. ty, mypy, pyright and pyrefly all agree on the type of `B1().x`, but ty disagrees with the other three on the type of `B2().x`:\n\n```py\nclass A:\n    x: int\n\nclass B1(A):\n    x: bool\n\nclass B2(A):\n    def __init__(self) -> None:\n        self.x: bool = True\n\n\nreveal_type(B1().x)  # Ty, mypy, pyright, pyrefly: bool\nreveal_type(B2().x)  # Mypy, pyright, pyrefly: bool. Ty: int!\n```\n\n- [Ty](https://play.ty.dev/707e2f40-6672-45ac-8386-ad7956d5b939)\n- [Pyright](https://pyright-play.net/?pyrightVersion=1.1.405&strict=true&code=MYGwhgzhAECCBcBYAUNN0Ae9oEsB2ALiiqJDAEICMAFLAJRKrpbQBGA9uyMcqVNOQBMtBinTQAJgFMAZtAD68-DgKLqEKSBl1oAWgB80AHLs8UxuPEatAOhYcu0ALzQAKgCcArlJ4p3UgDcpMBB5AgBPAAcpaipqOjsdaABiNk5uZH8gkLComKF4xLRU-CJkIA)\n- [Mypy](https://mypy-play.net/?mypy=latest&python=3.12&gist=f505a4fde6645c22604cfa7ce41a7d9e)\n- [Pyrefly](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeSIAxlKnHAAQCCiAOuvR-fovROgC5s21WgwBCARgAUjAJSt2nbvTy4oQ9CLr0xAJhny2nephhh6AfQt8I-K1LgwoYWfQC0APnoA5XOhgKxsaOzoTKqlD0ALz0ACoATgCuMBps8TAAbjCoUBb8pMQwUpJSsmGu9ADEKrhqaZnZufmFxfpl%2BBXVfPwgADQgifzQcCTkiCDVAKpDULak9GCJmkN%2BcBqm5mC48QC2qHboiTvYMPFSyt2unvRw-PGBnOn8ifHsYCwg3kcn9-TA%2BABfD5sPogMjpMBQUiEfi4HZQCjVAAKpAhUJuGBwBHolD8kAA5i99hA-IQ2NUAMowGD0AAW-H4xDgiAA9CzwWYoYRtviWTB0CzMLhKHAWbj0ASiSsBQttvRUBlUNBUNhYDi8RBCfFiX56LhiNKRmwyPxaX43Fl4nASewYh8AMyECS6YHoEAA-qoShDLIAMWgMAoaCweCIZHdQA)\n\nI think for compatibility, it would be better if we followed what the other type checkers do here.\n\nI spotted this by looking at the ecosystem report in https://github.com/astral-sh/ruff/pull/20723#issuecomment-3372209543 (all 4 new `unresolved-attribute` errors on aiohttp in the ecosystem report are caused by this).\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1345/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1341",
      "id": 3508835281,
      "node_id": "I_kwDOOje-Bs7RJJPR",
      "number": 1341,
      "title": "Distinguish \"declared\" and \"inferred\" `Place`s",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-10-13T07:33:50Z",
      "updated_at": "2025-10-14T15:46:56Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "A `Place` is currently either `Place::Unbound`, `Place::Type(type, Boundness::PossiblyUnbound` or `Place::Type(type, Boundness::Bound)`:\n\n```rs\npub(crate) enum Boundness {\n    Bound,\n    PossiblyUnbound,\n}\n\npub(crate) enum Place<'db> {\n    Type(Type<'db>, Boundness),\n    Unbound,\n}\n```\n\nThere is currently no way of tracking if a `Place` originated from a declaration or if its type has been inferred. However, we still use e.g. `Place::Type(type, Boundness::Bound)` to mean \"definitely declared\" in various places. For example, the `place_from_declarations` query also returns a `Place` (wrapped in `PlaceFromDeclarationsResult` -> `PlaceAndQualifiers` -> `Place`).\n\nSimilarly, the `Member` return type of various member-access functions [currently tracks](https://github.com/astral-sh/ruff/blob/9b9c9ae0923762fdea90d1ddd01ee8e7e87064dc/crates/ty_python_semantic/src/member.rs#L14-L18) the \"declared vs inferred\" information separately.\n\nWe should attempt to refactor `Place` to generally contain metadata about the origin of a particular type.\n\nRelated issue: #1051 ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1341/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1332",
      "id": 3502359284,
      "node_id": "I_kwDOOje-Bs7QwcL0",
      "number": 1332,
      "title": "Issues with kwarg splats inside dictionary literals",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "ibraheemdev",
          "id": 34988408,
          "node_id": "MDQ6VXNlcjM0OTg4NDA4",
          "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ibraheemdev",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-10-10T10:51:31Z",
      "updated_at": "2026-01-08T18:39:51Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nAt runtime, any object can be `**`-unpacked if that object has a `.keys()` method and a `__getitem__` method:\n\n```pycon\n>>> from typing import KeysView\n>>> class HasKeysAndGetItem:\n...     def keys(self) -> KeysView[str]:\n...         return {\"foo\": 42}.keys()\n...     \n...     def __getitem__(self, arg: str) -> int:\n...         return 42\n...         \n>>> {**HasKeysAndGetItem()}\n{'foo': 42}\n```\n\nFunctions that have `**kwargs` parameters have the additional requirement that the keys of the mapping must be strings:\n\n```pycon\n>>> def f(**kwargs): ...\n... \n>>> f(**HasKeysAndGetItem())\n>>> f(**{42: 42})\nTraceback (most recent call last):\n  File \"<python-input-7>\", line 1, in <module>\n    f(**{42: 42})\n    ~^^^^^^^^^^^^\nTypeError: keywords must be strings\n```\n\nTy should attempt to emulate this exactly:\n- All mappings used with `**` splats should be treated the same way, assuming they have a `keys` method and a `__getitem__` method\n- Invalid `**` splats should be detected and should cause us to emit diagnostics\n\nWe currently get this right for the `**kwargs` function-call case, but not for `**` splats inside dictionary literals, where it appears we treat `dict`s different to other mappings and we do not emit diagnostics for invalid `**` splats:\n\n```py\nfrom typing import Mapping, KeysView\n\nclass HasKeysAndGetItem:\n    def keys(self) -> KeysView[str]:\n        return {}.keys()\n    \n    def __getitem__(self, arg: str) -> int:\n        return 42\n\ndef h(**kwargs): ...\n\ndef f(\n    a: dict[str, int],\n    b: Mapping[str, int],\n    c: HasKeysAndGetItem,\n    d: object\n):\n    reveal_type({**a})  # dict[Unknown | str, Unknown | int] (good!)\n    reveal_type({**b})  # dict[Unknown, Unknown]             (bad!)\n    reveal_type({**c})  # dict[Unknown, Unknown]             (bad!)\n    reveal_type({**d})  # dict[Unknown, Unknown]             (good, but no diagnostic emitted!)\n    \n    h(**a)\n    h(**b)\n    h(**c)\n    h(**d)              # error: [invalid-argument-type] \"Argument expression after ** must be a mapping type: Found `object`\"\n```\n\nThe logic for `**` splats passed to function calls looks correct to me -- I think we probably want to do exactly the same thing inside dictionary literals, _except_ that we don't need to check whether the type of the keys is assignable to `str`. So we may want to extract that logic out into a helper function somewhere: https://github.com/astral-sh/ruff/blob/69f918203359f834e0ca76764a502f3421b2c2c7/crates/ty_python_semantic/src/types/call/bind.rs#L2691-L2742\n\nCc. @ibraheemdev -- this looks related to https://github.com/astral-sh/ruff/pull/20523\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1332/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1330",
      "id": 3501147534,
      "node_id": "I_kwDOOje-Bs7Qr0WO",
      "number": 1330,
      "title": "Shutdown request fails with \"invalid type: map, expected unit\" when params is empty object",
      "user": {
        "login": "achyudh",
        "id": 7617287,
        "node_id": "MDQ6VXNlcjc2MTcyODc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7617287?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/achyudh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-10-10T02:28:07Z",
      "updated_at": "2025-10-15T15:08:24Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe `ty` language server rejects LSP `shutdown` requests when the `params` field contains an empty JSON object `{}`, causing the server to crash instead of shutting down gracefully. Emacs eglot [recently changed](https://debbugs.gnu.org/cgi/bugreport.cgi?bug=66144) to send `{}` instead of `null` to accommodate other language servers (like `ocamllsp`) that have strict validation.\n\n### Error Message\n\n```\n[eglot] Server reports (type=1): ty failed to handle a request from the editor. Check the logs for more details.\n[jsonrpc] Server exited with status 9\njsonrpc-error: \"request id=5 failed:\", (jsonrpc-error-code . -32603), \n  (jsonrpc-error-message . \"JSON parsing failure: Invalid request Method: shutdown \n  error: invalid type: map, expected unit\")\n```\n\n### Steps to Reproduce\n\n1. Start `ty` language server via Emacs eglot\n2. Send a `shutdown` request with `M-x eglot-shutdown`\n3. Server crashes with the above error\n\n### Expected Behavior\n\nAccording to the [JSON-RPC 2.0 specification, section 4.2](https://www.jsonrpc.org/specification#parameter_structures):\n\n> **If present**, parameters for the rpc call MUST be provided as a Structured value. Either by-position through an Array or by-name through an Object.\n\nAn empty object `{}` is a valid structured value and should be accepted. The LSP specification inherits this from JSON-RPC.\n\n### Related Issues\n- Emacs bug report: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=66144\n- Similar issue was reported for helix: https://github.com/helix-editor/helix/issues/5400\n\n### Version\n\n- `ty` version: 0.0.1-alpha.21\n- Editor: Emacs 31.0.50 with eglot\n- OS: Ubuntu Linux 6.8.0-83-generic ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1330/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1329",
      "id": 3499485847,
      "node_id": "I_kwDOOje-Bs7QleqX",
      "number": 1329,
      "title": "Ty misses required-field diagnostic for SQLModel (works for BaseModel)",
      "user": {
        "login": "Duckling92",
        "id": 34375265,
        "node_id": "MDQ6VXNlcjM0Mzc1MjY1",
        "avatar_url": "https://avatars.githubusercontent.com/u/34375265?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Duckling92",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 10,
      "created_at": "2025-10-09T14:42:39Z",
      "updated_at": "2025-10-31T18:10:18Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\nTy flags missing required fields for `pydantic.BaseModel` but not for `sqlmodel.SQLModel` subclasses, both using Pydantic v2.\n\n### Minimal repro\n```py\nfrom __future__ import annotations\n\nfrom pydantic import BaseModel\nfrom sqlmodel import SQLModel\n\n\nclass ExamplePydantic(BaseModel):\n    number: float\n\n\nclass ExampleSQLModel(SQLModel):\n    number: float\n\n\nExampleSQLModel()  # ty: no error (bug)\nExamplePydantic()  # ty: error (good)\n```\n\n### Expected\nExpected: Both `ExampleSQLModel()` and `ExamplePydantic()` are flagged as missing required field number.\nActual: Only `ExamplePydantic()` is flagged, `ExampleSQLModel()` passes.\n\n### Environment\npython: 3.11.10\nsqlmodel: 0.0.27\nOS: MacOS Tahoe (26.0.1) \n\n### Version\n\nty 0.0.1-alpha.21 (ef52a1940 2025-09-19)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1329/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1327",
      "id": 3499225794,
      "node_id": "I_kwDOOje-Bs7QkfLC",
      "number": 1327,
      "title": "`dataclass_transform`: feature overview",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592544541,
          "node_id": "LA_kwDOOje-Bs8AAAACACfTHQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/dataclasses",
          "name": "dataclasses",
          "color": "1d76db",
          "default": false,
          "description": "Issues relating to dataclasses and dataclass_transform"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-10-09T13:37:25Z",
      "updated_at": "2025-12-19T11:20:38Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 3,
        "completed": 3,
        "percent_completed": 100
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Link to the specification: https://typing.python.org/en/latest/spec/dataclasses.html\n\n* Support all \"flavors\" of dataclass-transformers\n  * [x] Support `@dataclass_transform`-decorated functions (decorators), including overloaded ones\n  * [x] Support `@dataclass_transform`-decorated metaclasses\n  * [x] Support `@dataclass_transform`-decorated classes\n* [x] Support all parameters to `dataclass_transform`\n  * [x] `eq_default`\n  * [x] `order_default`\n  * [x] `kw_only_default`\n  * [x] `frozen_default`\n  * [x] `field_specifiers` (https://github.com/astral-sh/ty/issues/1068)\n* [x] #1386\n  * [x] … using a function-like transformer\n  * [x] … using a metaclass-based transformer\n  * [x] … using a class-based transformer\n* [ ] Support field specifier parameters\n  * [x] `init`\n  * [x] `default`\n  * [x] `default_factory`\n  * [x] `factory`\n  * [x] `kw_only`\n  * [x] #1385\n  * [ ] `converter`\n* [ ] Implement the semantics of classes which are neither frozen nor non-frozen, see this [comment and TODO](https://github.com/astral-sh/ruff/pull/21457#discussion_r2529812486).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1327/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1326",
      "id": 3496213632,
      "node_id": "I_kwDOOje-Bs7QY_yA",
      "number": 1326,
      "title": "Add a diagnostic that errors when a user accesses an instance method off a type[] type",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9331274371,
          "node_id": "LA_kwDOOje-Bs8AAAACLC_ygw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/unsoundness",
          "name": "unsoundness",
          "color": "9aa952",
          "default": false,
          "description": "Ty can give an expression type T, but at runtime it can have a non-T value, with no diagnostic."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-10-08T16:59:38Z",
      "updated_at": "2025-10-08T22:18:56Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is unsound, as described in https://github.com/microsoft/pyright/issues/11007\n\nDepending on ecosystem impact, this maybe has to be opt-in?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1326/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1323",
      "id": 3494419822,
      "node_id": "I_kwDOOje-Bs7QSJ1u",
      "number": 1323,
      "title": "support finding packages installed into Debian `dist-packages` directories",
      "user": {
        "login": "Hyask",
        "id": 7489759,
        "node_id": "MDQ6VXNlcjc0ODk3NTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7489759?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Hyask",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-10-08T08:29:59Z",
      "updated_at": "2026-01-08T23:28:41Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nReproducer is quite simple:\n```\nroot@ubuntu-noble:~/test# cat - >test.py <<EOD\nimport apt\n\nprint(apt.apt_pkg.version_compare(\"1.2.3\", \"1.2.4\"))\nprint(apt.apt_pkg.version_compare(\"1.2.4\", \"1.2.3\"))\nEOD\nroot@ubuntu-noble:~/test# python3 test.py\n-1\n1\nroot@ubuntu-noble:~/test# ty check test.py\nWARN ty is pre-release software and not ready for production use. Expect to encounter bugs, missing features, and fatal errors.\nChecking ------------------------------------------------------------ 1/1 fileserror[unresolved-import]: Cannot resolve imported module `apt`\n --> test.py:1:8\n  |\n1 | import apt\n  |        ^^^\n2 |\n3 | print(apt.apt_pkg.version_compare(\"1.2.3\", \"1.2.4\"))\n  |\ninfo: Searched in the following paths during module resolution:\ninfo:   1. /root/test (first-party code)\ninfo:   2. vendored://stdlib (stdlib typeshed stubs vendored by ty)\ninfo: make sure your Python environment is properly configured: https://docs.astral.sh/ty/modules/#python-environment\ninfo: rule `unresolved-import` is enabled by default\n\nFound 1 diagnostic\nroot@ubuntu-noble:~/test#\n```\n\nSome packages (like `apt`) are usually best installed from the system, when writing system tools, so having a `pyproject.toml` file isn't really a viable option.\nJust for the sake of it, I've tried adding a simple one with no dependencies specified, but as expected, it doesn't change the behavior.\n\n### Version\n\nty 0.0.1-alpha.21 (01fca5525 2025-10-07)",
      "closed_by": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1323/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1322",
      "id": 3493396622,
      "node_id": "I_kwDOOje-Bs7QOQCO",
      "number": 1322,
      "title": "Support go-to-definition for functional `TypedDict`s",
      "user": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9596740363,
          "node_id": "LA_kwDOOje-Bs8AAAACPAKjCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typeddict",
          "name": "typeddict",
          "color": "46775a",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-10-08T00:10:34Z",
      "updated_at": "2025-11-06T13:57:28Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "See https://github.com/astral-sh/ruff/pull/20732#discussion_r2411961096.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1322/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1313",
      "id": 3487912858,
      "node_id": "I_kwDOOje-Bs7P5VOa",
      "number": 1313,
      "title": "add a way to panic without the \"this is a bug\" message",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-10-06T15:44:57Z",
      "updated_at": "2026-01-09T03:06:35Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We have some user-triggerable cases that we just don't want to support at all (e.g. a custom typeshed without `object`), and want to just fail with an error. Currently we do this by panicking, but this emits an error message indicating that there's a bug in ty, which isn't the case here. We should have another way to \"fatal error\" that doesn't emit the \"this is a bug in ty, please report it\" message.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1313/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1309",
      "id": 3484683814,
      "node_id": "I_kwDOOje-Bs7PtA4m",
      "number": 1309,
      "title": "Multi-version checking",
      "user": {
        "login": "DetachHead",
        "id": 57028336,
        "node_id": "MDQ6VXNlcjU3MDI4MzM2",
        "avatar_url": "https://avatars.githubusercontent.com/u/57028336?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/DetachHead",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-10-05T10:51:53Z",
      "updated_at": "2025-11-18T16:10:39Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "many python projects support a range of python versions, eg. `>=3.9,<3.14`, which means having to write checks like this:\n\n```py\nif sys.version_info < (3, 13):\n    ...\nelse:\n    ...\n```\n\ncurrently, all the type checkers only support specifying one python version, which means one of those branches will incorrectly be treated as unreachable, when it's obvious that the developer intends for their code to run on multiple different python versions.\n\nrelated: #784",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1309/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1306",
      "id": 3483956974,
      "node_id": "I_kwDOOje-Bs7PqPbu",
      "number": 1306,
      "title": "A nominal type from a stub file should be treated as equivalent to a nominal type from a `.py` file with the same module name",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "2": {
          "id": 8614537247,
          "node_id": "LA_kwDOOje-Bs8AAAACAXdoHw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/stubs",
          "name": "stubs",
          "color": "006b75",
          "default": false,
          "description": "issues with understanding stub (pyi) files"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-10-04T16:54:33Z",
      "updated_at": "2025-10-07T23:45:09Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWe've been seeing strange diagnostics like [this](https://github.com/astral-sh/ruff/pull/20603#issuecomment-3345317444) in ecosystem reports for bokeh, and they're starting to show up [more](https://github.com/astral-sh/ruff/pull/20368#issuecomment-3368395654) as we add more functionality to ty:\n\n```\nsrc/bokeh/model/model.py:496:16: error[invalid-return-type] Return type does not match returned value: expected `set[src.bokeh.model.model.Model]`, found `set[src.bokeh.model.model.Model]`\n```\n\nA [minimal repro](https://play.ty.dev/da6dbbed-748c-44bd-8f35-b2e34145b212) of this issue looks something like the following:\n\n````md\n\n`package/__init__.py`:\n\n```py\nfrom .foo import MyClass\n\ndef make_MyClass() -> MyClass:\n    return MyClass()\n```\n\n`package/foo.pyi`:\n\n```py\nclass MyClass: ...\n```\n\n`package/foo.py`:\n\n```py\nclass MyClass: ...\n\ndef get_MyClass() -> MyClass:\n    from . import make_MyClass\n\n    # error: [invalid-return-type] \"Return type does not match returned value: expected `package.foo.MyClass`, found `package.foo.MyClass`\"\n    return make_MyClass()\n```\n````\n\nThe issue is that ty:\n1. Views `MyClass` from the `foo.py` file and `MyClass` from `foo.pyi` as being different classes\n2. Understands the `get_MyClass` function as being annotated as returning an instance of `MyClass` from `foo.py`\n3. Understands the `get_MyClass` function as _actually_ returning an instance of `MyClass` from `foo.pyi`\n\nI propose that we fix this by adding handling to make two nominal-instance types equivalent to each other if the two types come from modules that have the same fully qualified module names and come from the same search path.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1306/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1298",
      "id": 3478038895,
      "node_id": "I_kwDOOje-Bs7PTqlv",
      "number": 1298,
      "title": "Add Inlay Hints for variables in a for loop statement",
      "user": {
        "login": "MatthewMckee4",
        "id": 119673440,
        "node_id": "U_kgDOByISYA",
        "avatar_url": "https://avatars.githubusercontent.com/u/119673440?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MatthewMckee4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-10-02T15:52:15Z",
      "updated_at": "2025-11-18T16:10:39Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Type hint inlay hints would be nice to have in for loops, like this:\n\n```py\n\nfor i[: int] in range(1, 10): ...\n```\n\nI think this could be useful and rust-analyzer also supports it.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1298/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1297",
      "id": 3477120146,
      "node_id": "I_kwDOOje-Bs7PQKSS",
      "number": 1297,
      "title": "Unresolved references of IPython builtins in notebooks",
      "user": {
        "login": "jfaldanam",
        "id": 22096907,
        "node_id": "MDQ6VXNlcjIyMDk2OTA3",
        "avatar_url": "https://avatars.githubusercontent.com/u/22096907?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jfaldanam",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        },
        "1": {
          "id": 9412245782,
          "node_id": "LA_kwDOOje-Bs8AAAACMQN5Fg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/notebook",
          "name": "notebook",
          "color": "af5117",
          "default": false,
          "description": "support for Jupyter (or similar) notebooks"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-10-02T11:15:39Z",
      "updated_at": "2026-01-09T09:51:32Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen running `ty` on a Jupyter notebook, the IPython builtin `display` is flagged as an `unresolved-reference` unless it is explicitly imported. In Jupyter, `display` is provided by IPython and is commonly used without an import.\n\nAs an user, for `.ipynb` files executed in an IPython/Jupyter context, `ty` should recognize IPython-provided builtins (e.g., `display`) and not report them as unresolved.\n\nThe actual behavior is that `ty` reports `error[unresolved-reference]: Name 'display' used when not defined` for code cells that call `display(...)` without an explicit import.\n\n# Steps to reproduce\nThe following minimal working example illustrates how it diagnoses and unresolve-reference for the first use of display, but not when imported explicitly.\n\nTo reproduce:\n1. Save the following snippet as `test.ipynb`\n  * A very simple notebook with 2 cells, the first only runs `display(\"Hello, world!\")` while the second one runs `from IPython.display import display` and right after `display(\"Hello, world!\")`.\n2. Run `uvx ty check test.ipynb `\n3. Observe the diagnostic for the first cell but not the second\n```\nWARN ty is pre-release software and not ready for production use. Expect to encounter bugs, missing features, and fatal errors.\nChecking ------------------------------------------------------------ 1/1 files                                                                                 error[unresolved-reference]: Name `display` used when not defined\n --> tutorial/test.ipynb:cell 1:1:1\n  |\n1 | display(\"Hello, world!\")\n  | ^^^^^^^\n  |\ninfo: rule `unresolved-reference` is enabled by default\n\nFound 1 diagnostic\n```\n\n## Example to reproduce the issue\n\n```ipynb\n{\n \"cells\": [\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"id\": \"9c682895\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello, world!'\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"display(\\\"Hello, world!\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"id\": \"fc6f3693\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"'Hello, world!'\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"from IPython.display import display\\n\",\n    \"display(\\\"Hello, world!\\\")\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.11.12\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n```\n\n### Version\n\nty 0.0.1-alpha.21",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1297/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1273",
      "id": 3463252634,
      "node_id": "I_kwDOOje-Bs7ObQqa",
      "number": 1273,
      "title": "a way to explicitly specify variance using the new generic syntax",
      "user": {
        "login": "DetachHead",
        "id": 57028336,
        "node_id": "MDQ6VXNlcjU3MDI4MzM2",
        "avatar_url": "https://avatars.githubusercontent.com/u/57028336?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/DetachHead",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-09-29T05:00:49Z",
      "updated_at": "2025-11-18T16:10:39Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "the new generic syntax is got a significant downgrade compared to the old syntax where you can no longer explicitly specify the variance.\n\nit would be nice if ty had a way to work around this, eg:\n\n```py\nfrom ty_extensions import In, Out, InOut\n\nclass Foo[In[T]]: ... # contravariant\nclass Foo[Out[T]]: ... # covariant\nclass Foo[InOut[T]]: ... # invariant\n```\n\n(the names `In` and `Out` are taken from other languages like typescript, but perhaps for readability they could just be called `Covariant`, `Contravariant`, etc)\n\nsemi-related: #1017",
      "closed_by": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1273/reactions",
        "total_count": 4,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1268",
      "id": 3459951621,
      "node_id": "I_kwDOOje-Bs7OOqwF",
      "number": 1268,
      "title": "support `__slots__`",
      "user": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-09-27T08:01:19Z",
      "updated_at": "2025-11-12T23:44:46Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "`__slots__` is already handled specially in ty, but should be more fully supported in line with the Python specification.\n`__slots__` may not be a very commonly used feature, but several major libraries use it (e.g. [attrs](https://github.com/python-attrs/attrs/blob/50334f3fe759013f52cc533161e9b474e98bc460/src/attr/_make.py#L2436)), and supporting it could improve inference results and error reporting.\n\nref: https://docs.python.org/3/reference/datamodel.html#slots\n\nHere are the features that should be implemented:\n\n- [ ] Assume that the attributes defined in `__slots__` are not unresolved\n- [ ] Attempting to read/write/declare an attribute that is not defined in `__slots__` will be reported as an error\n- [ ] Defining a class variable to set a default value for a name that is defined in `__slots__` will be reported as an error\n- [ ] Remove `__dict__` and `__weakref__` from classes that define `__slots__`\n- [ ] An error will be raised if nonempty `__slots__` are defined for a class derived from a \"variable-length\" built-in type such as int, bytes, and tuple\n\n```python\nclass C:\n    __slots__ = (\"foo\",)\n\n    def __init__(self, foo, bar):\n        self.foo = foo\n        self.bar = bar  # error\n\n    baz: int  # error (pyright doesn't report this as an error)\n    foo: int = 1  # error\n\nclass D:\n    __slots__ = (\"bar\",)\n\nd = D()\nreveal_type(d.bar)  # revealed: Any or Unknown\nreveal_type(d.foo)  # error\nd.bar = 1  # ok\n# Classes with `__slots__` defined will not have a `__dict__` by default.\nd.foo = 1  # error\n\nclass E:\n    __slots__ = (\"foo\", \"__dict__\")\n\n    def __init__(self, foo, bar):\n        self.foo = foo\n        self.bar = bar  # ok\n\n# `F` has `__dict__` and `__weakref__`.\nclass F: ...\n\n# Even if a class defines `__slots__`, if the superclass has `__dict__` or `__weakref__`,\n# those attributes will be inherited.\nclass G(F):\n    __slots__ = (\"foo\",)\n\n    def __init__(self, foo, bar):\n        self.foo = foo\n        self.bar = bar  # ok\n\n# error: nonempty __slots__ not supported for subtype of 'int'\nclass H(int):\n    __slots__ = (\"foo\",)\n```\n\nrelated: #111",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1268/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1257",
      "id": 3454227085,
      "node_id": "I_kwDOOje-Bs7N41KN",
      "number": 1257,
      "title": "Incomplete assignability implementation between two `Callable` types where one `Callable` type has `*args: Any, **kwargs: Any`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        },
        "1": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-09-25T15:54:03Z",
      "updated_at": "2026-01-09T02:58:46Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe typing spec [states](https://typing.python.org/en/latest/spec/callables.html#meaning-of-in-callable):\n\n> If the input signature in a function definition includes both a `*args` and `**kwargs` parameter and both are typed as `Any` (explicitly or implicitly because it has no annotation), a type checker should treat this as the equivalent of `...`. Any other parameters in the signature are unaffected and are retained as part of the signature\n\nAnd we can see that in the conformance test suite, [this test](https://github.com/python/typing/blob/d4f39b27a4a47aac8b6d4019e1b0b5b3156fabdc/conformance/tests/callables_annotation.py#L157) asserts that `Proto7` should be understood as being assignable to `Proto6`: although the signature of `Proto7` is less permissive than the signature of `Proto6`, `Proto6` has a gradual signature due to the presence of `*args: Any` and `**kwargs: Any` in the signature, so the normal rules do not apply. The definitions of `Proto6` and `Proto7` in this test are:\n\n```py\nfrom typing import Protocol, Any\n\nclass Proto6(Protocol):\n    def __call__(self, a: int, /, *args: Any, k: str, **kwargs: Any) -> None: ...\n\nclass Proto7(Protocol):\n    def __call__(self, a: float, /, b: int, *, k: str, m: str) -> None: ...\n```\n\nNote that both [mypy](https://mypy-play.net/?mypy=latest&python=3.12&gist=7356c7d052605729aa815aa7c84ceea4) and [pyrefly](https://pyrefly.org/sandbox/?project=N4IgZglgNgpgziAXKOBDAdgEwEYHsAeAdAA4CeS4ATrgLYAEALqcROgOZ0Q3G6UN0AFag1wBjXFAA0dAILpSAHXRLRUVHDiDhuAGwAKIbhHioASkRK6Vuphhg6AfQejUUKE71wYUMNNSJOdAZpAHppACpUSjY4ALlSaQBrALgGSgjwxIB3KJi4%2BVM6AFoAPjoAOVx0GADCOqUVNQ0tI1wAdgNtE3NLa1t7Jxc3Dy8fPwCwKFxUYLowumwA1lnwpJS06Rp1ykLSiqqaujrCBqw7OjA9YjaAwxE2yR70azpcRIBGd9vtHToAXjo1ysAGI6AB5ADSShAkhAAFcGNA4CRyIgQKCAKqIqAQJgXOHoUSIqpwU79C68GgzBzoOE0bAwSh6fBLIK7MqpSgWZ7WSgwBhwyjPMAKEDlOkMrl0YD4AC%2BouhsthqCJEAAbjAAGLQGAUNBYPBEMggWVAA&version=3.12) also appear to fail this test currently; only [pyright](https://pyright-play.net/?pyrightVersion=1.1.405&strict=true&code=GYJw9gtgBALgngBwJYDsDmUkQWEMoAK4MYAxmADYA0UAginALABQLpFAhgM5eHFgA2ABREwJchQCUALhZR5UACYBTYFAD660hwoVNQrsorAaHaZhQwaAehoAqDiDRdz9ODQDW5rjBD27HgDujs6uDJJQALQAfFAAcmAoyuYAdGksbJw8fGJgAOwi-BIycgoqaprauvqGxqbmwBRgHFZQtlAARuaorXae3r40EAMgETHxiclQaSkZzOVQwEIIeeaiJHklzApQYB4AjPtr-AJQALxQK-IAxFAA8gDSLEA) currently passes this test.\n\nA version of this failing test for ty that doesn't involve protocols would be:\n\n```py\nfrom typing import Any\nfrom ty_extensions import CallableTypeOf, is_assignable_to, static_assert\n\ndef f(*args: Any, a: int, **kwargs: Any): ...\ndef g(fwomp: int, /, a: int, *, bar: str, baz: str): ...\n\nstatic_assert(is_assignable_to(CallableTypeOf[g], CallableTypeOf[f]))\n```\n\nhttps://play.ty.dev/4f422ed6-1725-4230-b803-a62325e218f6\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1257/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1256",
      "id": 3454150812,
      "node_id": "I_kwDOOje-Bs7N4iic",
      "number": 1256,
      "title": "Allow setting additional attributes on functions?",
      "user": {
        "login": "benglewis",
        "id": 3817460,
        "node_id": "MDQ6VXNlcjM4MTc0NjA=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3817460?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/benglewis",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-09-25T15:32:06Z",
      "updated_at": "2025-09-25T20:07:57Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nYou should be able to extend callable instances (e.g. functions) with attributes. Currently instead I get the above error for the following code:\n\n```python\ndef a():\n    a.test = 1\n```\n\n### Version\n\nty 0.0.1-alpha.21 (ef52a1940 2025-09-19)",
      "closed_by": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1256/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1254",
      "id": 3453886201,
      "node_id": "I_kwDOOje-Bs7N3h75",
      "number": 1254,
      "title": "A class with async constructor (__new__ + __init__) reported as not awaitable",
      "user": {
        "login": "dm0",
        "id": 319148,
        "node_id": "MDQ6VXNlcjMxOTE0OA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/319148?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dm0",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-09-25T14:24:06Z",
      "updated_at": "2025-09-25T14:26:12Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe following sample code:\n```python\nimport asyncio\n\nclass My:\n    async def __new__(cls, *args, **kwargs):\n        instance = super().__new__(cls)\n        await instance.__init__(*args, **kwargs)\n\n    async def __init__(self):\n        print('__init__')\n\nasync def main():\n    my = await My()\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\nreports `invalid-await` when checked with `ty check`:\n```\nr[invalid-await]: `My` is not awaitable\n  --> obj.py:12:16\n   |\n11 | async def main():\n12 |     my = await My()\n   |                ^^^^\n13 |\n14 | if __name__ == \"__main__\":\n   |\n  ::: obj.py:3:7\n   |\n 1 | import asyncio\n 2 |\n 3 | class My:\n   |       -- type defined here\n 4 |     async def __new__(cls, *args, **kwargs):\n 5 |         instance = super().__new__(cls)\n   |\ninfo: `__await__` is missing\ninfo: rule `invalid-await` is enabled by default\n``` \n\n\n\n### Version\n\n0.0.1-alpha.21",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1254/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1251",
      "id": 3451725724,
      "node_id": "I_kwDOOje-Bs7NvSec",
      "number": 1251,
      "title": "Solve `T` to `Never` for `*args: T` where no arguments are passed for `*args`",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-09-25T03:28:29Z",
      "updated_at": "2026-01-09T02:57:50Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\ndef f[A, B](a: A, *b: B) -> list[A | B]:\n    return [a, *b]\n\nresult = f(1) # list[Literal[1] | Unknown]\n```\n\nhere the `Unknown` should be removed (i'm pretty sure). this is consistent with basedpyright and mypy\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1251/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1248",
      "id": 3450076578,
      "node_id": "I_kwDOOje-Bs7No_2i",
      "number": 1248,
      "title": "better gradual guarantee for un-annotated dict (and other container?) literals",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-09-24T16:10:32Z",
      "updated_at": "2026-01-08T18:37:30Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 1,
        "percent_completed": 100
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In the ecosystem, we see this kind of pattern:\n\n```py\ndef f(a: int, b: str): ...\n\nx = { \"a\": 1, \"b\": \"2\" }\n\n# Expected `int` found `Unknown | int | str`\nf(x[\"a\"], x[\"b\"])\n# or\nf(**x)\n```\n\nIn this case, an un-annotated dict literal is used implicitly as a heterogeneous `TypedDict`. We (along with mypy and pyrefly) throw errors on these calls, because we infer the type of `x` as `dict[str, Unknown | int | str]`. (Pyrefly infers `dict[str, int | str]`, mypy `dict[str, object]`.)\n\nPyright avoids this problem by falling back to `dict[str, Unknown]` rather than inferring a union value type, when the dict contents look heterogeneous.\n\nA similar problem can occur with list literals (e.g. `x = [1, \"a\"]; f(x[0], x[1])`). We do see this in the ecosystem too, but it's less common than with dictionaries (probably because tuples are an attractive alternative, and implicit heterogeneity is supported for tuples).\n\nPerhaps ideally this would be solved by inferring a more precise heterogeneous \"implicit TypedDict\" type for these literals, but this gets very difficult to handle correctly with mutations.\n\nIf we do implement a \"gradual mode\" vs \"strict mode\", it may be worth emulating pyright's behavior in the \"gradual mode\".",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1248/reactions",
        "total_count": 4,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1240",
      "id": 3443398674,
      "node_id": "I_kwDOOje-Bs7NPhgS",
      "number": 1240,
      "title": "(mostly) stop unioning in `Unknown` type where there is no type annotation",
      "user": {
        "login": "DetachHead",
        "id": 57028336,
        "node_id": "MDQ6VXNlcjU3MDI4MzM2",
        "avatar_url": "https://avatars.githubusercontent.com/u/57028336?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/DetachHead",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8645345133,
          "node_id": "LA_kwDOOje-Bs8AAAACA01_bQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type-inference",
          "name": "type-inference",
          "color": "442A97",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 9,
      "created_at": "2025-09-23T02:28:53Z",
      "updated_at": "2026-01-10T09:04:56Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "the current default behavior is unsafe, see https://play.ty.dev/b92b01eb-09da-48ea-8e4b-02812d27a803\n```py\na = [1] # inferred as list[Unknown | int]\na.append(\"i'm not an int\") # no error\na.pop() + 1 # runtime crash\n```\n\nas mentioned in https://github.com/astral-sh/ty/issues/1211#issuecomment-3322024482:\n\n> I do think we will likely add an option to, or even default to, inferring the type of un-annotated generic container literals without the union with `Unknown`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1240/reactions",
        "total_count": 44,
        "+1": 44,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1235",
      "id": 3438967510,
      "node_id": "I_kwDOOje-Bs7M-nrW",
      "number": 1235,
      "title": "`__getattr__` causes unsafety on subclass declarations",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9331274371,
          "node_id": "LA_kwDOOje-Bs8AAAACLC_ygw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/unsoundness",
          "name": "unsoundness",
          "color": "9aa952",
          "default": false,
          "description": "Ty can give an expression type T, but at runtime it can have a non-T value, with no diagnostic."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-09-22T02:40:24Z",
      "updated_at": "2026-01-09T02:56:39Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nclass A:\n    known: str\n    def __getattr__(self, attr: str) -> int:\n        return 1\nclass B(A):\n    also_known: str\n\ndef f(a: A = B()):\n    a.also_known  # ty: int, runtime: str\n```\n\nan error should be shown on the declaration of `also_known`\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1235/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1232",
      "id": 3438899696,
      "node_id": "I_kwDOOje-Bs7M-XHw",
      "number": 1232,
      "title": "report invalid overload implementation when implementation is unannotated",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-09-22T02:03:32Z",
      "updated_at": "2025-11-18T16:10:38Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 1,
        "total_blocked_by": 1,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nfrom typing import overload\n\n@overload\ndef f(a: int) -> int: ...\n\n@overload\ndef f(a: str) -> str: ...\n\ndef f(a):\n    return 1  # expect error about this implementation being invalid\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1232/reactions",
        "total_count": 4,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1231",
      "id": 3438897510,
      "node_id": "I_kwDOOje-Bs7M-Wlm",
      "number": 1231,
      "title": "resolve intersection/not for comprehensive overload matching",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        },
        "2": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-09-22T02:02:24Z",
      "updated_at": "2025-11-18T16:10:38Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nfrom ty_extensions import Not\nfrom typing import overload, Literal\n\n@overload\ndef f1(a: Literal[True]) -> int: ...\n\n@overload\ndef f1(a: Literal[False]) -> str: ...\n\ndef f1(a):\n    return 1\n\n@overload\ndef f2(a: int) -> int: ...\n@overload\ndef f2(a: Not[int]) -> str: ...\n\ndef f2(a):\n    return 1\n\ndef main(b: bool, o: object):\n    _ = f1(b) # correct: int | str\n    _ = f2(o) # incorrect: Unknown\n```\n\nhere the overloads of `int` and `~int` should combine to match the input `object` and result in `int | str`\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1231/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1230",
      "id": 3438845555,
      "node_id": "I_kwDOOje-Bs7M-J5z",
      "number": 1230,
      "title": "report an error when a type variable cannot be resolved on a call-site",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-09-22T01:27:10Z",
      "updated_at": "2025-09-22T07:45:20Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 1,
        "total_blocked_by": 1,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nclass A[T]:\n    def __init__(self, *t: T): ...\n\nA()  # no error, expect: type variable `T@A` could not be resolved, please provide it explicitly\n```\n\ncurrently it becomes `Unknown` without an indication\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1230/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1225",
      "id": 3437792416,
      "node_id": "I_kwDOOje-Bs7M6Iyg",
      "number": 1225,
      "title": "don't display TypeVar scope when its definition is also being displayed",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-09-21T04:04:43Z",
      "updated_at": "2025-09-22T12:31:53Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nclass A[C]:\n    def f[F](self, x: C | F): ...\n\nx: int = A.f  # Object of type `def f[F](self, x: Unknown | F@f) -> Unknown` is not assignable to `int`\n```\n\nexcusing the `Unknown` here, but i would expect:\n\n`def f[F](self, x: C@A | F) -> Unknown`\n\nthe definition of `F` is included in the display, so also showing the scope is redundant\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1225/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1224",
      "id": 3437759828,
      "node_id": "I_kwDOOje-Bs7M6A1U",
      "number": 1224,
      "title": "don't specialize \"private\" members",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9331274371,
          "node_id": "LA_kwDOOje-Bs8AAAACLC_ygw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/unsoundness",
          "name": "unsoundness",
          "color": "9aa952",
          "default": false,
          "description": "Ty can give an expression type T, but at runtime it can have a non-T value, with no diagnostic."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 13,
      "created_at": "2025-09-21T03:14:20Z",
      "updated_at": "2025-10-11T01:01:23Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "it's unsafe to specialize private members:\n```py\nclass A[T]: # covariant\n    def __init__(self, t: T):\n         self._t = t\n\n    def get(self) -> T:\n        return self._t\n\n    def f(self):\n        a = A(1)\n        b: A[object] = a\n        b._t = \"what?\"\n        a._t + 1 # runtime error\n```\n\nthis can also manifest with annotated `self`:\n```py\nclass A[T]:\n    def __init__(self, t: T):\n        self._t = t\n    \n    def get(self) -> T:\n        return self._t\n\n    def set(self: A[object], value: str):\n        self._t = value  # expect error\n\n    \na = A[int](1)\na.set(\"a string???, i hope it doesn't set `_t`\")\na.get() + 1\n```\n\nthis also applies to contravariant type parameters and private methods\n\nif we instead never specialize private members, then we can only interact them safely with generic values, preventing this unsoundness",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1224/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1222",
      "id": 3437235703,
      "node_id": "I_kwDOOje-Bs7M4A33",
      "number": 1222,
      "title": "function containing infinite loop doesn't report any warning",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        },
        "1": {
          "id": 8760037609,
          "node_id": "LA_kwDOOje-Bs8AAAACCiOQ6Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/lint",
          "name": "lint",
          "color": "a3b2aa",
          "default": false,
          "description": "Label for features that we would implement as lint rules, not core type checker features"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-09-20T15:22:35Z",
      "updated_at": "2025-09-22T23:42:09Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\ndef f() -> int:\n    while True:\n        pass\n```\n\nwhile this is technically valid, it doesn't make any sense, imo the infinite loop control flow shouldn't allow this, or at least display a warning\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1222/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1221",
      "id": 3437232064,
      "node_id": "I_kwDOOje-Bs7M3__A",
      "number": 1221,
      "title": "generic aliases should be understood as what they are aliases to",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-09-20T15:18:45Z",
      "updated_at": "2025-11-18T16:10:38Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nfrom typing import Callable, List\n\nprint(Callable.mro()) # ty: no idea, works at runtime\nprint(List.mro())  # ty: no idea, works at runtime\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1221/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1219",
      "id": 3437068635,
      "node_id": "I_kwDOOje-Bs7M3YFb",
      "number": 1219,
      "title": "Document support for `PYTHONPATH`",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239594,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/documentation",
          "name": "documentation",
          "color": "0075ca",
          "default": true,
          "description": "Improvements or additions to documentation"
        },
        "1": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-09-20T11:53:16Z",
      "updated_at": "2025-11-14T08:53:51Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Update the https://docs.astral.sh/ty/modules/#python-environment to account for https://github.com/astral-sh/ruff/pull/20441 \n\nI also just realized that we need to change https://github.com/astral-sh/ruff/pull/20441 to add and use the `PYTHONPATH` to/from [`EnvVar`](https://github.com/astral-sh/ruff/blob/1d2128f918a2315a5fc81042b5417f9d8cf34282/crates/ty_static/src/env_vars.rs#L7) so that `PYTHONPATH` shows up in our environment variable documentation.\n\nCC: @mmlb in case you're interested in any of the work",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1219/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1213",
      "id": 3436779064,
      "node_id": "I_kwDOOje-Bs7M2RY4",
      "number": 1213,
      "title": "infer type of parameter from decorator",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 14,
      "created_at": "2025-09-20T06:43:01Z",
      "updated_at": "2025-09-23T02:03:18Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nfrom typing import Callable\n\ndef deco(fn: Callable[[int], None]) -> None: ...\n\n@deco\ndef f(i):\n    reveal_type(i)  # Unknown\n```\nhere i would expect `int`\n\n### Version\n\n_No response_",
      "closed_by": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1213/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1207",
      "id": 3432627700,
      "node_id": "I_kwDOOje-Bs7Mmb30",
      "number": 1207,
      "title": "include type parameters in display of generic callables",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239605,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/good%20first%20issue",
          "name": "good first issue",
          "color": "7057ff",
          "default": true,
          "description": "Good for newcomers"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "2": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-09-19T03:48:41Z",
      "updated_at": "2025-12-30T17:37:59Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\ndef f[T: int](t: T) -> T:\n    return t\n\nx = [f]\n```\nhere x is shown as `list[Unknown | ((t: T@f) -> T@f)]`\n\nexcusing the `Unknown`, i would expect the type parameters to be included\n`[T: int](t: T) -> T`\n\n\n\n### Version\n\n0b60584b7\n\nconnected with: #1225",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1207/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1206",
      "id": 3431247591,
      "node_id": "I_kwDOOje-Bs7MhK7n",
      "number": 1206,
      "title": "Include dotted module names in `import` completions?",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-09-18T17:08:45Z",
      "updated_at": "2025-11-18T16:10:37Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It might be cool if ty could include `collections.abc` (a dotted module name) in the list of suggested completions here:\n\n<img width=\"1282\" height=\"720\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/be5ae43a-9a6d-4e82-b919-2bf365b6a990\" />\n\nThoughts @BurntSushi?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1206/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1204",
      "id": 3431049907,
      "node_id": "I_kwDOOje-Bs7Mgaqz",
      "number": 1204,
      "title": "`ABC.register` not recognized on `collections.abc.Mapping`",
      "user": {
        "login": "gerlero",
        "id": 15150530,
        "node_id": "MDQ6VXNlcjE1MTUwNTMw",
        "avatar_url": "https://avatars.githubusercontent.com/u/15150530?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gerlero",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-09-18T16:09:21Z",
      "updated_at": "2026-01-09T00:56:52Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen using `Mapping.register(...)` to register a virtual subclass, `ty` reports an `unresolved-attribute` error on `register`.\n\n**Code to reproduce:**\n\n```python\nfrom collections.abc import Mapping\n\nclass MyClass:\n    pass\n\nMapping.register(MyClass)\n```\n\n**Error output:**\n\n```\nerror[unresolved-attribute]: Type `<class 'Mapping'>` has no attribute `register`\n --> test.py:6:1\n  |\n4 |     pass\n5 |\n6 | Mapping.register(MyClass)\n  | ^^^^^^^^^^^^^^^^\n  |\ninfo: rule `unresolved-attribute` is enabled by default\n```\n**Notes:**\n\nThis suggests to me that `ty` isn’t accounting for the fact that `collections.abc` classes are subclasses of `ABC`.\n\n\n### Version\n\nty 0.0.1-alpha.20",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1204/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1194",
      "id": 3424793947,
      "node_id": "I_kwDOOje-Bs7MIjVb",
      "number": 1194,
      "title": "report error when ambiguous `FunctionType` as `Enum` value",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 9338446479,
          "node_id": "LA_kwDOOje-Bs8AAAACLJ1ijw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/enums",
          "name": "enums",
          "color": "ac72c7",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-09-17T05:57:21Z",
      "updated_at": "2025-11-18T16:10:37Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nfrom enum import Enum\n\ndef f() -> object:\n    return lambda: 1\n\nclass E(Enum):\n    a = f()  # expect error: `object` can potentially be `FunctionType`, wrap this value with `enum.member` to enforce expected runtime behaviour\n\nE.a.name  # fails at runtime \n```\n[playground](https://play.ty.dev/fdd093de-9c24-4e1c-989d-a3cb5379deaa)\n\n`FunctionType` becomes a non-member, but currently ty assumes a super type of `FunctionType` is a member, use `enum.member` to override this and make it a member\n\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1194/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1193",
      "id": 3424687163,
      "node_id": "I_kwDOOje-Bs7MIJQ7",
      "number": 1193,
      "title": "Duplicate diagnostic when there are multiple functions with same signatures",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-09-17T05:12:38Z",
      "updated_at": "2025-11-14T08:54:12Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nConsider the following source code:\n\n```py\ndef f(x: int) -> None: ...\n\ndef _(x: str):\n    f(x)\n\ndef f(x: int) -> None: ...\n\ndef f(x: int) -> None: ...\n```\n\nI see the following diagnostics for the `f(x)` call:\n\n```\n    Argument to function `f` is incorrect: Expected `int`, found `str` (invalid-argument-type) [Ln 4, Col 7]\n    Argument to function `f` is incorrect: Expected `int`, found `str` (invalid-argument-type) [Ln 4, Col 7]\n    Argument to function `f` is incorrect: Expected `int`, found `str` (invalid-argument-type) [Ln 4, Col 7]\n```\n\nPlayground: https://play.ty.dev/8b8a0d58-1ba4-4bec-bb87-32179a6fa8e5\n\nSo, the number of diagnostics corresponds to the number of function definitions that exists which I think is because ty checks all function definitions. I think this is a bit confusing.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1193/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1190",
      "id": 3420647408,
      "node_id": "I_kwDOOje-Bs7L4u_w",
      "number": 1190,
      "title": "Should ty  support the Type Server Protocol?",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-09-16T06:27:44Z",
      "updated_at": "2025-10-06T23:20:40Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "\n### Discussed in https://github.com/astral-sh/ruff/discussions/20424\n\n<div type='discussions-op-text'>\n\n<sup>Originally posted by **rchiodo** September 15, 2025</sup>\nI proposed this idea back in May:\nhttps://github.com/microsoft/pylance-release/discussions/7180\n\nAnd I think we're (Pylance) getting close to being able to actually ship something that uses TSP. We'll be using it to launch Pyright (and soon Pyrefly) as our type server.\n\nWould you guys be open to me submitting PRs to add TSP support to Ty? I already have a skeleton working here:\nhttps://github.com/rchiodo/ruff/tree/rchiodo/tsp_investigation\n\nI'd love to submit that work and finish implementing all of the TSP requests in the protocol.</div>\n\nPosted by @rchiodo",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1190/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1172",
      "id": 3407528277,
      "node_id": "I_kwDOOje-Bs7LGsFV",
      "number": 1172,
      "title": "Eagerly turning a bound method into a callable leads to wrong signature",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        },
        "2": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-09-11T17:46:58Z",
      "updated_at": "2026-01-09T02:50:21Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is very similar to #1169, but since we've talked about this example a few times over the last days, here is our current handling of it:\n\n```py\nfrom typing import Self, Callable\n\nclass Base:\n    def method(self, other: Self) -> bool:\n        return True\n\nclass Derived(Base):\n    pass\n\n# This call succeeds, as it should (with a method-scoped `Self` typevar)\nDerived().method(Base())\n\n# However, this reveals `Derived.method(other: Derived) -> bool`,\n# which seems to contradict the successful call right above\nreveal_type(Derived().method)\n\n# Similarly, this assignment should not lead to an error, but currently does:\ncallable: Callable[[Base], bool] = Derived().method\n```\n\nhttps://play.ty.dev/8410eba7-30ab-44f8-8b1c-15fa00937b27",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1172/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1169",
      "id": 3405468154,
      "node_id": "I_kwDOOje-Bs7K-1H6",
      "number": 1169,
      "title": "Incorrect handling of bound methods that are overloaded on the type of `self`",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        },
        "2": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-09-11T08:41:09Z",
      "updated_at": "2026-01-09T02:49:37Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nConsider the following example, where our use of `CallableSignature::bind_self` to eagerly remove the first parameter leads to a wrong display type of the bound method. The call binding goes through a different code path and leads to the correct result, though:\n```py\nfrom __future__ import annotations\n\nfrom typing import reveal_type, overload\n\n\nclass C[T]:\n    x: T\n\n    @overload\n    def method(self: C[int]) -> int:\n        return 0\n\n    @overload\n    def method(self: C[str]) -> str:\n        return \"\"\n\n    def method(self) -> int | str:\n        raise NotImplementedError\n\n\nreveal_type(C[str]().method)    # ty: Overload[() -> int, () -> str]\nreveal_type(C[str]().method())  # ty: str\n```\nhttps://play.ty.dev/e75a9987-fcee-4bd9-a53f-d7edf9941465\n\nAlso related to this, we do not emit an error here. It might be argued that this is fine, though, as long as we're not calling the bound method:\n```py\nfrom typing import reveal_type\n\nclass C:\n    def wrong_annotation(self: int) -> int:\n        return 0\n\nreveal_type(C().wrong_annotation)\n```\nhttps://play.ty.dev/671b14e0-fa24-4ef9-a05d-8e2bfcaffe51\n\n### Version\n\nCurrent `main` (59c8fda3f)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1169/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1165",
      "id": 3403059580,
      "node_id": "I_kwDOOje-Bs7K1pF8",
      "number": 1165,
      "title": "Global version guard is not applied in functions",
      "user": {
        "login": "hynek",
        "id": 41240,
        "node_id": "MDQ6VXNlcjQxMjQw",
        "avatar_url": "https://avatars.githubusercontent.com/u/41240?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/hynek",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8677454701,
          "node_id": "LA_kwDOOje-Bs8AAAACBTdzbQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/unreachable-code",
          "name": "unreachable-code",
          "color": "666666",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-09-10T16:13:53Z",
      "updated_at": "2026-01-08T18:34:43Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI tried adding ty to _svcs_ in https://github.com/hynek/svcs/pull/141 since it's heavy on typing stuff and I've encountered this: https://play.ty.dev/004edf8e-54d0-4a7c-897b-78ebcfa2cdf8\n\nBasically I want to define a function depending on the Python version and use different APIs. If I pull the version_info check into the function, it passes.\n\n```py\nimport sys, inspect\nfrom collections.abc import Callable\n\n\nif sys.version_info >= (3, 10):\n\n    def _robust_signature(factory: Callable) -> inspect.Signature | None:\n        try:\n            # Provide the locals so that `eval_str` will work even if the user\n            # places the `Container` under a `if TYPE_CHECKING` block.\n            sig = inspect.signature(\n                factory,\n                locals={\"Container\": object()},\n                eval_str=True,\n            )\n        except Exception:  # noqa: BLE001\n            # Retry without `eval_str` since if the annotation is \"svcs.Container\"\n            # the eval will fail due to it not finding the `svcs` module\n            try:\n                sig = inspect.signature(factory)\n            except Exception:  # noqa: BLE001\n                return None\n\n        return sig\nelse:\n\n    def _robust_signature(factory: Callable) -> inspect.Signature | None:\n        try:\n            return inspect.signature(factory)\n        except Exception:  # noqa: BLE001\n            return None\n\n```\n\n### Version\n\nty 0.0.1-alpha.20 (f41f00af1 2025-09-03)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1165/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1164",
      "id": 3402832533,
      "node_id": "I_kwDOOje-Bs7K0xqV",
      "number": 1164,
      "title": "Should `top_materialization` use `default_specialization` for type vars?",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-09-10T14:58:55Z",
      "updated_at": "2026-01-07T00:13:49Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "@AlexWaygood:\n\n> I wondered if `class.top_materialization()` would work here, but it looks like under the hood that uses `default_specialization()`, so it suffers from the same issue as our current logic on `main`. (It probably _shouldn't_ use `default_specialization()`?)\n\n@dcreager\n\n> I think you're right — it should translate typevars into the bound/constraints in covariant position, and to `Never` (the implicit lower bound of every typevar) in contravariant position. (With the caveat that we can't really express the constraints of a constrained typevar as a single type — we'd need a \"one-of\" connective instead of union, and an \"instance of this type but not any subtypes\".)\n\n_Originally posted by @AlexWaygood in https://github.com/astral-sh/ruff/pull/20325#discussion_r2336862128_\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1164/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1163",
      "id": 3402430698,
      "node_id": "I_kwDOOje-Bs7KzPjq",
      "number": 1163,
      "title": "Validation of attribute assignments does not handle unions/intersections correctly",
      "user": {
        "login": "Glyphack",
        "id": 20788334,
        "node_id": "MDQ6VXNlcjIwNzg4MzM0",
        "avatar_url": "https://avatars.githubusercontent.com/u/20788334?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Glyphack",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-09-10T13:09:49Z",
      "updated_at": "2025-12-02T03:23:09Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis example is extracted from mdtests after adding explicit `self` annotation (related https://github.com/astral-sh/ruff/pull/18007)\n\nAfter adding self annotation the following example fails:\n\n```py\nfrom typing import Literal, Any\n\nclass DataDescriptor:\n    def __get__(self: \"DataDescriptor\", instance: object, owner: type | None = None) -> Literal[\"data\"]:\n        return \"data\"\n\n    def __set__(self: \"DataDescriptor\", instance: object, value: int) -> None:\n        pass\n\ndef _(flag: bool):\n    class Meta7(type):\n        if flag:\n            attr: DataDescriptor = DataDescriptor()\n        else:\n            attr: Literal[2] = 2\n\n    class C7(metaclass=Meta7):\n        pass\n\n    # Invalid assignment to data descriptor attribute `attr` on type `<class 'C7'>` with custom `__set__` method (invalid-assignment)\n    C7.attr = 2 if flag else 100\n```\nhttps://play.ty.dev/d25588da-713f-44d3-b35e-937808f43c06\n\nI expected the error to be related to DataDescriptor, since we added the `self` annotation and it failed.\nI could not find why adding `self` annotation causes the issue so I tried to change the other annotation.\n\nThis example has no diagnostics:\n\n```py\nfrom typing import Literal, Any\n\nclass DataDescriptor:\n    def __get__(self: \"DataDescriptor\", instance: object, owner: type | None = None) -> Literal[\"data\"]:\n        return \"data\"\n\n    def __set__(self: \"DataDescriptor\", instance: object, value: int) -> None:\n        pass\n\ndef _(flag: bool):\n    class Meta7(type):\n        attr: DataDescriptor = DataDescriptor()\n\n    class C7(metaclass=Meta7):\n        pass\n\n    C7.attr = 2 if flag else 100\n```\n\n### Version\n\nfd7eb1e22",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1163/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1162",
      "id": 3401955528,
      "node_id": "I_kwDOOje-Bs7KxbjI",
      "number": 1162,
      "title": "Consider improving compatibility with other type checkers around treatment of `Hashable`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "2": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        },
        "3": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-09-10T10:48:51Z",
      "updated_at": "2025-11-18T16:10:36Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In https://github.com/astral-sh/ruff/pull/20284, we reworked our logic so that `Hashable` is treated equivalently to `object` in subtyping and assignability checks. This is defensible from a theoretical perspective, since all instances of \"exactly `object`\" are hashable at runtime, which therefore makes `object` a subtype of `Hashable` by all normal rules of protocol assignability and subtyping. However, rules around hashability in Python do not obey the normal rules: hashable classes often inherit from unhashable ones, and unhashable classes often inherit from hashable ones, flying in the face of the Liskov Substitution Principle. Our current approach to `Hashable` and similar protocols makes these protocols effectively useless; we will not complain about code like this, even though users would expect us to do so (and even though other type checkers issue complaints):\n\n```py\nfrom typing import Hashable\n\ndef f(x: Hashable): ...\n\nf([])\n```\n\nGiven that the Liskov principle is so frequently and fragrantly violated for hashability, in Python's builtin types, standard library, and across a wide range of Python code, it may be worth us seeing if we can roll back https://github.com/astral-sh/ruff/pull/20284 and find another solution to https://github.com/astral-sh/ty/issues/1132 that improves our compatibility with other type checkers. The reason why other type checkers do not run into problems such as #1132 is that they do not eagerly simplify unions of `Hashable` and other types in the same way we do. We should consider doing the same; it would probably lead to more intuitive behaviour from users' perspective, and compatibility with other type checkers is also a useful goal.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1162/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1159",
      "id": 3399267187,
      "node_id": "I_kwDOOje-Bs7KnLNz",
      "number": 1159,
      "title": "Correctly handle overloads of `pydantic.Field`",
      "user": {
        "login": "AndreuCodina",
        "id": 30506301,
        "node_id": "MDQ6VXNlcjMwNTA2MzAx",
        "avatar_url": "https://avatars.githubusercontent.com/u/30506301?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AndreuCodina",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-09-09T17:10:29Z",
      "updated_at": "2025-12-03T19:47:17Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 1,
        "total_blocked_by": 1,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n`ty` can't detect a parameter declared in the docstring. In the next code, `model` isn't detected as a valid parameter:\n\n```python\n# python: \">=3.12\"\n# \"ty==0.0.1a20\"\n# \"pydantic==2.11.7\"\n# \"langchain-openai==0.3.32\"\n\n\nfrom langchain_openai import ChatOpenAI\nfrom pydantic import SecretStr\n\n\ndef main() -> None:\n    ChatOpenAI(\n        api_key=SecretStr(\"\"),\n        model=\"gpt-5\",\n    )\n\n\nif __name__ == \"__main__\":\n    main()\n```\n\n### Version\n\n_No response_",
      "closed_by": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1159/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1157",
      "id": 3398772643,
      "node_id": "I_kwDOOje-Bs7KlSej",
      "number": 1157,
      "title": "Fallback of recursive types to `Any` in return types of generic methods",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-09-09T14:38:24Z",
      "updated_at": "2025-11-13T07:40:30Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIn the following snippet, the return type of `wrap` falls back to `Wrapper[Any | None]`. Note that this only happens if `wrap` itself is generic. When the (dummy) generic context `[S]` is removed, the return type is `Wrapper[Recursive]`, as expected:\n\n```py\ntype Recursive = Recursive | None\n\nclass Wrapper[T]: ...\n\nclass C[T]:\n    @staticmethod\n    def wrap[S]() -> Wrapper[T]:\n        return Wrapper()\n\nreveal_type(C[Recursive].wrap())  # Wrapper[Any | None]\n```\nhttps://play.ty.dev/14d6e89f-8f51-4322-a862-c14799c67e9a\n\n### Version\n\ncurrent main (25853e237)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1157/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1154",
      "id": 3397378527,
      "node_id": "I_kwDOOje-Bs7Kf-Hf",
      "number": 1154,
      "title": "right hand of operator incorrectly takes precedence",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-09-09T08:56:33Z",
      "updated_at": "2025-09-10T00:30:54Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\nfrom __future__ import annotations\n\nclass A:\n    def __or__(self, other: A) -> A:\n        return self\n\n    def __ror__(self, other: A) -> B:\n        return B()\n\nclass B(A):\n    def __ror__(self, other: A) -> B:\n        return B()\n\nclass C(A):\n    pass\n    \ndef f(\n    a: A = C(),\n    b: B = B(),\n):\n    x = a | b  # ty: B, runtime: C\n\nf()\n```\n\nthis unsafety is also discussed in this issue:\n- #630\n",
      "closed_by": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1154/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1150",
      "id": 3392747324,
      "node_id": "I_kwDOOje-Bs7KOTc8",
      "number": 1150,
      "title": "handle binary operators input parameters safely and special-case `NotImplementedType` as a return type",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "2": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 16,
      "created_at": "2025-09-08T06:07:07Z",
      "updated_at": "2026-01-09T02:48:16Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## summary\n\noperators are unsafe when they return `NotImplemented`:\n\n```py\nfrom types import NotImplementedType\n\n\nclass A:\n    def __or__(self, other: object) -> str:\n        return NotImplemented\n\nclass B:\n    def __ror__(self, other: object) -> int:\n        return 1\n\nx = A() | B()\nx # static: str, runtime: int\n```\n\noperators are unsafe when the right hand side is anticipated:\n\n```py\nclass Left:\n    def __add__(self, other: int) -> int:\n        # here \"other\" is Right\n        return other + 1  # TypeError here\n\n\nclass Right:\n    def __radd__(self, other: Left) -> str:\n        return \"i'm string :)\"\n\nleft = Left()\nleft + 1  # no error, left accepts `int`\nleft + \"\" # error, left only accepts `int`\nleft + Right()  # no error, but left still only accepts `int`\n```\n\n# body\n\nhttps://play.ty.dev/88221963-684d-46c5-a36d-d4c104de716d\n\nhere the result is `int | _NotImplementedType`, but it's impossible for it to be `_NotImplementedType` (due to runtime semantics), which should be removed when using the operator syntax\n\nrelevant issues:\n- https://github.com/DetachHead/basedpyright/issues/1465\n- https://github.com/DetachHead/basedpyright/issues/1092\n\nadditionally, having `NotImplementedType` in the return position should dicatate the resolution of the result:\nhttps://play.ty.dev/1cfab337-6b92-4c15-9ac5-9bbf42bd1ae9\n\nhere, the result should not be `int | NotImplementedType`, it should be `int | str`\n\nwe could implement an optional rule that will enforce the usage of `NotImplementedType` into the signature when it is used in a return position, in order to preserve backwards compatibility\n\n### input parameter\n\nfor the second case where the the input parameter is passed an invalid type, i would expect an error on the invalid call, and would expect only corectly typed operators to be supported:\n```py\nclass CanRightAdd[T]:\n    def __radd__(self, other: T, /) -> object: ...\n\nclass Left:\n    @overload\n    def __add__(self, other: int) -> int: ...\n    @overload\n    def __add__(self, other: CanRightAdd[Left] & Not[int]) -> NotImplementedType: ...\n\n    def __add__(self, other):\n        if isinstance(other, int):\n            return other + 1\n        return NotImplemented\n        \n\nLeft() + Right()    # expect no error, and works at runtime 😊\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1150/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1138",
      "id": 3389151734,
      "node_id": "I_kwDOOje-Bs7KAln2",
      "number": 1138,
      "title": "Detect class attributes set by metaclasses `__init__` method",
      "user": {
        "login": "strangemonad",
        "id": 133905,
        "node_id": "MDQ6VXNlcjEzMzkwNQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/133905?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/strangemonad",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-09-06T01:21:25Z",
      "updated_at": "2026-01-09T02:40:44Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nI'm not sure if this is a patito-specific issue or a more general metaclass lookup issue.\n\nhttps://play.ty.dev/2e6bfe16-f59c-46f0-82c0-aaebcacb942d\n\nContext\n- polars is a popular dataframe library\n- patito allows you to define the schema of individual rows as pydantic models\n- This code checks in pyright/basepyright. I haven't checked mypy, pyre or others.\n\nThe implementation relies on a metaclass to define some of this behavior.\n \nIn particular in the following code\n```python\nimport patito as pt\n\nclass Person(pt.Model):\n    name: str\n\nresults = Person.DataFrame(...)\n```\n\nThe `Person.DataFrame` class var is added by the `patito.pydantic.ModelMetaclass(PydanticModelMetaclass)`. It's a common and convenient shortcut for the getting a dataframe constructor that's already bound to the correct generic type var and run time model class to allow for runtime schema validation. The alternative would be something like the following.\n\n```\nresults = pt.DataFrame[Person]().set_model(Person)\n```\n\n### Version\n\nty 0.0.1-alpha.20 (f41f00af1 2025-09-03)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1138/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1136",
      "id": 3388267691,
      "node_id": "I_kwDOOje-Bs7J9Nyr",
      "number": 1136,
      "title": "understand implicit generic context of a `Callable` annotation",
      "user": {
        "login": "RubenVanEldik",
        "id": 25854734,
        "node_id": "MDQ6VXNlcjI1ODU0NzM0",
        "avatar_url": "https://avatars.githubusercontent.com/u/25854734?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/RubenVanEldik",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 12,
      "created_at": "2025-09-05T17:18:02Z",
      "updated_at": "2026-01-09T13:43:42Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n\nI am not completely sure if this is an issue with ty or Streamlit, but [the maintainers of Streamlit think](https://github.com/streamlit/streamlit/issues/12442) that this might be an issue with ty.\n\nty raises an error for `st.stop()` as it does not understand that `st.stop()` will never return. Even though `st.stop()` has `NoReturn` as return type.\n\nAs far as I understand the issue, this is not related to https://github.com/astral-sh/ty/issues/180.\n\n```py\nimport typing\n\nimport streamlit as st\n\ndef my_func() -> typing.NoReturn:\n    st.write(\"Hello world\")\n    st.stop()\n\nmy_func()\n```\n\n```\nerror[invalid-return-type]: Function always implicitly returns `None`, which is not assignable to return type `Never`\n --> main.py:5:18\n  |\n3 | import streamlit as st\n4 |\n5 | def my_func() -> typing.NoReturn:\n  |                  ^^^^^^^^^^^^^^^\n6 |     st.write(\"Hello world\")\n7 |     st.stop()\n  |\ninfo: Consider changing the return annotation to `-> None` or adding a `return` statement\ninfo: rule `invalid-return-type` is enabled by default\n\nFound 1 diagnostic\n```\n\nI used `ty 0.0.1-alpha.20` here\n\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1136/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1130",
      "id": 3385768963,
      "node_id": "I_kwDOOje-Bs7JzrwD",
      "number": 1130,
      "title": "Account for TypedDicts in narrowing of `isinstance(..., dict)`",
      "user": {
        "login": "JelleZijlstra",
        "id": 906600,
        "node_id": "MDQ6VXNlcjkwNjYwMA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/906600?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/JelleZijlstra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        },
        "1": {
          "id": 9596740363,
          "node_id": "LA_kwDOOje-Bs8AAAACPAKjCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typeddict",
          "name": "typeddict",
          "color": "46775a",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-09-04T23:11:13Z",
      "updated_at": "2026-01-09T02:33:37Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWe just closed #456, but there's one special case that needs more attention: `isinstance(x, dict)`. The tricky part is that TypedDicts are instances of `dict` at runtime, but are not (generally) assignable to any materialization of `dict[Any, Any]`. (See the proposed spec change in https://github.com/python/typing/pull/2072 for the details.)\n\nCurrent behavior is as follows ([playground](https://play.ty.dev/89647293-a588-442d-ae5c-d0e2fbdacd2c)):\n\n```python\nfrom typing import TypedDict\n\nclass X(TypedDict):\n    a: int\n\ndef _(x: list | X):\n    if isinstance(x, dict):\n        reveal_type(x)  # X & Top[dict[Unknown, Unknown]]\n    else:\n        reveal_type(x)  # list[Unknown] | (X & ~Top[dict[Unknown, Unknown]])\n```\n\nMypy and pyright both infer `X` in the positive branch and `list[Any]` in the negative branch, which is what we'd want.\n\nI know TypedDict support is still missing a lot of functionality, so things will change, but I see a few options:\n\n- Make TypedDict types into subtypes of `Top[dict[Unknown, Unknown]]`. That would make this sample work correctly, but it's technically wrong in that TypedDicts aren't materializations of `dict[Any, Any]`. As such, it may cause issues with other possible use cases for `Top[]`. It would also allow some unsafe operations (https://github.com/JelleZijlstra/unsoundness/blob/main/examples/narrowing/isinstance_dict.py).\n- Change the spec so that TypedDict types are assignable to `dict[str, Any]`. I think that's a defensible change, but it's not what the current spec says and I don't know if such a change would see a positive reception.\n- Add a new special form `ty_extensions.AnyTypedDict`, with the semantics that any TypedDict type is a subtype of `AnyTypedDict`. The only allowed operations on `AnyTypedDict` are those that are allowed on any TypedDict (so no `.clear()`; `.keys()` returns an iterable of `str`; `.values()` an iterable of `object`; etc.). `isinstance(x, dict)` would narrow to `AnyTypedDict | Top[dict[Unknown, Unknown]]`. This is technically correct and would fix the soundness hole in https://github.com/JelleZijlstra/unsoundness/blob/main/examples/narrowing/isinstance_dict.py, but it would introduce a new user-visible concept.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1130/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1124",
      "id": 3381140874,
      "node_id": "I_kwDOOje-Bs7JiB2K",
      "number": 1124,
      "title": "support `typing.Self` used as attribute (or dataclass field) type",
      "user": {
        "login": "JoanPuig",
        "id": 2189008,
        "node_id": "MDQ6VXNlcjIxODkwMDg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2189008?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/JoanPuig",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-09-03T20:12:58Z",
      "updated_at": "2026-01-09T23:21:32Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe following code:\n\n```py\nfrom dataclasses import dataclass\nfrom typing import Optional, Self\n\n\n@dataclass(frozen=True)\nclass MyClass:\n    field: Optional[Self] = None\n\n\nMyClass(MyClass())\n```\n\nreports the following, which I believe should not be an error:\n\n```\nerror[invalid-argument-type]: Argument is incorrect\n  --> src\\main.py:10:9\n   |\n10 | MyClass(MyClass())\n   |         ^^^^^^^^^ Expected `typing.Self | None`, found `MyClass`\n   |\ninfo: rule `invalid-argument-type` is enabled by default\n\nFound 1 diagnostic\n```\n\n\n\n### Version\n\n0.0.1-alpha.20 (f41f00af1 2025-09-03)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1124/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1112",
      "id": 3372002581,
      "node_id": "I_kwDOOje-Bs7I_K0V",
      "number": 1112,
      "title": "`pytest.skip` (and variants) are `NoReturn` but not properly detected",
      "user": {
        "login": "mflova",
        "id": 67102627,
        "node_id": "MDQ6VXNlcjY3MTAyNjI3",
        "avatar_url": "https://avatars.githubusercontent.com/u/67102627?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mflova",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-09-01T09:42:53Z",
      "updated_at": "2025-12-03T19:39:10Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nMaybe it is because `NoReturn` is not supported yet, but this snippet is OK for `mypy` but not for `ty`:\n\n```py\nimport pytest\n\n\ndef my_fixture() -> (\n    int\n):  #  error[invalid-return-type] Function can implicitly return `None`, which is not assignable to return type `int`\n    try:\n        return 2\n    except NotImplementedError:\n        pytest.skip(\"Not implemented\")\n```\n\nHowever, this is OK despite it is also based on `NoReturn`:\n\n```py\nfrom typing import NoReturn\n\n\ndef my_fixture() -> int:\n    try:\n        return 2\n    except NotImplementedError:\n        func()\n\n\ndef func() -> NoReturn:\n    raise NotImplementedError(\"This function is not yet implemented\")\n```\n\nBoth functions are labelled as `NoReturn`. I guess it is related to the decorator attached to `skip` from `pytest`\n\n### Version\n\n0.0.1-alpha.19",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1112/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1109",
      "id": 3370490659,
      "node_id": "I_kwDOOje-Bs7I5Zsj",
      "number": 1109,
      "title": "`Top[]` should respect upper bound",
      "user": {
        "login": "InSyncWithFoo",
        "id": 122007197,
        "node_id": "U_kgDOB0WunQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/122007197?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/InSyncWithFoo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-08-31T16:56:16Z",
      "updated_at": "2025-09-02T15:34:42Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Minimal reproducible example ([playground](https://play.ty.dev/64e41ddb-8baf-43e0-abfd-64c45f0004c5)):\n\n```python\nclass Covariant[T: int]:\n    def _(self) -> T: ...\n\ndef _(covariant: Top[Covariant[Any]]):\n    reveal_type(covariant)  # `Covariant[object]`, but should instead be `Covariant[int]`\n```\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1109/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1104",
      "id": 3363939211,
      "node_id": "I_kwDOOje-Bs7IgaOL",
      "number": 1104,
      "title": "Consider vendoring third-party typeshed stubs, too",
      "user": {
        "login": "aidandj",
        "id": 63606283,
        "node_id": "MDQ6VXNlcjYzNjA2Mjgz",
        "avatar_url": "https://avatars.githubusercontent.com/u/63606283?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/aidandj",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 19,
      "created_at": "2025-08-28T16:22:54Z",
      "updated_at": "2025-11-14T17:45:10Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nGiven this small code block:\n\n```\nimport grpc\n\ntry:\n    something = 1\nexcept grpc.RpcError as e:\n    e.code()\n```\n\nI'm getting this error: `warning[unresolved-attribute]: Type `RpcError` has no attribute `code``\n\nThis type exists [in typeshed](https://github.com/python/typeshed/blob/c0fed911d64e483e89dc2190aad057f93fc431d3/stubs/grpcio/grpc/__init__.pyi#L325) and pyright seems to pick it up and does not complain. But `ty` does.\n\n### Version\n\nty 0.0.1-alpha.19 (e9cb838b3 2025-08-19)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1104/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1102",
      "id": 3363583003,
      "node_id": "I_kwDOOje-Bs7IfDQb",
      "number": 1102,
      "title": "When will `ty` be ready for production use?",
      "user": {
        "login": "axiomofjoy",
        "id": 15664869,
        "node_id": "MDQ6VXNlcjE1NjY0ODY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/15664869?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/axiomofjoy",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-08-28T14:36:50Z",
      "updated_at": "2025-09-02T12:51:38Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I'm interested in migrating off `mypy` for [this project](https://github.com/Arize-ai/phoenix) and have had great experiences with astral tooling such as `ruff` and `uv` in the past. Wondering when will `ty` be ready for primetime?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1102/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1100",
      "id": 3359015933,
      "node_id": "I_kwDOOje-Bs7INoP9",
      "number": 1100,
      "title": "TypeVar with constraints incorrectly solved when `Unknown` argument is passed in",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-08-27T11:31:34Z",
      "updated_at": "2025-11-13T07:36:32Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\ndef f[T: (str, bytes)](x: T) -> T:\n    return x\n\ndef g(x):\n    reveal_type(f(x))  # revealed: str\n```\n\nhttps://play.ty.dev/dfbe3306-e4f1-46c1-a888-d8b178dc86b0\n\n`str` feels much too confident here -- I think this should either be `Unknown` or `str | bytes`?\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1100/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1090",
      "id": 3348418114,
      "node_id": "I_kwDOOje-Bs7HlM5C",
      "number": 1090,
      "title": "ty allows passing different types for constrained TypeVar arguments.",
      "user": {
        "login": "IDrokin117",
        "id": 41319097,
        "node_id": "MDQ6VXNlcjQxMzE5MDk3",
        "avatar_url": "https://avatars.githubusercontent.com/u/41319097?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/IDrokin117",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-08-23T15:58:43Z",
      "updated_at": "2025-12-05T00:40:00Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "# Summary\nTy doesn't flag issues when two distinct types are passed to a function that uses the same generic type parameter T for its arguments. This might be allowed for `bound` types (if satisfy), but not for `constraints`. See examples for mypy and pyrefly.\n```python\nfrom typing import TypeVar\n\nT = TypeVar(\"T\", int, str) \ndef q(s: T, s1: T): # s and s1 must have the same type\n    pass\nq(1, \"str\") # not OK\n```\n```python\nfrom typing import TypeVar\n\nT = TypeVar(\"T\",  bound=int | str) \ndef q(s: T, s1: T): # s and s1 might be only subtype of \"int | str\"\n    pass\nq(1, \"str\")  # OK\n```\nSee [Bound versus Constraints](https://www.gaohongnan.com/computer_science/type_theory/05-typevar-bound-constraints.html#id20)\n## Playgrounds\n- [Ty](https://play.ty.dev/85f7a6c3-e88b-49fd-aa49-d4b85bd0ffe9). No errors\n- [Mypy](https://mypy-play.net/?mypy=latest&python=3.12&gist=552421be9605bfe11da9e665ae663fef). ```main.py:7: error: Value of type variable \"T\" of \"q\" cannot be \"object\"  [type-var]```\n- [Pyrefly](https://pyrefly.org/sandbox/?code=GYJw9gtgBALgngBwJYDsDmUkQWEMogCmAboQIYA2A%2BvAoQFCiSyKoZY55QAqihAamRD163KAF4efQSAAUAIm7yANJhQxVAZxggAlPQAmhYFACOszQC4eWgIzXuuy-SiuoCMps31zt1fO0QeV0gA&version=3.12) ```ERROR 7:6-11: Argument `Literal['str']` is not assignable to parameter `s1` with type `int` in function `q` [[bad-argument-type](https://pyrefly.org/en/docs/error-kinds/#bad-argument-type)]```\n\n### Version\n\n0.0.1-alpha.19",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1090/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1088",
      "id": 3344836161,
      "node_id": "I_kwDOOje-Bs7HXiZB",
      "number": 1088,
      "title": "Re-evaluate AST garbage collection",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-08-22T09:37:12Z",
      "updated_at": "2025-08-22T09:37:12Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We collect AST nodes of first-party files when checking the entire project to reduce peak memory usage. \n\nThis is great for the CLI, but may negatively impact the LSP performance, because ty has to reparse all first-party files when computing the workspace symbols, auto import completions, or when re-checking a project. \n\nFor the LSP use case, a better approach is probably to enable LRU on parsed ASTs, because it ensures that we never throw away parsed modules within a revision and retain frequently used ASTs in memory (but collect ASTs that are rarely used or only used once and never again). \n\nThe downside of only using LRU is that it results in higher peak memory usage, but that's only the case when all LSP features other than diagnostics is disabled because the workspace symbols feature doesn't drop the ASTs after indexing.\n\nCC: @ibraheemdev, CC: @BurntSushi ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1088/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1086",
      "id": 3344304515,
      "node_id": "I_kwDOOje-Bs7HVgmD",
      "number": 1086,
      "title": "Remove `Definition` from `CallableType`",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-08-22T06:26:56Z",
      "updated_at": "2025-11-17T17:58:30Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Today, `CallableType` stores a `Definition` so that `signature_help` and `inlay_hints` can extract a docstring. However, it seems semantically wrong that two `CallableType` that are only different in their definition don't compare equal (and are interned twice):\n\n> If the type we have is \"the type of all callables that take a single parameter named `x` of type `int` and return a `str`\" (this is `Type::CallableType`), there are many, many possible runtime inhabitants of that type, and we have no idea where they might be defined. So it doesn't make sense for that type to store or be able to provide a `Definition`.\n\nAs far as typing's concerned, two `CallableType`s are equivalent even if their `Definition` differs. I suspect that this could lead to subtle bugs where we show an incorrect docstring if the `Definition` isn't removed in all type operations and we then propagate.\n\nThere's also no strong reason for the LSP to use `CallableTypes` in the first place. The only reason the LSP server depends on `CallableType` to have a `Definition` is because [`call_signature_details`](https://github.com/astral-sh/ruff/blob/4ac2b2c22283c9f8eb7f7fd945ab1c5f08098ab4/crates/ty_python_semantic/src/types/ide_support.rs#L819) calls `into_callable()` on the callee (`CallExpression::func`) which resolves `a = Class()` to `Class.__init__`, something that calling `bindings()` directly on `Type` doesn't, I suspect due to this TODO:\n\nhttps://github.com/astral-sh/ruff/blob/14fe1228e72dca90db6b3dbb7e07f973d175ea0e/crates/ty_python_semantic/src/types.rs#L4683-L4696\n\nWe should rewrite the LSP so that `call_signature_details` doesn't call `into_callable` and instead resolves the bindings directly on the callee's type but without loosing support for resolving constructor calls. This will then allow us to remove `Definition` from `CallableType`.\n\nYou can find some more details in the conversation in https://github.com/astral-sh/ty/issues/1071#issuecomment-3209578522\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1086/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1084",
      "id": 3342771398,
      "node_id": "I_kwDOOje-Bs7HPqTG",
      "number": 1084,
      "title": "Full config support in editor settings",
      "user": {
        "login": "OliverGuy",
        "id": 10829642,
        "node_id": "MDQ6VXNlcjEwODI5NjQy",
        "avatar_url": "https://avatars.githubusercontent.com/u/10829642?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/OliverGuy",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-08-21T18:27:19Z",
      "updated_at": "2025-11-14T08:57:38Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIt looks like the  [configuration options](https://docs.astral.sh/ty/reference/configuration/) do not seem fully supported within the [editor settings](https://docs.astral.sh/ty/reference/editor-settings/), namely `ty.rules`.\n\nHere's the relevant snippet of my neovim config:\n```lua\nvim.lsp.config('ty', {\n  settings = {\n    ty = {\n      diagnosticMode = 'workspace',\n      experimental = {\n        -- this toggle works:\n        rename = true,\n      },\n      rules = {\n        -- this one doesn't:\n        ['invalid-parameter-default'] = 'ignore',\n      },\n    },\n  },\n})\n```\nHere's a python snippet to trigger the rule I am trying to ignore:\n```python\ndef foo(bar: int = None):\n    pass\n```\n\nPS: love the project, keep it up 🙏 \n\n### Version\n\n0.0.1-alpha.19 (e9cb838b3 2025-08-19)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1084/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1079",
      "id": 3341248048,
      "node_id": "I_kwDOOje-Bs7HJ2Yw",
      "number": 1079,
      "title": "PyCharm: clickable file reference links",
      "user": {
        "login": "davidhyman",
        "id": 5198267,
        "node_id": "MDQ6VXNlcjUxOTgyNjc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5198267?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/davidhyman",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-08-21T10:44:33Z",
      "updated_at": "2025-10-22T17:36:15Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nUsing `ty` in PyCharm editor window doesn't give a clickable jump-to-source file link. This makes it cumbersome to jump to the source referenced by a _diagnostic_.\n\n```\nWARN ty is pre-release software and not ready for production use. Expect to encounter bugs, missing features, and fatal errors.\nChecking ------------------------------------------------------------ 21/21 files                                                                                                                                                error[unresolved-reference]: Name `notatype` used when not defined                                                                                                                                                               \n  --> src/project/file.py:33:18\n```\n\nSeems similar to:\nhttps://github.com/astral-sh/ruff/issues/19983\n\nIn that instance, it works (the file link is clickable):\n```\nruff check --output-format=concise\nsrc/project/file.py:33:18: F821 Undefined name `notatype`\n```\n\nHowever the workaround/fix of using `--output-format=concise` does not result in a working format using `ty` (the file link is still not clickable):\n```\nsrc/project/file.py:33:18: error[unresolved-reference] Name `notatype` used when not defined\n```\n\n- `ty`: `ty 0.0.1-alpha.19`\n- `pycharm`: `PyCharm 2025.2.0.1`\n- `ruff`: ` 0.12.9`\n- `os`: `Ubuntu 24.04.3 LTS`\n\n\n### Version\n\nty 0.0.1-alpha.19",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1079/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1074",
      "id": 3340318055,
      "node_id": "I_kwDOOje-Bs7HGTVn",
      "number": 1074,
      "title": "Support baselines, i.e., ignore existing errors for incremental adoption",
      "user": {
        "login": "larroy",
        "id": 928489,
        "node_id": "MDQ6VXNlcjkyODQ4OQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/928489?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/larroy",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-08-21T05:15:35Z",
      "updated_at": "2025-11-18T16:10:36Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nTo add type checking to existing projects is desirable to be able to ignore existing issues. TY should accept a file with current failed diagnostics to be able to add ty to existing projects.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1074/reactions",
        "total_count": 11,
        "+1": 11,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1073",
      "id": 3340141061,
      "node_id": "I_kwDOOje-Bs7HFoIF",
      "number": 1073,
      "title": "Check for `if` conditions that are always truthy",
      "user": {
        "login": "kkpattern",
        "id": 897336,
        "node_id": "MDQ6VXNlcjg5NzMzNg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/897336?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/kkpattern",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8760037609,
          "node_id": "LA_kwDOOje-Bs8AAAACCiOQ6Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/lint",
          "name": "lint",
          "color": "a3b2aa",
          "default": false,
          "description": "Label for features that we would implement as lint rules, not core type checker features"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-08-21T03:20:26Z",
      "updated_at": "2025-10-06T16:51:48Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I wish ty can check for comparing coroutine in if statement. Given the following code:\n\n```python\nasync def check_foo() -> bool:\n    return True\n\nasync def main():\n    if check_foo():\n        print(\"hello\")\n```\n\nwe almost never want to compare a coroutine in if statement because it will always be true. What we want is actually:\n\n```python\nasync def main():\n    if await check_foo():\n        print(\"hello\")\n```\n\nI wonder if this should be a ty rule or ruff rule? I don't know if ruff knows the `check_foo` is a coroutine during the check. If it should be a ruff rule I will move this issue to the ruff repo.\n\nThanks.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1073/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1070",
      "id": 3339701894,
      "node_id": "I_kwDOOje-Bs7HD86G",
      "number": 1070,
      "title": "Does not know about pydantic_settings.BaseSettings from env vars",
      "user": {
        "login": "jankatins",
        "id": 890156,
        "node_id": "MDQ6VXNlcjg5MDE1Ng==",
        "avatar_url": "https://avatars.githubusercontent.com/u/890156?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jankatins",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 9,
      "created_at": "2025-08-20T22:24:29Z",
      "updated_at": "2025-12-23T09:20:26Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis is working python code:\n\n```\nimport os\n\nfrom pydantic_settings import BaseSettings\n\nos.environ[\"EXAMPLE_SETTING\"] = \"example_value\"\n\n\nclass Settings(BaseSettings):\n    EXAMPLE_SETTING: str\n\n\ns = Settings()\nprint(s.EXAMPLE_SETTING)\n```\n\nMypy has a plugin which makes it recognise that the arguments are filled from env vars. How would I accomplish something similar with ty?\n\n```shell\nλ  python test.py      \nexample_value\n\n# Without the pydantic.mypy plugin\nλ  mypy test.py        \ntest.py:12: error: Missing named argument \"EXAMPLE_SETTING\" for \"Settings\"  [call-arg]\nFound 1 error in 1 file (checked 1 source file)\n\n# With the pydantic.mypy plugin\nλ  mypy test.py\nSuccess: no issues found in 1 source file\n\n λ  uvx ty check test.py\nWARN ty is pre-release software and not ready for production use. Expect to encounter bugs, missing features, and fatal errors.\nChecking ------------------------------------------------------------ 1/1 files                                                                                                                                                                                                                                     error[missing-argument]: No argument provided for required parameter `EXAMPLE_SETTING`                                                                                                                                                                                                                              \n  --> test.py:12:5\n   |\n12 | s = Settings()\n   |     ^^^^^^^^^^\n13 | print(s.EXAMPLE_SETTING)\n   |\ninfo: rule `missing-argument` is enabled by default\n\nFound 1 diagnostic\n```\n\n### Version\n\nty 0.0.1-alpha.19",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1070/reactions",
        "total_count": 12,
        "+1": 12,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1064",
      "id": 3338416083,
      "node_id": "I_kwDOOje-Bs7G_C_T",
      "number": 1064,
      "title": "Allow JSON as the output format",
      "user": {
        "login": "Khoyo",
        "id": 1354688,
        "node_id": "MDQ6VXNlcjEzNTQ2ODg=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1354688?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Khoyo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-08-20T14:39:43Z",
      "updated_at": "2025-12-19T20:14:47Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The current allowed output formats of `ty check` are full and concise, which aren't great if you want to parse it (eg. in CI). Allowing the `json` and `json-lines` output formats that ruff already supports would make it easier.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1064/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1063",
      "id": 3338384217,
      "node_id": "I_kwDOOje-Bs7G-7NZ",
      "number": 1063,
      "title": "Add migration guides",
      "user": {
        "login": "ShravanSunder",
        "id": 5294949,
        "node_id": "MDQ6VXNlcjUyOTQ5NDk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/5294949?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ShravanSunder",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239594,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/documentation",
          "name": "documentation",
          "color": "0075ca",
          "default": true,
          "description": "Improvements or additions to documentation"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-08-20T14:31:00Z",
      "updated_at": "2025-12-23T04:37:26Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nIt would be great if we can have a document that compares the rules vs pyright.  It would make it easier to migrate to ty based on this doc, and understanding equivilent behaviour\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1063/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1062",
      "id": 3338308522,
      "node_id": "I_kwDOOje-Bs7G-ouq",
      "number": 1062,
      "title": "Is it possible to report conflicting-argument-forms at site of problematic function definition instead of at call site?",
      "user": {
        "login": "tlauli",
        "id": 38265141,
        "node_id": "MDQ6VXNlcjM4MjY1MTQx",
        "avatar_url": "https://avatars.githubusercontent.com/u/38265141?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tlauli",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        },
        "1": {
          "id": 8568539448,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmJOA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/suppression",
          "name": "suppression",
          "color": "705393",
          "default": false,
          "description": "Related to supression of violations e.g. ty:ignore"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-08-20T14:10:30Z",
      "updated_at": "2025-08-21T14:38:26Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nCurrently, if I have one conditionally defined function that is correct, but which triggers `conflicting-argument-forms` rule, it is necessary to add  ignore to every call of the function. Would it be possible to report the violation at the function definition, so that it is ignorable at a single location? Pyright does it, and in my opinion it also makes more sense, and it is significantly easier to ignore false positives.\n\n```\nfrom typing import reveal_type\nfrom ty_extensions import is_singleton\n\nif flag:\n    f = repr  # Expects a value\nelse:\n    f = is_singleton  # Expects a type form, only location where pyright reports an error\n\nf(int)  # ty error 1\nf(int)  # ty error 2\nf(int)  # ty error 3\n```\n\n### Version\n\n0.0.1-alpha.19 (e9cb838b3 2025-08-19)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1062/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1060",
      "id": 3338088028,
      "node_id": "I_kwDOOje-Bs7G9y5c",
      "number": 1060,
      "title": "Rules for not exhaustive `match` case statements",
      "user": {
        "login": "crispyricepc",
        "id": 16229426,
        "node_id": "MDQ6VXNlcjE2MjI5NDI2",
        "avatar_url": "https://avatars.githubusercontent.com/u/16229426?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/crispyricepc",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8760037609,
          "node_id": "LA_kwDOOje-Bs8AAAACCiOQ6Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/lint",
          "name": "lint",
          "color": "a3b2aa",
          "default": false,
          "description": "Label for features that we would implement as lint rules, not core type checker features"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-08-20T12:56:22Z",
      "updated_at": "2026-01-09T02:27:10Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIf a `match` statement is used with an enum type or some other type with a finite number of possible values, Ruff (or Ty, not sure which works better here) should warn about unused cases.\n\n## Invalid code\n\n```py\nfrom enum import Enum\n\nenum Animal(Enum):\n    CAT = 0\n    DOG = 1\n\nanimal = get_animal()\n\nmatch animal: # warning should appear here\n    case CAT:\n        print(\"is a cat\")\n```\n\n## Valid code\n\n```py\nfrom enum import Enum\n\nenum Animal(Enum):\n    CAT = 0\n    DOG = 1\n\nanimal = get_animal()\n\nmatch animal:\n    case CAT:\n        print(\"is a cat\")\n    case _:\n        pass\n```\n\nThis is inspired by a similar rule in pyright: `reportMatchNotExhaustive`",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1060/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1051",
      "id": 3334759183,
      "node_id": "I_kwDOOje-Bs7GxGMP",
      "number": 1051,
      "title": "Less error-prone way to examine both declarations and bindings",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-08-19T15:13:18Z",
      "updated_at": "2025-08-19T15:13:34Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We do this sort of thing a lot in ty's code base: iterating over both bindings and declarations separately, hoping that there is a 1:1 relationship. This is not always the case. For example:\r\n```py\r\nclass D: # maybe a protocol, maybe a dataclass with fields, …\r\n    if condition:\r\n        attr: int\r\n    else:\r\n        attr = \"\"\r\n```\r\n\r\nThis is unlikely to be a problem for protocols in particular, I think. And it's certainly not something specific to this PR. But I think it would be very beneficial in a lot of places if we could somehow iterate over all *definitions* and then get the declared type (for `attr: int`), the inferred type (for `attr = \"\"`), or both (for `attr: int = 0`).\r\n\r\nHere, it would eliminate the mutation of the entry. And the bug would probably not have happened in the first place if the iterator would yield either a `DeclaredType { ty }`, an `InferredType { ty }`, or `Both { declared_ty, inferred_ty }`. See https://github.com/astral-sh/ruff/pull/19756 for a somewhat related problem that I fixed a few weeks ago.\r\n\r\n_Originally posted by @sharkdp in https://github.com/astral-sh/ruff/pull/19950#discussion_r2284603002_\r\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1051/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1049",
      "id": 3334030714,
      "node_id": "I_kwDOOje-Bs7GuUV6",
      "number": 1049,
      "title": "Support the functional syntax for NamedTuples",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "1": {
          "id": 9739902910,
          "node_id": "LA_kwDOOje-Bs8AAAACRIsfvg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/namedtuples",
          "name": "namedtuples",
          "color": "83a09e",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-08-19T11:34:20Z",
      "updated_at": "2025-12-31T20:09:34Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Ty now supports most features of `NamedTuple`s defined via the class-based syntax (https://github.com/astral-sh/ty/issues/545). However, we do not yet have full support for namedtuples defined using the function-call syntax. I suggest that we hold off on this until work on https://github.com/astral-sh/ty/issues/742 is complete, as some refactoring that needs to be done for that issue will likely be helpful for this issue.\n\nWe should add suppport for these ways of defining a namedtuple:\n\n```py\nfrom collections import namedtuple\nfrom typing import NamedTuple\n\na = namedtuple(\"a\", \"a b c\")\nb = namedtuple(\"b\", \"a, b, c\")\nc = namedtuple(\"c\", [\"a\", \"b\", \"c\"])\nd = namedtuple(\"d\", (\"a\", \"b\", \"c\"))\n\ne = NamedTuple(\"e\", [(\"a\", int), (\"b\", str)])\nf = NamedTuple(\"f\", ((\"a\", int), (\"b\", str)))\n```\n\nThe first four should all be inferred as being `NamedTuple` classes that inherit from `tuple[Unknown, Unknown, Unknown]`; the last two should both be inferred as being `NamedTuple` classes that inherit from `tuple[int, str]`.\n\nThere are some additional rules and restrictions about the functional syntax that are described at the bottom of https://typing.python.org/en/latest/spec/namedtuples.html#defining-named-tuples and at https://docs.python.org/3/library/collections.html#collections.namedtuple",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1049/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1044",
      "id": 3331963385,
      "node_id": "I_kwDOOje-Bs7Gmbn5",
      "number": 1044,
      "title": "Support ``.ty.toml`` for configuration",
      "user": {
        "login": "AA-Turner",
        "id": 9087854,
        "node_id": "MDQ6VXNlcjkwODc4NTQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/9087854?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AA-Turner",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-08-18T20:09:09Z",
      "updated_at": "2025-09-19T16:01:30Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I initially created my configuration file as `.ty.toml`, to mirror `.ruff.toml` and group files next to each other in the directory. However, this [seems unsupported](https://docs.astral.sh/ty/configuration/).\n\nI've searched for other issues (rather hard with `.ty.toml` as a search pattern!) but couldn't find any requesting support, so I humbly beg thus in this issue.\n\nThanks,\nAdam",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1044/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1042",
      "id": 3330580165,
      "node_id": "I_kwDOOje-Bs7GhJ7F",
      "number": 1042,
      "title": "add partial stub support to \"list modules\" implementation",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-08-18T12:45:15Z",
      "updated_at": "2026-01-09T15:32:57Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961580,
        "node_id": "IT_kwDOBulz184BEhJs",
        "name": "Bug",
        "description": "An unexpected problem or behavior",
        "color": "red",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Once https://github.com/astral-sh/ruff/pull/19931 is merged, we should add similar logic to `list_modules` (which is itself still unmerged at time of writing in https://github.com/astral-sh/ruff/pull/19883).\n\nIdeally this would also update the module resolution flow diagram as well.\n\nCurrently this only impacts completions as completions are the only thing that uses `list_modules`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1042/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1037",
      "id": 3329609973,
      "node_id": "I_kwDOOje-Bs7GddD1",
      "number": 1037,
      "title": "Add setting to disable types in signature help",
      "user": {
        "login": "JaRoSchm",
        "id": 6123821,
        "node_id": "MDQ6VXNlcjYxMjM4MjE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6123821?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/JaRoSchm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        },
        "2": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-08-18T07:54:08Z",
      "updated_at": "2025-11-18T16:10:36Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Hi, for me the types displayed in the signature in the hover popup or the completion of function parameters are often not helpful. Even if the types would be formatted better (https://github.com/astral-sh/ty/issues/1000), they would still reduce the readability of the important signature without having a substantial advantage for me. Often, this is due to the typing language of python getting more and more complicated (see for example the screenshot below, what is `SupportsIndex` supposed to mean?). This problem is especially large in the scientific python ecosystem, where either the name of the parameter is enough to directly understand what is needed or so complicated that you have to read the documentation and understand the underlying algorithm where the type is simply not enough. Therefore, I would suggest to add an option to not show types there.\n\nHere are two exemplary screenshots:\n\n<img width=\"1512\" height=\"613\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/a5a2d8c1-37d4-444a-9919-b9a37813b43d\" />\n<img width=\"1893\" height=\"668\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/0384be6f-9ea1-472d-9cee-85f017c3c625\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1037/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1021",
      "id": 3327365274,
      "node_id": "I_kwDOOje-Bs7GU5Ca",
      "number": 1021,
      "title": "Show each overload only once in completion suggestions",
      "user": {
        "login": "JaRoSchm",
        "id": 6123821,
        "node_id": "MDQ6VXNlcjYxMjM4MjE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6123821?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/JaRoSchm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "2": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "BurntSushi",
          "id": 456674,
          "node_id": "MDQ6VXNlcjQ1NjY3NA==",
          "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/BurntSushi",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-08-16T15:17:26Z",
      "updated_at": "2026-01-09T15:24:21Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHi, when using completion for selecting parameters of a function each parameter is shown multiple times if the function has multiple overloads. In principle I understand the reason as different completion items correspond to different overloads and therefore effectively different functions. From a practical point of view however, the information in the completion menu is redundant and I would have to skip multiple suggesting for the same parameter to get to the next possible parameter. Therefore, I'd find it more practical to see each possible parameter only once.\n\nHere is an example for `numpy.linspace`:\n\n<img width=\"1499\" height=\"304\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/33fcf531-e600-41aa-96e6-4fdf0709a279\" />\n<img width=\"1499\" height=\"304\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/13c1f109-7347-4e85-9dde-d48badd556fd\" /> \n\n### Version\n\nty 0.0.1-alpha.18",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1021/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1018",
      "id": 3326850333,
      "node_id": "I_kwDOOje-Bs7GS7Ud",
      "number": 1018,
      "title": "dedicated support for Django",
      "user": {
        "login": "aaschenbrener",
        "id": 107055297,
        "node_id": "U_kgDOBmGIwQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/107055297?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/aaschenbrener",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 7,
      "created_at": "2025-08-16T04:16:20Z",
      "updated_at": "2026-01-08T18:19:26Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis is an expansion on the known issue:  No implicit import of submodules (https://github.com/astral-sh/ty/issues/133). I've imported Django models explicitly from their submodules. There is an issue with dynamic model attributes like objects and id that Ty doesn’t recognize.\n\nI’m encountering persistent unresolved-attribute errors when running Ty static type checker on Django models, specifically on standard Django model attributes such as id, demo_name, and objects. These errors occur even though the Django model is properly defined, registered, explicitly imported and confirmed to have those attributes in the Django shell.\n\nSteps to reproduce:\n\nDefine a Django model with fields such as id, demo_name in apps/sample/models/example.py.\n\nConfirm the model loads and works correctly inside the Django shell:\n\n```py\nfrom apps.sample.models.example import Demo\nfrom django.db import models\n\nissubclass(Demo, models.Model)  # Returns True\nDemo._meta.get_fields()  # Returns expected model fields including 'id'\nDemo.objects.all()  # Executes without error\n```\n\nRun Ty on a test file that uses this model, e.g. test_ty_model.py:\n\n```py\ndef test_model_fields(m: Demo):\n    reveal_type(m.id)\n    reveal_type(m.demo_name)\n    reveal_type(m.save)\n```\n\nTy reports errors like:\n\n```\nerror[unresolved-attribute]: Type `Demo` has no attribute `id`\nerror[unresolved-attribute]: Type `Demo` has no attribute `objects`\n```\n\nI have tried running Ty with explicit environment variables to load Django settings, but the errors persist:\n\n```\nPYTHONPATH=. DJANGO_SETTINGS_MODULE=proj.settings.dev ty check test_ty_model.py\n```\n\nExpected behavior:\nTy should recognize standard Django model attributes (id, objects, model fields) and when the Django environment is correctly configured.\n\nActual behavior:\nTy reports unresolved-attribute errors for these standard model attributes, even though Django shell confirms their existence.\n\nEnvironment:\n\nTy version: 0.0.1-alpha.18 (d697cc092 2025-08-14)\nPython version: 3.13.6\nDjango version: 5.2.5\nOS: macOS 15.6 24G84\n\n\nProject structure:\n\n```\nproject-root/\n├── manage.py\n├── test_ty_model.py             \n├── apps/\n│   ├── sample/\n│   │   ├── models/\n│   │   │   └── example.py\n├── proj/\n│   ├── settings/\n│   │   └── base.py\n│   │   └──  dev.py\n```\n\n### Version\n\n0.0.1-alpha.18 (d697cc092 2025-08-14)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1018/reactions",
        "total_count": 20,
        "+1": 20,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1017",
      "id": 3326496726,
      "node_id": "I_kwDOOje-Bs7GRk_W",
      "number": 1017,
      "title": "error if a legacy typevar with explicit variance is used in a way that contradicts its explicit variance",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-08-15T22:19:30Z",
      "updated_at": "2025-10-06T16:39:04Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Example:\n\n```py\nfrom typing import TypeVar\n\nT = TypeVar(\"T\", covariant=True)\n\nclass C[T]:\n    def method(self, x: T):  # this usage requires C to be at least contravariant in T\n        pass",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1017/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1016",
      "id": 3326426310,
      "node_id": "I_kwDOOje-Bs7GRTzG",
      "number": 1016,
      "title": "make it an error to explicitly call `__init__` on an existing object",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-08-15T21:36:13Z",
      "updated_at": "2025-10-06T16:39:17Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is unsafe because Liskov is not enforced on `__init__` methods. It also makes the exclusion of `__init__` from variance-inference unsafe.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1016/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1005",
      "id": 3325368012,
      "node_id": "I_kwDOOje-Bs7GNRbM",
      "number": 1005,
      "title": "goto-declaration on a real definition doesn't work",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-08-15T13:59:48Z",
      "updated_at": "2025-11-23T16:14:18Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Similar to #1004 but the reverse (and I think actually a bit harder to solve).\n\nIn theory, if you goto-declaration on a definition in a .py, it would be desirable for us to jump to the definition in the .pyi, allowing you to freely jump between the \"real\" implementation and the type info.\n\nI *think* this would require us to implement, essentially, \"stub unmapping\" with a third [ResolveMode](https://github.com/astral-sh/ruff/blob/bd4506aac56228af83d8ad76569530b3b32be473/crates/ty_python_semantic/src/module_resolver/resolver.rs#L49): StubsOnly. A mode that would literally ignore the .py you're current in.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1005/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/1003",
      "id": 3325337641,
      "node_id": "I_kwDOOje-Bs7GNKAp",
      "number": 1003,
      "title": "Decide on \"enabled-by-default\" inlays",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 10,
      "created_at": "2025-08-15T13:46:51Z",
      "updated_at": "2025-12-31T22:14:31Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961576,
        "node_id": "IT_kwDOBulz184BEhJo",
        "name": "Task",
        "description": "A specific piece of work",
        "color": "yellow",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Decide which inlays should be enabled by default.\n\nhttps://github.com/astral-sh/ruff/pull/19910#discussion_r2275980197",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/1003/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/995",
      "id": 3324345083,
      "node_id": "I_kwDOOje-Bs7GJXr7",
      "number": 995,
      "title": "multi-line unknown-argument suppression",
      "user": {
        "login": "CharlesPerrotMinot",
        "id": 112571330,
        "node_id": "U_kgDOBrWzwg",
        "avatar_url": "https://avatars.githubusercontent.com/u/112571330?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/CharlesPerrotMinot",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568539448,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmJOA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/suppression",
          "name": "suppression",
          "color": "705393",
          "default": false,
          "description": "Related to supression of violations e.g. ty:ignore"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-08-15T04:55:44Z",
      "updated_at": "2025-08-18T17:13:49Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHi,\n\nAccording to the docs, we should be able to do multiline suppressions:\nhttps://docs.astral.sh/ty/suppression/#ty-suppression-comments\n\nBut this doesn't seem to work with unknown-argument.\nThis still errors out:\n```\nMyBuilder(\n    name=\"123\",\n    translation=\"Some translation\",\n)  # ty: ignore[unknown-argument]\n```\n\nSame as:\n```\nMyBuilder(  # ty: ignore[unknown-argument]\n    name=\"123\",\n    translation=\"Some translation\",\n)\n```\n\nOnly this works:\n```\nMyBuilder(\n    name=\"123\",  # ty: ignore[unknown-argument]\n    translation=\"Some translation\",  # ty: ignore[unknown-argument]\n)\n```\n\nFor more context: https://github.com/astral-sh/ty/issues/988#issuecomment-3189107887\n\n### Version\n\n0.0.1-alpha.18",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/995/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/992",
      "id": 3323154726,
      "node_id": "I_kwDOOje-Bs7GE1Em",
      "number": 992,
      "title": "LSP Panic: access to field whilst the value is being initialized",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 11,
      "created_at": "2025-08-14T18:14:13Z",
      "updated_at": "2025-12-31T16:36:56Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```\nLSP[ty] ty encountered a problem. Check the logs for more details.\nlsp_signatur handler RPC[Error] code_name = InternalError, message = \"request handler panicked at /Users/runner/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/d66\nfe33/src/tracked_struct.rs:912:21:\\\naccess to field whilst the value is being initialized\\\nrun with `RUST_BACKTRACE=1` environment variable to display a backtrace\\\n\"\n```\n\nThis is a bug in Salsa\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/992/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/988",
      "id": 3322681821,
      "node_id": "I_kwDOOje-Bs7GDBnd",
      "number": 988,
      "title": "Recognize methods dynamically overwritten by metaclass",
      "user": {
        "login": "CharlesPerrotMinot",
        "id": 112571330,
        "node_id": "U_kgDOBrWzwg",
        "avatar_url": "https://avatars.githubusercontent.com/u/112571330?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/CharlesPerrotMinot",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239603,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPsw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/feature",
          "name": "feature",
          "color": "a2eeef",
          "default": false,
          "description": "New feature or request"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-08-14T15:42:01Z",
      "updated_at": "2025-11-18T16:10:35Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWe have a generic class, where we use a metaclass and overwrite the `__init__` function, to accept any argument (and generate random data), that we use to be a random generator of models ; we use it in our tests to have randomly generated inputs for pydantic models.\n\nI simplified the code for readability, but the following code triggers the error:\n\n```py\nfrom typing import Any, Callable\n\n\ndef define_builder_init(class_dict: dict[str, Any]) -> Callable[..., Any]:\n    def func(self: Any, **kwargs: dict[str, Any]) -> None: ...\n    return func\n\nclass BuilderMeta(type):\n    def __new__(\n        cls: type[Any],\n        name: str,\n        bases: tuple[type, ...],\n        dct: dict[str, Any],\n    ) -> \"BuilderMeta\":\n        dct[\"__init__\"] = define_builder_init(dct, )\n        return super().__new__(cls, name, bases, dct)\n\nclass Builder(metaclass=BuilderMeta): ...\n\nclass ConfigValueBuilder(Builder):\n    name: str\n\nConfigValueBuilder(name=\"123\")\n```\n\nThe error we're getting is\n```\nerror[unknown-argument]: Argument `name` does not match any known parameter of bound method `__init__`\n  --> test.py:27:27\n   |\n27 | test = ConfigValueBuilder(name=\"123\")\n   |                           ^^^^^^^^^^\n   |\ninfo: rule `unknown-argument` is enabled by default\n```\n\nWorks without issues with mypy 1.17.1, with this config:\n```\nallow_subclassing_any=true\nallow_untyped_decorators=true\nignore_missing_imports = true\nno_warn_return_any=true\nstrict=true\n```\n\n### Version\n\n0.0.1-alpha.18",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/988/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/985",
      "id": 3321826803,
      "node_id": "I_kwDOOje-Bs7F_w3z",
      "number": 985,
      "title": "Consider unifying the `types` and `tuple_inner` field in `Specialization`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "2": {
          "id": 8653735457,
          "node_id": "LA_kwDOOje-Bs8AAAACA82GIQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/memory",
          "name": "memory",
          "color": "e99695",
          "default": false,
          "description": "related to memory usage"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-08-14T11:11:32Z",
      "updated_at": "2025-08-14T13:10:24Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently the `Specialization` struct in `tuple.rs` looks like this:\n\n```rs\n#[salsa::interned(debug, heap_size=ruff_memory_usage::heap_size)]\npub struct Specialization<'db> {\n    pub(crate) generic_context: GenericContext<'db>,\n    #[returns(deref)]\n    pub(crate) types: Box<[Type<'db>]>,\n\n    /// For specializations of `tuple`, we also store more detailed information about the tuple's\n    /// elements, above what the class's (single) typevar can represent.\n    tuple_inner: Option<TupleType<'db>>,\n}\n```\n\nConceptually, however:\n- A class either is a tuple or it isn't!\n- If a class is _not_ a tuple, `tuple_inner` will always be `None`\n- If a class _is_ a tuple, `tuple_inner` should always be `Some()`, `types` should always be length 1, and the single `Type` in the `types` boxed slice should be the union of all the elements of the tuple in `tuple_inner`\n\nIt feels like we have some redundancy here, therefore; a design that uses less memory (and which might be more elegant) might look like this:\n\n```rs\n#[derive(Debug, Clone, PartialEq, Eq, Hash, getsize_2::GetSize)]\nenum SpecializationInner<'db> {\n    Tuple(TupleType<'db>),\n    NonTuple(Box<[Type<'db>]>),\n}\n\n#[salsa::interned(debug, heap_size=ruff_memory_usage::heap_size)]\npub struct Specialization<'db> {\n    pub(crate) generic_context: GenericContext<'db>,\n    #[returns(ref)]\n    inner: SpecializationInner<'db>\n}\n\nimpl<'db> SpecializationInner<'db> {\n    pub(crate) fn types(self, &'db dyn Db) -> &[Type<'db>] {\n        #[salsa::tracked(returns(ref))]\n        fn homogeneous_element_type<'db>(db: &'db dyn Db, tuple: TupleType<'db>) -> Type<'db> {\n            tuple.tuple(db).homogeneous_element_type(db)\n        }\n\n        match self.inner(db) {\n            SpecializationInner::Tuple(tuple) => std::slice::from_ref(homogeneous_element_type(*tuple)),\n            SpecializationInner::NonTuple(types) => types,\n        }\n    }\n}\n```\n\nI've briefly tried to make this change but... I don't think I'm the right person to do this refactor; I just don't understand our generics internals well enough right now :-)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/985/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/977",
      "id": 3318746005,
      "node_id": "I_kwDOOje-Bs7F0AuV",
      "number": 977,
      "title": "Complete parentheses for function calls when selecting a function completion",
      "user": {
        "login": "tamimbook",
        "id": 168496705,
        "node_id": "U_kgDOCgsOQQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/168496705?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tamimbook",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "2": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "BurntSushi",
          "id": 456674,
          "node_id": "MDQ6VXNlcjQ1NjY3NA==",
          "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/BurntSushi",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 7,
      "created_at": "2025-08-13T14:41:20Z",
      "updated_at": "2026-01-09T15:24:05Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nwhy there's isn't ay feature where `ty` auto-completes the function but to be able to auto add brackets? we need similar feature on how jetbrains pycharm auto adds brackets from auto completion via intellisence\n\n### Version\nnewest version",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/977/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/972",
      "id": 3313338059,
      "node_id": "I_kwDOOje-Bs7FfYbL",
      "number": 972,
      "title": "Support for dataclass_transform converters",
      "user": {
        "login": "AdrianSosic",
        "id": 23265127,
        "node_id": "MDQ6VXNlcjIzMjY1MTI3",
        "avatar_url": "https://avatars.githubusercontent.com/u/23265127?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AdrianSosic",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239603,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPsw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/feature",
          "name": "feature",
          "color": "a2eeef",
          "default": false,
          "description": "New feature or request"
        },
        "1": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-08-12T09:20:09Z",
      "updated_at": "2026-01-08T18:31:06Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe following code throws a false-positive:\n\n```python\nfrom attrs import define, field\n\n\n@define\nclass C:\n    x: float = field(converter=float)\n\n\nC(\"1\")\n```\n\n```bash\nerror[invalid-argument-type]: Argument is incorrect\n --> baybe/ty.py:9:3\n  |\n9 | C(\"1\")\n  |   ^^^ Expected `int | float`, found `Literal[\"1\"]`\n  |\ninfo: rule `invalid-argument-type` is enabled by default\n```\n\nThe issue is that attrs converters don't seem to be supported yet, which are handled via the attrs plugin in mypy. I'm aware that there is already a PR to enable dataclass support (#111) but since converters are not available via dataclasses, I think this is probably a separate issue.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/972/reactions",
        "total_count": 8,
        "+1": 8,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/959",
      "id": 3305318099,
      "node_id": "I_kwDOOje-Bs7FAybT",
      "number": 959,
      "title": "consider splitting Rust types for \"Place with metadata from place table\" vs \"Place key from AST node\"",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-08-08T22:05:13Z",
      "updated_at": "2025-08-08T22:06:40Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Today in type inference we sometimes construct a Place from an AST node, to use as a key for lookup in the place table. It's confusing and a potential footgun that this uses the same Rust type as a Place queried from the actual Place table, because querying the metadata (flags) on the former will just give you a meaningless/misleading \"no\" answer. It would be better to use separate Rust types for these, so that if we have a Rust type with place metadata, we know that metadata is actually accurate from the place table, not just misleadingly empty.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/959/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/953",
      "id": 3300647335,
      "node_id": "I_kwDOOje-Bs7Eu-Gn",
      "number": 953,
      "title": "Add support for `workspace/didChangeConfiguration` notification",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-08-07T14:00:11Z",
      "updated_at": "2025-11-18T16:10:35Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This is a follow-up task from https://github.com/astral-sh/ty/issues/82 which is to add support for handling `workspace/didChangeConfiguration` notification.\n\nWhen the server receives the `workspace/didChangeConfiguration` notification, the server should refresh the settings from all the managed workspaces, ignoring any values in the notification payload.\n\nThis would allow users to dynamically update the client settings without the need to restart the server.\n\nOnce this is implemented, we should also remove [these settings](https://github.com/astral-sh/ty-vscode/blob/38d25d5d2c561ecd910858ca23081cd97d503e6c/src/common/settings.ts#L118-L122) which is used to restart the server when the value change in ty VS Code extension.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/953/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/952",
      "id": 3300633433,
      "node_id": "I_kwDOOje-Bs7Eu6tZ",
      "number": 952,
      "title": "Auto-generate editor settings reference",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239594,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/documentation",
          "name": "documentation",
          "color": "0075ca",
          "default": true,
          "description": "Improvements or additions to documentation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-08-07T13:56:58Z",
      "updated_at": "2025-08-08T06:58:41Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently, the editor settings reference are being manually added and updated: https://docs.astral.sh/ty/reference/editor-settings/\n\nThe task here is to update it such that it gets auto-generated similar to the command-line options in ty and Ruff.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/952/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/947",
      "id": 3297347650,
      "node_id": "I_kwDOOje-Bs7EiYhC",
      "number": 947,
      "title": "Incorrect types inferred when a \"mixed tuple\" is unpacked",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 3,
      "created_at": "2025-08-06T16:36:33Z",
      "updated_at": "2025-08-22T13:11:21Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nConsider:\n\n```py\nclass I0: ...\nclass I1: ...\nclass I2: ...\n\ndef f(x: tuple[I0, *tuple[I1, ...], I2]):\n    [a, b, *c] = x\n    reveal_type(a)  # I0\n    reveal_type(b)  # I1\n    reveal_type(c)  # list[I1 | I2]\n```\n\nThe types we infer for `a` and `c` seem correct here. But the type for `b` seems incorrect. There are three possible scenarios in which this assignment could succeed; I think we need to consider them all and union the types together:\n1. The middle element \"materialises\" to a 0-length tuple. In this scenario at runtime, `a` would be of type `I0`, `b` would be of type `I2` and `c` would be of type `list[Never]`\n2. The middle element \"materialises\" to a tuple of length 1. In this scenario at runtime, `a` would be of type `I0`, `b` would be of type `I1` and `c` would be of type `list[I2]`\n3. The middle element \"materialises\" to a tuple of length >=2. In this scenario at runtime, `a` would be of type `I0`, `b` would be of type `I1` and `c` would be of type `list[I1 | I2]`\n\nGiven these three scenarios in which the assignment could succeed, I think we should be inferring `I1 | I2` for `b` rather than `I1`.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/947/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/940",
      "id": 3293372275,
      "node_id": "I_kwDOOje-Bs7ETN9z",
      "number": 940,
      "title": "improve diagnostics for possibly-unbound call-dunder with union",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-08-05T14:35:44Z",
      "updated_at": "2026-01-09T13:53:39Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When we have an implicit dunder call with a union type, where some types in the union implement the dunder and others do not, we currently report an error that the dunder methods are possibly unbound: https://play.ty.dev/e412c8da-cc72-47b5-af98-9db45800ff73\n\n```py\nclass Context:\n    def __enter__(self): ...\n    def __exit__(self, *args): ...\n\nclass NotContext:\n    pass\n\ndef _(x: Context | NotContext):\n    # error: [invalid-context-manager] \"Object of type `Context | NotContext` cannot be used with `with` because the methods `__enter__` and `__exit__` are possibly unbound\"\n    with x:\n        pass\n```\n\nThis is not very useful in identifying which element of the union type is the problem. It would be better if we would instead surface the underlying error directly (that `NotContext` does not implement `__enter__` or `__exit__`), and add a note that `NotContext` appears in the union type `Context | NotContext`.\n\nThis issue applies at least to sync and async context managers; I think it likely applies to some other implicit dunder calls as well.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/940/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/938",
      "id": 3293062948,
      "node_id": "I_kwDOOje-Bs7ESCck",
      "number": 938,
      "title": "Support of Literal in autocomplete",
      "user": {
        "login": "AKuederle",
        "id": 10776763,
        "node_id": "MDQ6VXNlcjEwNzc2NzYz",
        "avatar_url": "https://avatars.githubusercontent.com/u/10776763?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AKuederle",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-08-05T13:10:06Z",
      "updated_at": "2026-01-03T18:34:19Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It would be great, if the code suggestions could cover `Literal` and suggest only possible values for e.g. function arguments.\n\nIt would be even better, if it would be possible to support something like `Literal[\"option1\", \"option2\"] | str` to allow for autocomplete of the `Literal` options without widening the type to `str`.\nI often use annotations like this to indicate that the sensible values are `\"option1\", \"option2\"`, but that the function theoretically supports any str.\n\nAt the moment ty \"correctly\" widens the type option to just `str`, as the literal values are subtypes of `str`. However, with that we loose autocomplete for the other options.\n\nThere is \"prior art\" on this hack in typescript: https://medium.com/@florian.schindler_47749/typescript-hacks-1-string-suggestions-58806363afeb\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/938/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/931",
      "id": 3287258555,
      "node_id": "I_kwDOOje-Bs7D75W7",
      "number": 931,
      "title": "Type checker fails to recognize a module as a valid implementation of a Protocol",
      "user": {
        "login": "wvlab",
        "id": 89403101,
        "node_id": "MDQ6VXNlcjg5NDAzMTAx",
        "avatar_url": "https://avatars.githubusercontent.com/u/89403101?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/wvlab",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-08-03T15:07:49Z",
      "updated_at": "2025-08-15T15:30:09Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe `ty` type checker appears to incorrectly flag a type error when a module is used to satisfy a `typing.Protocol`. According to Python's official typing documentation, [modules can serve as implementations for protocols](https://typing.python.org/en/latest/spec/protocol.html#modules-as-implementations-of-protocols), a feature that is correctly handled by other type checkers like Mypy and Pyright.\n\nWhen running mypy, pyright or pyrefly on the project, type checkers pass without any errors, correctly identifying that the `bar` module is a valid implementation of the `Proto` protocol.\n\n### Code to Reproduce\n\nHere is a minimal set of code that demonstrates the issue.\n\n1.  The Protocol Definition (`behavior.py`):\n    A simple protocol that requires a `foo` function.\n\n    ```python\n    from typing import Protocol\n\n    class Proto(Protocol):\n        def foo(self, x: int) -> str: ...\n    ```\n\n2.  The Module Implementation (`bar.py`):\n    A module with a function that structurally conforms to the protocol.\n\n    ```python\n    def foo(x: int) -> str:\n        return f\"6{x}9\"\n    ```\n\n3.  The Type Check (`main.py`):\n    The `bar` module is assigned to a variable annotated with the `Proto` type.\n\n    ```python\n    import behavior\n    import bar\n\n    behavior.consume(bar)\n    _: behavior.Proto = bar\n    ```\n\n\n### Full Reproducible Example\n\nYou can reproduce it in [playground](https://play.ty.dev/4dfa5c69-831d-41ee-a1e2-22e079b75fc5)\n\nI have also uploaded the complete, self-contained project to a public GitHub repository. You can clone it and run the type checkers to see the issue firsthand: [wvlab/example-python-module-protocols](https://github.com/wvlab/example-python-module-protocols)\n\nTo reproduce:\n```bash\ngit clone https://github.com/wvlab/example-python-module-protocols.git mre && cd mre\nuv sync --frozen\nsource .venv/bin/activate\n./run_type_checkers.sh\n```\n\n### `ty` Output\n\n```\n> ty check\nerror[invalid-argument-type]: Argument to function `consume` is incorrect\n  --> src/example_module_protocols/main.py:9:28\n   |\n 8 | def main() -> None:\n 9 |     print(behavior.consume(bar))\n   |                            ^^^ Expected `Proto`, found `<module 'example_module_protocols.implementations.bar'>`\n10 |     _: behavior.Proto = bar\n11 |     return\n   |\ninfo: Function defined here\n  --> src/example_module_protocols/behavior.py:9:5\n   |\n 7 |     def foo(self, x: int) -> str: ...\n 8 |\n 9 | def consume(proto: Proto) -> str:\n   |     ^^^^^^^ ------------ Parameter declared here\n10 |     return proto.foo(5)\n   |\ninfo: rule `invalid-argument-type` is enabled by default\n\nerror[invalid-assignment]: Object of type `<module 'example_module_protocols.implementations.bar'>` is not assignable to `Proto`\n  --> src/example_module_protocols/main.py:10:5\n   |\n 8 | def main() -> None:\n 9 |     print(behavior.consume(bar))\n10 |     _: behavior.Proto = bar\n   |     ^\n11 |     return\n   |\ninfo: rule `invalid-assignment` is enabled by default\n```\n\n\n### Version\n\nty 0.0.1-alpha.16 (e48b66fd7 2025-07-31)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/931/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/927",
      "id": 3284494036,
      "node_id": "I_kwDOOje-Bs7DxWbU",
      "number": 927,
      "title": "nonlocal snapshot sweeping considers unrelated scopes, sweeps too much",
      "user": {
        "login": "oconnor663",
        "id": 860932,
        "node_id": "MDQ6VXNlcjg2MDkzMg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/860932?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/oconnor663",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-08-01T16:32:39Z",
      "updated_at": "2026-01-10T18:01:40Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "As of https://github.com/astral-sh/ruff/pull/19321 we use \"lazy snapshots\" to track when a variable in an enclosing scope is never re-bound, which lets us infer a narrower type in nested functions. For example (working as intended):\n\n```py\ndef foo():\n    x: int = 1\n    def bar():\n        reveal_type(x)  # `Literal[1]`\n\ndef foo():\n    x: int = 1\n    def bar():\n        reveal_type(x)  # `int` (un-narrowed because of reassignment)\n    x = 2\n```\n\nSimilarly, we sweep/ignore enclosing snapshots of a variable [if any nested function declares that variable `nonlocal` and binds it](https://github.com/astral-sh/ruff/blob/48d5bd13faf0def62afca7477dc2ec86b2f2ad69/crates/ty_python_semantic/src/semantic_index/builder.rs#L414-L440) (also working as intended):\n\n```py\ndef foo():\n    x: int = 1\n    def bar():\n        reveal_type(x)  # `int` (un-narrowed because of nonlocal assignment)\n    def baz():\n        nonlocal x\n        x = 2\n```\n\nHowever, that sweeping is currently more aggressive than it needs to be. It finds `nonlocal`+bound symbols of the same name, even in unrelated later (not earlier) scopes:\n\n```py\ndef foo():\n    x: int = 1\n    def bar():\n        reveal_type(x)  # `int` (should be narrowed)\n\ndef bing():\n    x = 2\n    def baz():\n        nonlocal x\n        x = 3\n```\n\nSimilarly, it finds symbols in nested scopes that potentially could be aliasing but actually aren't because of shadowing:\n\n```py\ndef foo():\n    x: int = 1\n    def bar():\n        reveal_type(x)  # `int` (should be narrowed)\n    def bing():\n        x = 2\n        def baz():\n            nonlocal x\n            x = 3\n```\n\nI'm currently working on adding a couple maps to symbol tables that will track \"reference -> definition in enclosing scope\" and \"definition -> references in nested scopes\", and it might be easier to fix this once that change lands. I'll link it here when I put up a PR. cc @mtshiba",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/927/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/921",
      "id": 3281391159,
      "node_id": "I_kwDOOje-Bs7Dlg43",
      "number": 921,
      "title": "No call signature checking for implicit calls to `__eq__` or `__ne__` methods",
      "user": {
        "login": "MatthewMckee4",
        "id": 119673440,
        "node_id": "U_kgDOByISYA",
        "avatar_url": "https://avatars.githubusercontent.com/u/119673440?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MatthewMckee4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-07-31T18:28:55Z",
      "updated_at": "2026-01-09T19:22:10Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently, we don't emit any diagnostics here.\n\nI believe these should be unsupported operator errors, that we don't emit\n\n```py\nclass A:\n    __eq__ = None\n\n\nreveal_type(A() == A()) # revealed: bool\n\n\nclass B:\n    def __eq__(self, other: int) -> bool:\n        return True\n\n\nreveal_type(B() == \"a\") # revealed: bool\n```\n\nhttps://github.com/astral-sh/ruff/pull/19666 mentions some of these issues.\n\nI believe the main issue is from https://github.com/astral-sh/ruff/blob/a3f28baab4fc085e1448484be23df7036d13191d/crates/ty_python_semantic/src/types/infer.rs#L8070-L8074",
      "closed_by": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/921/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/916",
      "id": 3277687614,
      "node_id": "I_kwDOOje-Bs7DXYs-",
      "number": 916,
      "title": "Incorrect narrowing of class/global variables in nested scopes",
      "user": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-07-30T16:16:16Z",
      "updated_at": "2025-07-30T17:18:40Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIn the following code, `g` in the class scope `D` should be inferred as `str | None`, but is instead inferred as `str`.\n\n```python\ng: str | None = None\n\ndef f(flag: bool):\n    class C:\n        if flag:\n            g = 1\n\n        if g is not None:  # this `g` may refer to a class variable, or a global variable\n            class D:\n                # refers to the global `g`\n                reveal_type(g)  # should be: str | None\n```\n\nHere, it appears that we have mistakenly applied the narrowing constraint `g is not None` to the global variable `g`.\nHowever, simply checking the symbol table and not recording an eager snapshot if the class variable `C.g` is bound is not sufficient. In the following example, we can safely narrow the global `g` because we can assume that `C.g` is undefined in class `D`.\n\n```python\ng: str | None = None\n\ndef f(flag: bool):\n    class C:\n        if flag:\n            g = None\n\n        if g is not None:  # if this evaluates to `True`, `g` must refer to a global variable\n            class D:\n                reveal_type(g)  # revealed: str\n```\n\nThis is already checked in [`mdtest/narrow/conditionals/nested.md`](https://github.com/astral-sh/ruff/blob/38049aae12896a0ca79ce3045b54ee1efd8103b7/crates/ty_python_semantic/resources/mdtest/narrow/conditionals/nested.md?plain=1#L420).\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/916/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/914",
      "id": 3275404535,
      "node_id": "I_kwDOOje-Bs7DOrT3",
      "number": 914,
      "title": "Can I use environment variables in `extra-paths` in `pyproject.toml`?",
      "user": {
        "login": "Social-Mean",
        "id": 84260049,
        "node_id": "MDQ6VXNlcjg0MjYwMDQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/84260049?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Social-Mean",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-07-30T01:28:51Z",
      "updated_at": "2025-11-18T16:10:34Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\n`extra-paths` in `pyproject.toml` are user-provided paths that should take first priority in the module resolution. However, the examples in the documentation are specific to the paths on a particular computer:\n\n```toml\n[tool.ty.environment]\nextra-paths = [\"~/shared/my-search-path\"]\n```\n\nIs it possible to use environment variables in the `extra-paths` list, such as `$My_Extra_Path/path/to/extra-search-path`, to achieve the same effect across different computers using the same `pyproject.toml` configuration file?\n\n```toml\n[tool.ty.environment]\nextra-paths = [\"$My_Extra_Path/path/to/extra-search-path\"]\n```\n\n### Version\n\nty 0.0.1-alpha.16 (c452e53a0 2025-07-25)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/914/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/903",
      "id": 3267131057,
      "node_id": "I_kwDOOje-Bs7CvHax",
      "number": 903,
      "title": "Support `type[SomeProtocol]`",
      "user": {
        "login": "tpgillam",
        "id": 7052222,
        "node_id": "MDQ6VXNlcjcwNTIyMjI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7052222?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tpgillam",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        },
        "1": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-07-27T13:55:46Z",
      "updated_at": "2025-10-17T09:51:08Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nWith ty 0.0.1-alpha16, consider the following:\n\n```python\nfrom __future__ import annotations\n\nimport dataclasses\nimport typing\n\nif typing.TYPE_CHECKING:\n    import _typeshed\n\n\ndef moo1(cls: _typeshed.DataclassInstance) -> None:\n    print(cls)\n\n\ndef moo2(cls: type[_typeshed.DataclassInstance]) -> None:\n    print(cls)\n\n\ndef moo3[T: _typeshed.DataclassInstance](cls: type[T]) -> None:\n    print(cls)\n\n\n@dataclasses.dataclass\nclass A:\n    a: int\n\n\nmoo1(A(1))  # ty happy\nmoo2(A)     # ty unhappy\nmoo3(A)     # ty happy\n```\n\nThen `uvx ty check` will give the following output:\n\n```\nerror[invalid-argument-type]: Argument to function `moo2` is incorrect\n  --> moo2.py:28:6\n   |\n27 | moo1(A(1))\n28 | moo2(A)\n   |      ^ Expected `type[DataclassInstance]`, found `<class 'A'>`\n29 | moo3(A)\n   |\ninfo: Function defined here\n  --> moo2.py:14:5\n   |\n14 | def moo2(cls: type[_typeshed.DataclassInstance]) -> None:\n   |     ^^^^ -------------------------------------- Parameter declared here\n15 |     print(cls)\n   |\ninfo: rule `invalid-argument-type` is enabled by default\n\nFound 1 diagnostic\n```\n\nIs this expected / correct behaviour? pyright will accept all the calls. \n\nSince `DataclassInstance` is a protocol it seems plausible that `type[DataclassInstance]` might be poorly defined (I don't know the ins-and-outs of the typing spec) ... but if that _were_ the case then I'm mildly surprised that ty doesn't complain about:\n\n```python\nfrom collections.abc import Sequence\n\ndef moo4(a: type[Sequence]) -> None:\n    print(a)\n\nmoo4(list)\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/903/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/887",
      "id": 3262239132,
      "node_id": "I_kwDOOje-Bs7CcdGc",
      "number": 887,
      "title": "Advanced pattern matching support",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        },
        "1": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-07-25T07:11:57Z",
      "updated_at": "2025-12-18T08:43:24Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We already have basic support for control flow analysis and type narrowing in `match` statements, but our support is not complete. The list below shows some examples of things that are not working yet, but is probably not exhaustive:\n\n* [ ] Type inference for names that are bound in patterns:\n  ```py\n  from dataclasses import dataclass\n  \n  @dataclass\n  class Person:\n      name: str\n      age: int\n  \n  def f(person: Person):\n      match person:\n          case Person(name, age):\n              reveal_type(name)  # @Todo(`match` pattern definition types)\n              reveal_type(age)  # @Todo(`match` pattern definition types)\n  \n  def g(xs: list[int]):\n      match xs:\n          case [1, 2, x]:\n              reveal_type(x)  # @Todo(`match` pattern definition types)\n  ```\n\n* [ ] Support for `__match_args__`\n* [ ] [Matching on builtin classes](https://docs.python.org/3/reference/compound_stmts.html#class-patterns)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/887/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/886",
      "id": 3261714165,
      "node_id": "I_kwDOOje-Bs7Cac71",
      "number": 886,
      "title": "\"Find references\" doesn't find overloads",
      "user": {
        "login": "UnboundVariable",
        "id": 218687519,
        "node_id": "U_kgDODQjoHw",
        "avatar_url": "https://avatars.githubusercontent.com/u/218687519?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/UnboundVariable",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "2": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-07-25T01:52:19Z",
      "updated_at": "2026-01-10T16:28:24Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nWhen using the \"go to references\" or \"find all references\" feature in the language server, if you point to the name of an overloaded function or method, I would expect all overloads to be found in addition to the overload's implementation. Currently, only the implementation is found.\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/886/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/885",
      "id": 3260707886,
      "node_id": "I_kwDOOje-Bs7CWnQu",
      "number": 885,
      "title": "Type narrowing in concurrency scenarios",
      "user": {
        "login": "pfaion",
        "id": 7101194,
        "node_id": "MDQ6VXNlcjcxMDExOTQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7101194?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/pfaion",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-07-24T17:44:33Z",
      "updated_at": "2025-07-25T20:03:10Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nHey all,\n\nI write a lot of async code and frequently run into cases where the type inference (both of `ty` and other type checkers) does not tell the full picture. I'm wondering what `ty`'s perspective on that is. Apologies if I'm mis-using terminology here, I'm still relatively new to a lot of this, feel free to correct me!\n\nConsider this example:\n\n```python\nfrom typing import reveal_type\n\nfield: int | None = None\n\nasync def process() -> None:\n    global field\n    if field is None:\n        return\n    await asyncio.sleep(1)        # (1)\n    reveal_type(field)            # (2) Revealed type: `int`\n```\n\nIt's easy to imagine a case where a different coroutine takes control during the await at `(1)`, changes the `field` to `None` again and then we resume at `(2)` and could theoretically get `int | None` again??\n\nI got confused thinking about this. It feels to me that for async code we at least have clear boundaries for where you could argue to reset the narrowing. But thinking further, does that mean any code accessing shared state from multiple threads can never use type narrowing?\n\nIs there any clear statement in the typing spec about concurrency?\n\nDo you have strategies for dealing with these situations? Because it can lead to type-mismatch-related crashes at runtime that the static type checker did not warn about.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/885/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/878",
      "id": 3257812489,
      "node_id": "I_kwDOOje-Bs7CLkYJ",
      "number": 878,
      "title": "Remove ty support for Python 3.7 (and 3.8?)",
      "user": {
        "login": "MatthewMckee4",
        "id": 119673440,
        "node_id": "U_kgDOByISYA",
        "avatar_url": "https://avatars.githubusercontent.com/u/119673440?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MatthewMckee4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 10,
      "created_at": "2025-07-23T21:53:29Z",
      "updated_at": "2025-11-14T09:09:22Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961576,
        "node_id": "IT_kwDOBulz184BEhJo",
        "name": "Task",
        "description": "A specific piece of work",
        "color": "yellow",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In the [docs](https://docs.astral.sh/ty/reference/cli/#ty-check--python-version), it is said that you can supply `--python-version 3.7` but you cant pip install with python 3.7.\n\nWhat is the intended outcome, can we support 3.7?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/878/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/876",
      "id": 3255123254,
      "node_id": "I_kwDOOje-Bs7CBT02",
      "number": 876,
      "title": "Enums: advanced features",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "1": {
          "id": 9338446479,
          "node_id": "LA_kwDOOje-Bs8AAAACLJ1ijw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/enums",
          "name": "enums",
          "color": "ac72c7",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 11,
      "created_at": "2025-07-23T06:51:35Z",
      "updated_at": "2025-12-18T12:34:31Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We have basic support for enums, but there is a long tail of things that could be improved:\n\n- [x] Infer type for [member names](https://typing.python.org/en/latest/spec/enums.html#member-names) and [member values](https://typing.python.org/en/latest/spec/enums.html#member-values).\n- [x] Special-case handling of `IntEnum`, `StrEnum`, or other custom classes that derive from both `Enum` and some other class (infer appropriate types for member values)\n- [x] `auto()` values\n- [ ] Handling of `enum.Flag` (enum expansion may not be performed for subclasses of `enum.Flag`)\n- [ ] Custom `__new__` or `__init__` methods in enums.\n- [ ] Support for `_generate_next_value_`\n- [ ] Special-case handling for call to enum class to retrieve member by value (e.g. `Color(\"red\")`)\n- [ ] Function syntax to create Enums",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/876/reactions",
        "total_count": 6,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 2
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/872",
      "id": 3252938614,
      "node_id": "I_kwDOOje-Bs7B4-d2",
      "number": 872,
      "title": "Detect if there is no binding to a symbol declared `Final`",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-07-22T14:31:54Z",
      "updated_at": "2026-01-09T02:01:30Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This should be an error: the constant is declared `Final`, but there is no binding:\n\n```py\nCONSTANT: Final[int]  # this should be an error\n```\n\nNote that we *do* allow separating the declaration and the binding of a `Final` symbol:\n\n```py\nCONSTANT: Final[int]  # this is allowed\nCONSTANT = 1\n```\n\nAlso, even if we would disallow this particular pattern (it's not explicitly required by the spec), `Final`-annotations without a right-hand side can appear in (data)class definitions, for example:\n\n```py\nclass C:\n    CONSTANT: Final[int]  # this is allowed\n\n    def __init__(self):\n        self.CONSTANT = 1\n```\n\nWe have existing tests for this [here](https://github.com/astral-sh/ruff/blob/64e57800373354cbabf106a5e89f6abc19d67300/crates/ty_python_semantic/resources/mdtest/type_qualifiers/final.md?plain=1#L358-L394).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/872/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/871",
      "id": 3252922718,
      "node_id": "I_kwDOOje-Bs7B46le",
      "number": 871,
      "title": "Prevent overriding of `Final` attributes in subclasses",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-07-22T14:27:33Z",
      "updated_at": "2025-07-23T23:21:38Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Attributes which are qualified as `Final` may not be overwritten in subclasses ([spec](https://typing.python.org/en/latest/spec/qualifiers.html#uppercase-final)):\n\n```py\nfrom typing import Final\n\nclass Base:\n    CONSTANT: Final[int] = 1\n\nclass Derived(Base):\n    CONSTANT = 2  # This should be an error\n```\n\nWe have an existing test (with TODOs) for this [here](https://github.com/astral-sh/ruff/blob/64e57800373354cbabf106a5e89f6abc19d67300/crates/ty_python_semantic/resources/mdtest/type_qualifiers/final.md?plain=1#L230-L249).\n\nI imagine that it might be convenient to implement this once we have https://github.com/astral-sh/ty/issues/166 (because that would require similar mechanisms to look up equivalent attributes in base classes), but it might also make sense to implement this independently.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/871/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/866",
      "id": 3249717555,
      "node_id": "I_kwDOOje-Bs7BssEz",
      "number": 866,
      "title": "Improve diagnostics when a class literal is not assignable to a `Callable` type",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-07-21T19:04:38Z",
      "updated_at": "2026-01-09T01:50:46Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Consider this snippet:\n\n```py\nfrom typing import Callable, Any\n\ndef f(x: Callable[[Any], Any]): ...\n\nclass Foo:\n    def __init__(self, x, y): ...\n\nf(Foo)\n```\n\nTy [emits this diagnostic](https://play.ty.dev/0e830866-dca5-4fdf-89eb-c0e5219ccf06) on it, which isn't very useful:\n\n```py\nerror[invalid-argument-type]: Argument to function `f` is incorrect\n --> foo.py:8:3\n  |\n6 |     def __init__(self, x, y): ...\n7 |\n8 | f(Foo)\n  |   ^^^ Expected `(Any, /) -> Any`, found `<class 'Foo'>`\n  |\ninfo: Function defined here\n --> foo.py:3:5\n  |\n1 | from typing import Callable, Any\n2 |\n3 | def f(x: Callable[[Any], Any]): ...\n  |     ^ ----------------------- Parameter declared here\n4 |\n5 | class Foo:\n  |\ninfo: rule `invalid-argument-type` is enabled by default\n```\n\nIt just tells me that `<class 'Foo'>` isn't acceptable, but it doesn't tell me _why_ `<class 'Foo'>` isn't acceptable. It would be much more helpful if ty told me what `Callable` supertype it thinks `Foo` _does_ inhabit. (Here I assume it's `Callable[[Any, Any], Foo]`, which isn't assignable to `Callable[[Any], Any]`.)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/866/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/864",
      "id": 3249126020,
      "node_id": "I_kwDOOje-Bs7BqbqE",
      "number": 864,
      "title": "provide more diagnostic context for invalid-context-manager",
      "user": {
        "login": "jelly",
        "id": 67428,
        "node_id": "MDQ6VXNlcjY3NDI4",
        "avatar_url": "https://avatars.githubusercontent.com/u/67428?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jelly",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-07-21T15:34:31Z",
      "updated_at": "2026-01-09T01:50:05Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "(The error initially reported below is a true positive, but our diagnostic message for bad context manager method implementations should describe why we consider `__enter__` or `__exit__` wrongly implemented. That is, we should propagate the actual call error encountered.)\n\n### Summary\n\n<details>\n\nTesting ty on our Cockpit Python code found a false positive in our custom contextmanager which takes an argument:\n\n```python\nimport os\nfrom typing import Any\n\nclass Handle(int):\n    \"\"\"An integer subclass that makes it easier to work with file descriptors\"\"\"\n\n    def __new__(cls, fd: int = -1) -> 'Handle':\n        return super(Handle, cls).__new__(cls, fd)\n\n    # separate __init__() to set _needs_close mostly to keep pylint quiet\n    def __init__(self, fd: int = -1):\n        super().__init__()\n        self._needs_close = fd != -1\n\n    def __bool__(self) -> bool:\n        return self != -1\n\n    def close(self) -> None:\n        if self._needs_close:\n            self._needs_close = False\n            os.close(self)\n\n    def __eq__(self, value: object) -> bool:\n        if int.__eq__(self, value):  # also handles both == -1\n            return True\n\n        if not isinstance(value, int):  # other object is not an int\n            return False\n\n        if not self or not value:  # when only one == -1\n            return False\n\n        return os.path.sameopenfile(self, value)\n\n    def __del__(self) -> None:\n        if self._needs_close:\n            self.close()\n\n    def __enter__(self) -> 'Handle':\n        return self\n\n    def __exit__(self, _type: type, _value: object, _traceback: object) -> None:\n        self.close()\n\n    @classmethod\n    def open(cls, *args: Any, **kwargs: Any) -> 'Handle':\n        return cls(os.open(*args, **kwargs))\n\n    def steal(self) -> 'Handle':\n        self._needs_close = False\n        return self.__class__(int(self))\n\ndir_fd = os.open('/', os.O_RDONLY)\nwith Handle.open('tmp', os.O_RDONLY, dir_fd=dir_fd) as fd:\n    print(fd)\n```\n\nError:\n```\nerror[invalid-context-manager]: Object of type `Handle` cannot be used with `with` because it does not correctly implement `__exit__`\n  --> contenxt-manager-ty-issue.py:80:6\n   |\n79 | dir_fd = os.open('/', os.O_RDONLY)\n80 | with Handle.open('tmp', os.O_RDONLY, dir_fd=dir_fd) as fd:\n   |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n81 |     print(fd)\n   |\ninfo: rule `invalid-context-manager` is enabled by default\n```\n\n</details>\n\nI managed to reduce this to down to:\n```python\nclass TestContextManager:\n    def __init__(self, name: str) -> None:\n        self.name = name\n\n    def __enter__(self) -> 'TestContextManager':\n        return self\n\n    def __exit__(self, _type: type, _value: object, _traceback: object) -> None:\n        ...\n\nwith TestContextManager('something') as foo:\n    ...\n```\n\nWhich gives:\n\n```\nerror[invalid-context-manager]: Object of type `TestContextManager` cannot be used with `with` because it does not correctly implement `__exit__`\n  --> foo.py:11:6\n   |\n 9 |         ...\n10 |\n11 | with TestContextManager('something') as foo:\n   |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n12 |     ...\n   |\ninfo: rule `invalid-context-manager` is enabled by default\n```\n\n### Version\n\nty ruff/0.12.4+31 (c2380fa0e 2025-07-21)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/864/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/860",
      "id": 3247858048,
      "node_id": "I_kwDOOje-Bs7BlmGA",
      "number": 860,
      "title": "`__file__` import typed as `str | None`",
      "user": {
        "login": "sinon",
        "id": 146272,
        "node_id": "MDQ6VXNlcjE0NjI3Mg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/146272?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sinon",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-07-21T09:25:38Z",
      "updated_at": "2025-12-18T23:12:06Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```python\nimport typing\nimport os \nfrom module import __file__ as module_path\n\ntyping.reveal_type(module_path). # str | None\nos.path.abspath(module_path) # No overload of function `abspath` matches arguments\n```\n\nhttps://play.ty.dev/4dd59d9f-5dbe-433e-b370-67bbd5575fb2\n\n`mypy` and `pyright` both detect the successful import and type the value as `str`\n\n### Version\n\nty 0.0.1-alpha.15 (0369a3598 2025-07-18)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/860/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/855",
      "id": 3246282030,
      "node_id": "I_kwDOOje-Bs7BflUu",
      "number": 855,
      "title": "Consider removing `infer_expression_type` query",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8653735457,
          "node_id": "LA_kwDOOje-Bs8AAAACA82GIQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/memory",
          "name": "memory",
          "color": "e99695",
          "default": false,
          "description": "related to memory usage"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-07-20T11:28:57Z",
      "updated_at": "2025-07-20T15:59:49Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The original motivation why we introduced the `infer_expression_type` was because we wanted to avoid that ty ever infers the same expression twice and that this is important for performance. https://github.com/astral-sh/ruff/pull/19436 shows that this might not be the case (and it's a very naive approach at removing the query). Most benchmarks are neutral with the exception of sympy (11% regresssion).\n\nRemoving the query is motivated by the fact that the cached query results can take up up to 3GB of memory (struct fields + metadata) in large projects (~10% of overall memory usage) and this is without accounting for the `Expression` ingredients (another 500MB). \n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/855/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/847",
      "id": 3241316907,
      "node_id": "I_kwDOOje-Bs7BMpIr",
      "number": 847,
      "title": "Accessing private members should be an error",
      "user": {
        "login": "InSyncWithFoo",
        "id": 122007197,
        "node_id": "U_kgDOB0WunQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/122007197?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/InSyncWithFoo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-07-18T00:00:59Z",
      "updated_at": "2026-01-09T01:49:05Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Consider this example ([playground](https://play.ty.dev/9ec508e3-29af-43e2-a761-967982cf6a56)):\n\n```python\nclass C[T]:\n\t_v: T\n\tdef __init__(self, v: T) -> None:\n\t\tself._v = v\n\nc = C(0)\nc._v = 1  # Currently allowed\n```\n\nThe assignment to `c._v` should be reported, since otherwise an instance of `C` would be considered mutable, causing `T` to be invariant instead of covariant. For consistency, I think read accesses should also be disallowed.\n\nThis issue is related to #488.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/847/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/845",
      "id": 3240280612,
      "node_id": "I_kwDOOje-Bs7BIsIk",
      "number": 845,
      "title": "Implement `@warnings.deprecated` supression for uses of imported symbols",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239603,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPsw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/feature",
          "name": "feature",
          "color": "a2eeef",
          "default": false,
          "description": "New feature or request"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-07-17T16:59:24Z",
      "updated_at": "2025-11-14T09:13:24Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I'm landing https://github.com/astral-sh/ruff/pull/19376 without this functionality.\n\n---\n\nIf you `from module import something_deprecated` we should emit a diagnostic for that **but then not emit diagnostics for subsequent uses of something_deprecated in the file** to minimize needless repetition when there's a single root issue.\n\n---\n\nSee this section of the deprecated mdtest:\n\nhttps://github.com/astral-sh/ruff/blob/8ded41b7e5d9cb3c7883bdb6cdd4acbda2512305/crates/ty_python_semantic/resources/mdtest/deprecated.md#direct-import-deprecated\n\n----\n\nI think this is probably not too hard to do, although it depends on how \"right\" you want to do it. Notably ideally we should have this behaviour:\n\n```\nimport module\nfrom module import some_deprecated  # error: [deprecated]\n\nsome_deprecated()  # ok! (supressed)\nmodule.some_deprecated()  # error: [deprecated]\n```\n\nHowever a potentially simple implementation of this behaviour would be to, when we emit a diagnostic while checking imports, record the `DeprecatedInstance` as \"handled\" in the scope and supress all subsequent diagnostics that involve that `DeprecatedInstance` (or maybe mark the FunctionLiteral/ClassLiteral? unclear if there's relevant corner cases to that difference).\n\nThat implementation would supress `module.some_deprecated()` until the `from module import some_deprecated` was handled, at which point it would suddenly become unsupressed and complain. While this is certainly suboptimal I think this is so narrow that the \"flaw\" is acceptable.\n\nOf course if the \"correct\" implementation is easy, great. I have no idea how to do the correct one in ty's architecture though.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/845/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/844",
      "id": 3240228983,
      "node_id": "I_kwDOOje-Bs7BIfh3",
      "number": 844,
      "title": "Implement `@warnings.deprecated` checking for `@override`s",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239603,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPsw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/feature",
          "name": "feature",
          "color": "a2eeef",
          "default": false,
          "description": "New feature or request"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-07-17T16:43:29Z",
      "updated_at": "2025-11-13T17:56:15Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I'm landing https://github.com/astral-sh/ruff/pull/19376 without this functionality.\n\n---\n\nPer https://typing.python.org/en/latest/spec/directives.html#deprecated\n\n> If a method is marked with the [@override decorator](https://typing.python.org/en/latest/spec/class-compat.html#override) and the base class method it overrides is deprecated, the type checker should produce a diagnostic.\n\n----\n\nThe deprecated mdtest does not currently stress this situation. I have no idea how hard this is to do.\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/844/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/843",
      "id": 3240224411,
      "node_id": "I_kwDOOje-Bs7BIeab",
      "number": 843,
      "title": "Implement `@warnings.deprecated` checking for dunder methods and properties",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239603,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPsw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/feature",
          "name": "feature",
          "color": "a2eeef",
          "default": false,
          "description": "New feature or request"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-07-17T16:41:22Z",
      "updated_at": "2025-11-13T17:56:04Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I'm landing https://github.com/astral-sh/ruff/pull/19376 without this functionality.\n\n---\n\nPer https://typing.python.org/en/latest/spec/directives.html#deprecated\n\n> Any syntax that indirectly triggers a call to the function. For example, if the __add__ method of a class C is deprecated, then the code C() + C() should trigger a diagnostic. Similarly, if the setter of a property is marked deprecated, attempts to set the property should trigger a diagnostic.\n\n----\n\nSee this section of the mdtest for a TODO test of the `__add__` dunder:\n\nhttps://github.com/astral-sh/ruff/blob/8ded41b7e5d9cb3c7883bdb6cdd4acbda2512305/crates/ty_python_semantic/resources/mdtest/deprecated.md#dunders\n\n----\n\nI have no idea if this is really easy or complicated.\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/843/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/842",
      "id": 3239907708,
      "node_id": "I_kwDOOje-Bs7BHRF8",
      "number": 842,
      "title": "Implement `@warnings.deprecated` analysis for overloads",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239603,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPsw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/feature",
          "name": "feature",
          "color": "a2eeef",
          "default": false,
          "description": "New feature or request"
        },
        "1": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-07-17T14:58:17Z",
      "updated_at": "2026-01-09T01:48:49Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We're landing https://github.com/astral-sh/ruff/pull/19376 without this functionality, leaving it for a followup.\n\nThe deprecated mdtest also has a TODO case already.\n\nSee:\n\n* https://github.com/astral-sh/ruff/pull/19376#discussion_r2208606501\n* https://github.com/astral-sh/ruff/pull/19376#discussion_r2208655354",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/842/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/839",
      "id": 3239409812,
      "node_id": "I_kwDOOje-Bs7BFXiU",
      "number": 839,
      "title": "ty fails to lookup relative imports if the relative path from the nearest import root includes an invalid module name",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-07-17T12:29:13Z",
      "updated_at": "2025-11-14T17:38:46Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Langchain has an [`__init__.py`](https://github.com/langchain-ai/langchain/blob/491f63ca82806a98b18f785d0d315e7f5d8de29f/libs/standard-tests/langchain_tests/unit_tests/__init__.py#L21) with the following content\n\n```py\n# ruff: noqa: E402\nimport pytest\n\n# Rewrite assert statements for test suite so that implementations can\n# see the full error message from failed asserts.\n# https://docs.pytest.org/en/7.1.x/how-to/writing_plugins.html#assertion-rewriting\nmodules = [\n    \"chat_models\",\n    \"embeddings\",\n    \"tools\",\n]\n\nfor module in modules:\n    pytest.register_assert_rewrite(f\"langchain_tests.unit_tests.{module}\")\n\nfrom .chat_models import ChatModelUnitTests\nfrom .embeddings import EmbeddingsUnitTests\nfrom .tools import ToolsUnitTests\n\n__all__ = [\"ChatModelUnitTests\", \"EmbeddingsUnitTests\", \"ToolsUnitTests\"]\n```\n\n\nty fails to resolve the relative imports `chat_models`, `embeddings` and `.tools` even though those files clearly exist. Pyright seems fine with the import. \n\nThe issue seems to be that `file_to_module` fails because the relative path to the search root (which is the project root) `libs/standard-tests/langchain_tests/unit_tests/teswt.py` can't be turned into a valid module name because of the `standard-tests`. \n\nA solution here is to add `standard-tests` to the search path but having to do this is at least confusing in an LSP setup (where ty should just work out of the box)\n\n[Playground](https://play.ty.dev/d35224bf-eb57-47c3-8877-e4a4175702dc)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/839/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/836",
      "id": 3238954403,
      "node_id": "I_kwDOOje-Bs7BDoWj",
      "number": 836,
      "title": "Panic `attempt to subtract with overflow` in `ruff_annotate_snippets/src/renderer/margin.rs`",
      "user": {
        "login": "qarmin",
        "id": 41945903,
        "node_id": "MDQ6VXNlcjQxOTQ1OTAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/41945903?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/qarmin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        },
        "2": {
          "id": 9775918749,
          "node_id": "LA_kwDOOje-Bs8AAAACRrCunQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fuzzer",
          "name": "fuzzer",
          "color": "cf5f2e",
          "default": false,
          "description": "Issues surfaced by fuzzing ty"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "BurntSushi",
          "id": 456674,
          "node_id": "MDQ6VXNlcjQ1NjY3NA==",
          "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/BurntSushi",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 4,
      "created_at": "2025-07-17T10:04:21Z",
      "updated_at": "2025-12-05T13:08:13Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Quite similar to https://github.com/astral-sh/ty/issues/670\n\nFile content(at the bottom should be attached raw, not formatted file - github removes some non-printable characters, so copying from here may not work):\n```\n                                     'betting_env.datastructure.team_lineup.Tamheet.get_latest': ( 'dataStrcuture/team_lineup.htm#teamsheet.getlatest',\n```\n\ncommand\n```\ntimeout -v 300 ty check TEST___FILE.py\n```\n\ncause this\n```\nthread 'main' panicked at crates/ruff_annotate_snippets/src/renderer/margin.rs:74:16:\nattempt to subtract with overflow\nstack backtrace:\n   0: __rustc::rust_begin_unwind\n             at /rustc/3014e79f9c8d5510ea7b3a3b70d171d0948b1e96/library/std/src/panicking.rs:697:5\n   1: core::panicking::panic_fmt\n             at /rustc/3014e79f9c8d5510ea7b3a3b70d171d0948b1e96/library/core/src/panicking.rs:75:14\n   2: core::panicking::panic_const::panic_const_sub_overflow\n             at /rustc/3014e79f9c8d5510ea7b3a3b70d171d0948b1e96/library/core/src/panicking.rs:175:17\n   3: ruff_annotate_snippets::renderer::margin::Margin::compute\n             at ./ruff-main/crates/ruff_annotate_snippets/src/renderer/margin.rs:74:16\n   4: ruff_annotate_snippets::renderer::margin::Margin::new\n             at ./ruff-main/crates/ruff_annotate_snippets/src/renderer/margin.rs:53:11\n   5: ruff_annotate_snippets::renderer::display_list::format_body\n             at ./ruff-main/crates/ruff_annotate_snippets/src/renderer/display_list.rs:1645:18\n   6: ruff_annotate_snippets::renderer::display_list::format_snippet\n             at ./ruff-main/crates/ruff_annotate_snippets/src/renderer/display_list.rs:1121:20\n   7: ruff_annotate_snippets::renderer::display_list::format_message\n             at ./ruff-main/crates/ruff_annotate_snippets/src/renderer/display_list.rs:1029:19\n   8: ruff_annotate_snippets::renderer::display_list::DisplayList::new\n             at ./ruff-main/crates/ruff_annotate_snippets/src/renderer/display_list.rs:127:20\n   9: ruff_annotate_snippets::renderer::Renderer::render\n             at ./ruff-main/crates/ruff_annotate_snippets/src/renderer/mod.rs:167:9\n  10: <ruff_db::diagnostic::render::DisplayDiagnostics as core::fmt::Display>::fmt\n             at ./ruff-main/crates/ruff_db/src/diagnostic/render.rs:175:52\n  11: <ruff_db::diagnostic::render::DisplayDiagnostic as core::fmt::Display>::fmt\n             at ./ruff-main/crates/ruff_db/src/diagnostic/render.rs:70:94\n  12: core::fmt::rt::Argument::fmt\n             at /rustc/3014e79f9c8d5510ea7b3a3b70d171d0948b1e96/library/core/src/fmt/rt.rs:173:76\n  13: core::fmt::write\n             at /rustc/3014e79f9c8d5510ea7b3a3b70d171d0948b1e96/library/core/src/fmt/mod.rs:1469:25\n  14: <&mut W as core::fmt::Write::write_fmt::SpecWriteFmt>::spec_write_fmt\n             at /home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/mod.rs:233:21\n  15: core::fmt::Write::write_fmt\n             at /home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/mod.rs:238:14\n  16: ty::MainLoop::main_loop\n             at ./ruff-main/crates/ty/src/lib.rs:326:37\n  17: ty::MainLoop::run\n             at ./ruff-main/crates/ty/src/lib.rs:249:27\n  18: ty::run_check\n             at ./ruff-main/crates/ty/src/lib.rs:151:19\n  19: ty::run\n             at ./ruff-main/crates/ty/src/lib.rs:45:39\n  20: ty::main\n             at ./ruff-main/crates/ty/src/main.rs:6:5\n  21: core::ops::function::FnOnce::call_once\n             at /home/runner/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:253:5\nnote: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.\n\n##### Automatic Fuzzer note, output status \"Some(101)\", output signal \"None\"\n```\n\n[b.py.zip](https://github.com/user-attachments/files/21292888/b.py.zip)",
      "closed_by": {
        "login": "qarmin",
        "id": 41945903,
        "node_id": "MDQ6VXNlcjQxOTQ1OTAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/41945903?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/qarmin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/836/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/835",
      "id": 3237634428,
      "node_id": "I_kwDOOje-Bs7A-mF8",
      "number": 835,
      "title": "detect unused names (including unused because shadowed)",
      "user": {
        "login": "karlicoss",
        "id": 291333,
        "node_id": "MDQ6VXNlcjI5MTMzMw==",
        "avatar_url": "https://avatars.githubusercontent.com/u/291333?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/karlicoss",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239603,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPsw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/feature",
          "name": "feature",
          "color": "a2eeef",
          "default": false,
          "description": "New feature or request"
        },
        "1": {
          "id": 8760037609,
          "node_id": "LA_kwDOOje-Bs8AAAACCiOQ6Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/lint",
          "name": "lint",
          "color": "a3b2aa",
          "default": false,
          "description": "Label for features that we would implement as lint rules, not core type checker features"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-07-16T23:33:53Z",
      "updated_at": "2025-10-06T16:23:11Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n## What happens\nIf a function is declared twice, ty happily accepts it and infers the type as of the latest definition:\n\n```py\ndef x() -> int:\n    return 1\n\ndef x() -> str:\n    return \"\"\n\nreveal_type(x)\n# Revealed type: `def x() -> str` (revealed-type) [Ln 7, Col 13]\n```\n\nty playground link: https://play.ty.dev/9143957d-9d8d-4f20-b8c0-f6ce700d69f8\n\n## Expected behaviour\n\nShould probably complain (especially if the types are mismatching).\n\nFor the same code, mypy complains with [`no-redef` error](https://mypy.readthedocs.io/en/stable/error_code_list.html#check-that-each-name-is-defined-once-no-redef)\n\n https://mypy-play.net/?mypy=latest&python=3.12&gist=592caaea970d4463db57c27616547448\n\n\nApologies if this is already discussed somewhere, but couldn't find!\n\n### Version\n\n[03f35a4](https://github.com/astral-sh/ty/commit/03f35a4908bfe4d3ff201293beb3aa1fb1e52f05) -- latest git (playground)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/835/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/833",
      "id": 3237146439,
      "node_id": "I_kwDOOje-Bs7A8u9H",
      "number": 833,
      "title": "Pseudo-generic classes to improve inference in untyped code",
      "user": {
        "login": "erictraut",
        "id": 7040122,
        "node_id": "MDQ6VXNlcjcwNDAxMjI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7040122?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/erictraut",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239603,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPsw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/feature",
          "name": "feature",
          "color": "a2eeef",
          "default": false,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-07-16T19:44:30Z",
      "updated_at": "2025-07-16T20:07:30Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I was talking with @carljm, and I mentioned a feature in pyright that I've never really documented. He asked me to provide a brief description here for the benefit of the ty team. This feature is likely a low priority at this time, but it may be something to consider as ty's feature set matures.\n\nThis is a feature that I refer to as \"pseudo-generic classes\". When pyright encounters a non-generic class with an unannotated `__init__` method, it treats the class as though it's generic. Under the covers (and invisible to users), it creates a unique type variable for each `__init__` parameter. It then uses its normal type inference logic to infer the types of instance variables and method return types.\n\nHere is an example:\n\nCode sample in [pyright playground](https://pyright-play.net/?code=GYJw9gtgBANmDm8CWA7eUkQA5hAFygAkBDFAExgFMQAaKAOQHkAVAZQFFmAoLgYxmIBnQVACCAChLkqIAJQAuLlGVQylYFAD6m1EjzbxgyjGB1idAEZ0qAN2MBeJm04KlK94ICuWauNkA6bV19TXFbY1k3d2UjE0DgMDBNYih7KGIo6NjgeMTNC1SoCx53AAEscB98AE9MtQ0bYhhPSmTDY2BXaJUQSjxPEBQobNykjMzyyuo8Wvd6qEbm1ot2ky7uqF7%2BweGO0fyeYgBGQokAJgB2OgAia8jeuybNGZ9xY-9FluTZZQBiDBQeC4D0oTxelDeRw%2BTS%2BFh%2BUH%2BgjwIEOZ1O4ludAAzAAre6UR4wZ7VV7EM7QpbfP7DZHAgmgongt7kz7LeH-XiQLBUAAePH%2BzAAFkgRPBKChqMQ8JQRKQoNRwCAipReMRPEZ0lAsEZPGQwABaMUSkBIXhcDkCYQYEQoMAEYi8fpNGDVKBG6im-xcYhY%2BRiADaqDwdCRtBpIAAulwgA)\n\n```python\nfrom logging import Handler, NOTSET\n\nclass A(Handler):\n    def __init__(self, a, b, level=NOTSET):\n        super().__init__(level)\n        self._foo_a = a\n        self._foo_b = b\n\n    @property\n    def value_a(self):\n        return self._foo_a\n\n    @property\n    def value_b(self):\n        return self._foo_b\n\na1 = A(27, \"\")\nreveal_type(a1.value_a)  # int\nreveal_type(a1.value_b)  # str\n\na2 = A(\"\", 3j)\nreveal_type(a2.value_a)  # str\nreveal_type(a2.value_b)  # complex\n\n# This generates an error because a pseudo-generic\n# class is not actually generic.\na3: A[int, str, str]\n\n```\n\nThis feature should be able to use all of the normal type checker machinery (type inference, constraint solving, etc.), so all of that comes for \"free\". The tricky part is finding all of the places where type parameters and generic types are visible to users (diagnostic messages, revealed types, language server hover text, etc.) and make sure that these synthesized type parameters remain invisible to users.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/833/reactions",
        "total_count": 1,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/825",
      "id": 3231511452,
      "node_id": "I_kwDOOje-Bs7AnPOc",
      "number": 825,
      "title": "(🎁) use markup for diagnostics in lsp to codify backtics",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 8,
      "created_at": "2025-07-15T09:24:58Z",
      "updated_at": "2025-09-22T08:14:42Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\ni think it would be cool to render backtics from messages as code blocks inside the ide, but i can't do it due to the dynamic nature of messages:\n```py\nreveal_type(\"`\")  # Revealed type: `Literal[\"`\"]`\n```\n\nlsp 3.18 supports markup in diagnostics: https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#diagnostic",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/825/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/819",
      "id": 3225258438,
      "node_id": "I_kwDOOje-Bs7APYnG",
      "number": 819,
      "title": "CLI: Mono-repository support",
      "user": {
        "login": "futurewasfree",
        "id": 927951,
        "node_id": "MDQ6VXNlcjkyNzk1MQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/927951?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/futurewasfree",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 18,
      "created_at": "2025-07-12T11:58:50Z",
      "updated_at": "2026-01-09T09:23:17Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 1,
        "percent_completed": 100
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nFrom cli output it's not obvious what project root would be set to if no `--project` or `--python` provided.\nSeems to be the same with `cwd`?\n\n```\n   --project <PROJECT>\n          Run the command within the given project directory.\n\n          All `pyproject.toml` files will be discovered by walking up the directory tree from the given project directory, as will the project's virtual environment\n          (`.venv`) unless the `venv-path` option is set.\n\n          Other command-line arguments (such as relative paths) will be resolved relative to the current working directory.\n\n      --python <PATH>\n          Path to the Python environment.\n\n          ty uses the Python environment to resolve type information and third-party dependencies.\n\n          If not specified, ty will attempt to infer it from the `VIRTUAL_ENV` or `CONDA_PREFIX` environment variables, or discover a `.venv` directory in the project root\n          or working directory.\n...\n```\n\nExpectation might be: `ty` would still walk down the directory, see uv's `pyproject.toml` and `.venv` there and activate it?\n\n### Version\n\nty 0.0.1-alpha.14 (3ececb07e 2025-07-08)",
      "closed_by": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/819/reactions",
        "total_count": 7,
        "+1": 7,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/791",
      "id": 3215648865,
      "node_id": "I_kwDOOje-Bs6_quhh",
      "number": 791,
      "title": "Solid semantic tokens",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 15,
      "created_at": "2025-07-09T11:48:22Z",
      "updated_at": "2025-12-18T17:42:27Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961576,
        "node_id": "IT_kwDOBulz184BEhJo",
        "name": "Task",
        "description": "A specific piece of work",
        "color": "yellow",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Follow up on the TODOs in the semantic tokens provider\n\nSee https://github.com/astral-sh/ruff/blob/278f93022acf4ddbb693510cadf99d0eaa53153a/crates/ty_ide/src/semantic_tokens.rs#L26-L51",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/791/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/789",
      "id": 3215450572,
      "node_id": "I_kwDOOje-Bs6_p-HM",
      "number": 789,
      "title": "Enable LRU for `parsed_module`, `semantic_index` and maybe more queries",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8653735457,
          "node_id": "LA_kwDOOje-Bs8AAAACA82GIQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/memory",
          "name": "memory",
          "color": "e99695",
          "default": false,
          "description": "related to memory usage"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-07-09T10:39:14Z",
      "updated_at": "2025-12-03T09:05:11Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Enable Salsa's LRU eviction for some of the most dominent Salsa queries. This should help reduce memory usage after the initial type checking completed (mainly relevant in the LSP use case)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/789/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/784",
      "id": 3213058098,
      "node_id": "I_kwDOOje-Bs6_g2Ay",
      "number": 784,
      "title": "Gray out unreachable code",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 8,
      "created_at": "2025-07-08T16:02:47Z",
      "updated_at": "2025-11-14T08:39:44Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This can be done by creating a diagnostic with the `UnnecessaryCode` tag. \n\nOur reachability infrastructure should be powerful enough to support this but recording reachability constraints for every node is probably too expensive and we have to do it at the basic block level instead. \n\nThe diagnostic reported by ty should also cover the maximum span that's unreachable instead of having a diagnostic for each node (which would be very verbose. It's worth looking into how other type checker handle this). \n\nThere's an UX question for what we want to do about code that is unreachable with the current configuration settings (e.g. for a newer python version). Ideally, this code gets grayed out in the LSP but reporting a diagnostic in the CLI might be annoying (but can be useful to detect code that's no longer revelant after upgrading to a newer Python version)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/784/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/774",
      "id": 3210255331,
      "node_id": "I_kwDOOje-Bs6_WJvj",
      "number": 774,
      "title": "accept file contents from stdin",
      "user": {
        "login": "jleechpe",
        "id": 1301213,
        "node_id": "MDQ6VXNlcjEzMDEyMTM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1301213?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jleechpe",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-07-07T21:07:26Z",
      "updated_at": "2025-10-06T15:31:24Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nI'm trying to test out `ty` using Emacs Flymake to display diagnostics.  With `ruff` I can pass the modified contents as `stdin` and use `--stdin-filename` to get it to behave as expected prior to saving the modified file.  With `ty` I only get diagnostics after saving since there doesn't seem to be any way to give it file contents over stdin and then get a report.\n\n### Version\n\nty 0.0.1-alpha.13",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/774/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/770",
      "id": 3207158243,
      "node_id": "I_kwDOOje-Bs6_KVnj",
      "number": 770,
      "title": "Intersection between Protocol and almost overlapping class is simplified incorrectly",
      "user": {
        "login": "JelleZijlstra",
        "id": 906600,
        "node_id": "MDQ6VXNlcjkwNjYwMA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/906600?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/JelleZijlstra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        },
        "2": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 11,
      "created_at": "2025-07-06T23:34:32Z",
      "updated_at": "2026-01-09T22:16:20Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIn the below example, ty incorrectly simplifies a Protocol out of an intersection when it almost (but not quite) is the same as a nominal class.\n\nhttps://play.ty.dev/9b0ac32c-9200-4558-8269-6e3f3bea1837\n\n```python\nfrom typing import Protocol\nfrom ty_extensions import Intersection, Not\n\nclass Proto(Protocol):\n    def meth(self) -> int: ...\n\nclass X:\n    def meth(self) -> int | str: return 42\n\ndef f(x: Intersection[X, Proto]):\n    reveal_type(x)  # X (expect X & Proto)\n    reveal_type(x.meth())  # int | str (expect int)\n```\n\nThis can also lead to incorrect type inference without explicit Intersection types (https://play.ty.dev/6185eec9-9e29-49f6-b0ef-b817844fedb5):\n\n```python\nfrom typing import Protocol\n\nclass Proto(Protocol):\n    def meth(self) -> int: ...\n\nclass X:\n    def meth(self) -> int | str: return 42\n\ndef f(x: Proto):\n    if isinstance(x, X):\n        reveal_type(x)  # X\n        reveal_type(x.meth())  # int | str\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/770/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/740",
      "id": 3192511460,
      "node_id": "I_kwDOOje-Bs6-Sdvk",
      "number": 740,
      "title": "Support `type()`'s functional syntax",
      "user": {
        "login": "InSyncWithFoo",
        "id": 122007197,
        "node_id": "U_kgDOB0WunQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/122007197?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/InSyncWithFoo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-07-01T13:31:02Z",
      "updated_at": "2025-12-27T04:16:00Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "(First raised [on Discord](https://discord.com/channels/1039017663004942429/1279201882337705994/1389547211150331974).)\n\nCurrently ty doesn't understand `type()`'s functional syntax very well (playground):\n\n```python\n# error: Object of type `type` is not assignable to `type[int]`\nU32: type[int] = type('U32', (int,), {})\n```\n\nIt understands `type(...)` returns a new type, but fails to take the bases into account.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/740/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/737",
      "id": 3191947146,
      "node_id": "I_kwDOOje-Bs6-QT-K",
      "number": 737,
      "title": "Incorrect descriptor lookup for methods on types that are not disjoint from `None`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        },
        "2": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-07-01T10:55:17Z",
      "updated_at": "2025-11-14T15:31:27Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nOther than `object`, all nominal instance types are disjoint from `None`. But... this is not true for instances of structural (`Protocol`) types -- and it turns out that this causes issues for our current implementation of the descriptor protocol.\n\nFor example, compare and contrast the different behaviour of these two protocols. `SupportsFoo` is disjoint from `None`; `SupportsStr` is not:\n\n```py\nfrom typing import Protocol\n\nclass SupportsFoo(Protocol):\n    def foo(self) -> str: ...\n\nclass SupportsStr(Protocol):\n    def __str__(self) -> str: ...\n\ndef f(f: SupportsFoo, s: SupportsStr):\n    reveal_type(f.foo)       # revealed: `bound method SupportsFoo.foo() -> str`\n    f.foo()                  # no diagnostic\n\n    reveal_type(s.__str__)   # revealed: `def __str__(self) -> str`\n    s.__str__()              # error: No argument provided for required parameter `self` of function `__str__` (missing-argument)\n```\n\nhttps://play.ty.dev/09505473-95b5-4b51-b992-7784595bcf55\n\nWhether or not a type is disjoint from `None` impacts our understanding of the way the descriptor protocol is invoked when a method is accessed on that type. The type that a method is accessed on is passed to `FunctionType.__get__` when we invoke the descriptor protocol; if that type is not disjoint from `None`, we end up having to pick the first overload here, which means that the attribute access is (incorrectly!) evaluated as resolving to the original function object rather than a bound method:\n\nhttps://github.com/astral-sh/ruff/blob/c6fd11fe3694646c7b5667e37dfc67b114e2f50a/crates/ty_python_semantic/src/types.rs#L3526-L3575\n\nMany thanks to @sharkdp who helped me track this bug down over the last couple of days!\n\n### Version\n\nc6fd11fe3",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/737/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/727",
      "id": 3187532213,
      "node_id": "I_kwDOOje-Bs69_eG1",
      "number": 727,
      "title": "`invalid-type-form` emitted for non-type tuple index expressions",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8645345133,
          "node_id": "LA_kwDOOje-Bs8AAAACA01_bQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type-inference",
          "name": "type-inference",
          "color": "442A97",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-06-30T07:59:27Z",
      "updated_at": "2025-11-18T16:10:34Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "ty emits `invalid-type-form` for non-type expressions like the following that do not produce errors at runtime:\n```py\ntuple[1]\n```\n\nWhile the above case may seem nonsensical, there are real-world code examples where a strict treatment of non-type `tuple[ ]` expressions under the restricted grammar of type-expressions would lead to false positives (https://github.com/astral-sh/ruff/pull/18991#issuecomment-3018171342). For example:\n```py\nruntime_type_representation = tuple[(int, str) * 3]\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/727/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/722",
      "id": 3185456656,
      "node_id": "I_kwDOOje-Bs693jYQ",
      "number": 722,
      "title": "More lazy semantic index building",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8653735457,
          "node_id": "LA_kwDOOje-Bs8AAAACA82GIQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/memory",
          "name": "memory",
          "color": "e99695",
          "default": false,
          "description": "related to memory usage"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-06-28T20:35:31Z",
      "updated_at": "2025-06-30T19:55:49Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://github.com/astral-sh/ruff/pull/19019 shows that we spent a decent amount of time in semantic indexing. I wonder if it would help performance if we make the semantic index more lazy by building it scope by scope instead of all in a single pass. \n\nThis could also help for third party modules where it may not be necessary to index the entire file to answer the necessary type requests. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/722/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/719",
      "id": 3184007606,
      "node_id": "I_kwDOOje-Bs69yBm2",
      "number": 719,
      "title": "Type narrowing fails to account for reassignment in a conditional based on an intermediate variable (aliased conditional expressions)",
      "user": {
        "login": "matthewlloyd",
        "id": 2041996,
        "node_id": "MDQ6VXNlcjIwNDE5OTY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2041996?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/matthewlloyd",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-06-27T20:20:36Z",
      "updated_at": "2026-01-08T19:41:33Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nTy fails to correctly narrow the type of a variable when a `is None` check is stored in an intermediate boolean variable, and the original variable is then reassigned within a conditional block that uses that boolean.\n\nIn the example below, `int_or_none` starts as `int | None`. A boolean `is_none` is created to store the result of `int_or_none is None`. Inside an `if is_none:` block, `int_or_none` is reassigned to an `int`. After this conditional block, the type of `int_or_none` is guaranteed to be `int`. However, Ty still considers its type to be `int | None`, leading to a false positive `invalid-argument-type` error.\n\nOther type checkers like Pyright correctly narrow the type in this scenario.\n\n#### Minimal Reproducible Example\n\n```python\nimport random\n\n\ndef return_int_or_none() -> int | None:\n    if random.randint(0, 1):\n        return 1\n    return None\n\ndef take_int_only(must_be_int: int):\n    pass\n\nint_or_none: int | None = return_int_or_none()\nis_none = int_or_none is None\nif is_none:\n    int_or_none = 1\n\n# At this point, int_or_none is guaranteed to be an `int`.\n# If it was None, it was reassigned to 1.\n# If it was an int, it remains an int.\ntake_int_only(int_or_none)\n```\n\n#### Current Behavior (Ty's Output)\n\nTy incorrectly reports an error, failing to narrow the type of `int_or_none`.\n\n```shell\n$ uvx ty check test.py\nWARN ty is pre-release software and not ready for production use. Expect to encounter bugs, missing features, and fatal errors.\nerror[invalid-argument-type]: Argument to function `take_int_only` is incorrect\n  --> test.py:17:15\n   |\n15 |     int_or_none = 1\n16 | # At this point, int_or_none is guaranteed to be an `int`.\n17 | take_int_only(int_or_none)\n   |               ^^^^^^^^^^^ Expected `int`, found `int | None`\n   |\ninfo: Function defined here\n  --> test.py:9:5\n   |\n 7 |     return None\n 8 |\n 9 | def take_int_only(must_be_int: int):\n   |     ^^^^^^^^^^^^^ ---------------- Parameter declared here\n10 |     pass\n   |\ninfo: rule `invalid-argument-type` is enabled by default\n\nFound 1 diagnostic\n```\n\n#### Expected Behavior\n\nTy should recognize that after the conditional block, the variable `int_or_none` can only be of type `int` and should not raise an error.\n\nFor comparison, Pyright correctly handles this control flow and reports no errors:\n\n```shell\n$ pyright test.py\n0 errors, 0 warnings, 0 informations\n```\n\n#### Command and Settings\n\nThe command used was `uvx ty check <filename>.py` with default settings.\n\n#### Playground Link\n\nThis issue can be reproduced in the Ty playground here:\n\n[https://play.ty.dev/eba9c0b6-0443-492f-be34-b8eea7d795c2](https://play.ty.dev/eba9c0b6-0443-492f-be34-b8eea7d795c2)\n\n### Version\n\nty 0.0.1-alpha.12",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/719/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/716",
      "id": 3183222795,
      "node_id": "I_kwDOOje-Bs69vCAL",
      "number": 716,
      "title": "GC AST nodes & `exported_names`",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-06-27T15:30:52Z",
      "updated_at": "2025-06-30T07:34:36Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The `exported_names(file)` query is only called when another module imports `file` with a star import. Otherwise, the query never runs. \n\nThis introduces a problem with how we garbage collected AST nodes because the basic assumption is that it's fine to collect AST nodes when `check_file` completes because all queries for that file are now \"pre-warmed\". \n\nThere are a few options here:\n\n1. We accept that we might need to re-parse because it isn't that common\n2. We use salsa's specify feature (or something else) to set the `exported_names` result after building the semantic index (and deriving the information from the semantic index). \n3. We always call `exported_names` as part of `check_files` (that's probably undecired because it is unnecessary in most cases\n4. ... something else?\n\nThe downside of setting the `exported_names` result for each module is that we have to store extra information for many modules that never get star-imported, which seems wasteful. \n\n\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/716/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/708",
      "id": 3178414457,
      "node_id": "I_kwDOOje-Bs69csF5",
      "number": 708,
      "title": "Ty does not support conditional imports",
      "user": {
        "login": "Matt-Ord",
        "id": 55235095,
        "node_id": "MDQ6VXNlcjU1MjM1MDk1",
        "avatar_url": "https://avatars.githubusercontent.com/u/55235095?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Matt-Ord",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-06-26T09:10:53Z",
      "updated_at": "2025-11-14T15:24:04Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nLoving the progress on ty \nJust thought I would flag this issue I was having when type checking conditional imports, which fails on Implicit shadowing of class `SymmetricalLogScale`. Is there another way do this that would be allowed under ty rules?\n\n```py\nfrom __future__ import annotations\n\nfrom typing import TYPE_CHECKING, Literal\n\nimport numpy as np\n\ntry:\n    from matplotlib.scale import LinearScale, LogScale, SymmetricalLogScale\n\nexcept ImportError:\n    # Implicit shadowing of class `SymmetricalLogScale` here\n    LinearScale, LogScale, SymmetricalLogScale = (None, None, None)\n\n\nif TYPE_CHECKING:\n    from matplotlib.scale import ScaleBase\n\n\nScale = Literal[\"symlog\", \"linear\", \"log\"]\n\n\ndef get_scale_with_lim(\n    scale: Scale,\n    lim: tuple[float, float],\n) -> ScaleBase:\n    if LinearScale is None or LogScale is None or SymmetricalLogScale is None:\n        msg = \"Matplotlib is not installed. Please install it with the 'plot' extra.\"\n        raise ImportError(msg)\n    match scale:\n        case \"linear\":\n            return LinearScale(axis=None)\n        case \"symlog\":\n            max_abs = max([np.abs(lim[0]), np.abs(lim[1])])\n            return SymmetricalLogScale(\n                axis=None,\n                linthresh=1 if max_abs <= 0 else 1e-3 * max_abs,\n            )\n        case \"log\":\n            max_abs = max([np.abs(lim[0]), np.abs(lim[1])])\n            return LogScale(axis=None)\n    # Also does not infer that this is unreachable\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/708/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/693",
      "id": 3171124552,
      "node_id": "I_kwDOOje-Bs69A4VI",
      "number": 693,
      "title": "Support for `executionEnvironments` in monorepos",
      "user": {
        "login": "tim-x-y-z",
        "id": 86600518,
        "node_id": "MDQ6VXNlcjg2NjAwNTE4",
        "avatar_url": "https://avatars.githubusercontent.com/u/86600518?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/tim-x-y-z",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 11,
      "created_at": "2025-06-24T09:14:14Z",
      "updated_at": "2025-12-17T20:58:38Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Hi team,\n\nFirst of all, thank you for the excellent work on `ty`!\n\nIn our monorepo setup, we rely on `executionEnvironments` in `pyrightconfig.toml` to isolate type checking per service and control `extraPaths` in a scoped, declarative way. Here's a simplified version of our config:\n\n```toml\n[tool.pyright]\ninclude = [\".\"]\nextraPaths = [\"shared/lib\"]\nexecutionEnvironments = [\n  { root = \"service-a\", extraPaths = [\"service-a/src\", \"shared/lib\"] },\n  { root = \"service-b\", extraPaths = [\"service-b/src\", \"shared/lib\"] },\n  { root = \"frontend\", extraPaths = [\"frontend/src\", \"service-a/src\", \"shared/lib\"] }\n]\n```\nThis pattern makes it easy to work in a monorepo with multiple isolated services while keeping path resolution clean and explicit.\nIt would be incredibly helpful if `ty` supported something similar!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/693/reactions",
        "total_count": 2,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 1,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/691",
      "id": 3166299408,
      "node_id": "I_kwDOOje-Bs68ueUQ",
      "number": 691,
      "title": "Support single-file scripts with PEP 723 metadata",
      "user": {
        "login": "thoughtpolice",
        "id": 3416,
        "node_id": "MDQ6VXNlcjM0MTY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3416?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/thoughtpolice",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 37,
      "created_at": "2025-06-22T21:47:05Z",
      "updated_at": "2026-01-06T00:52:07Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "I looked a bit through the bug tracker but didn't see this: I have a few projects that I develop with `uv run --script`, along with PEP 723 inline metadata for my dependencies. I find this is really nice for simple scripts in my monorepo:\n\n```python\n#!/usr/bin/env -S uv run --script\n# /// script\n# requires-python = \"==3.12.*\"\n# dependencies = [\n#     \"mlx>=0.26.1\",\n#     \"mlx-lm>=0.25.2\",\n#     \"urllib3==1.26.6\",\n#     \"click>=8.0.0\",\n#     \"rich>=13.0.0\",\n#     \"prompt-toolkit>=3.0.0\",\n# ]\n# ///\n...\n```\n\nHowever, if I execute `uvx ty check foo.py` on these files, then the following occurs:\n\n```\naseipp@navi bizarro % uvx ty check bizarro.py\nWARN ty is pre-release software and not ready for production use. Expect to encounter bugs, missing features, and fatal errors.\nerror[unresolved-import]: Cannot resolve imported module `click`\n  --> bizarro.py:31:8\n   |\n30 | # Third-party imports\n31 | import click\n   |        ^^^^^\n... many more errors follow ...\n```\n\nI think this can obviously be avoided by using `pyproject.toml`, but it would be wonderful if ty could also work for this case too. I have a bunch of one-shot scripts like this that I occasionally need to import a library with, so it'd be nice to not require more project scaffolding. Q: Perhaps it should also require a `--script` argument to `ty check` to make it more uniform with `uv run`?\n\n> P.S. Many thanks for uv/ruff/ty!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/691/reactions",
        "total_count": 32,
        "+1": 32,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/690",
      "id": 3165375153,
      "node_id": "I_kwDOOje-Bs68q8qx",
      "number": 690,
      "title": "better narrowing from conditional terminals and NoReturn calls",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "oconnor663",
        "id": 860932,
        "node_id": "MDQ6VXNlcjg2MDkzMg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/860932?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/oconnor663",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "oconnor663",
          "id": 860932,
          "node_id": "MDQ6VXNlcjg2MDkzMg==",
          "avatar_url": "https://avatars.githubusercontent.com/u/860932?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/oconnor663",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-06-21T19:57:34Z",
      "updated_at": "2026-01-09T15:29:51Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently, a narrowing constraint is just an expression. We don't support boolean connectives of narrowing constraints -- we just track an implicit AND of multiple narrowing constraints per definition. Since we have no way to represent an `OR` of narrowing constraints, when we merge control flow paths we just discard any narrowing constraint that is present on only one path.\n\nThis means that we fail to preserve some valid narrowing information in a case like this one:\n\n```py\nclass A: pass\nclass B: pass\nclass C: pass\n\ndef _(x: A | B | C):\n    if isinstance(x, A):\n        pass\n    elif isinstance(x, B):\n        pass\n    else:\n        return\n\n    reveal_type(x)  # should be `A | (B & ~A)`, we currently reveal `A | B | C`\n```\n\nhttps://play.ty.dev/21e55e75-9ca4-46ca-ac62-24f1a6abecb1\n\nThis also impacts narrowing from `NoReturn` calls (e.g. `sys.exit`) in a conditional branch.\n\nThis problem also blocks progress on #626, since the fix for that issue requires \"breaking up\" a test expression like `if isinstance(x, A) or isinstance(x, B)` into two separate narrowing constraints (where today it is just one narrowing constraint, with the `or` handled in `narrow.rs`), and our inability to represent an `OR` of two separate narrowing constraints means that a fix for #626 regresses our current understanding of narrowing from such expressions\n\nOne way to fix this might be to reuse our TDD implementation for reachability constraints, and use it also for narrowing constraints. This could even simplify the use-def map, since it would mean we'd only need to track a single narrowing constraint per definition (it could be an AND of multiple other constraints).\n\nAn even deeper fix could be to treat every new narrowing of a definition as a new \"definition\" of that symbol, and just use visibility constraints to decide which such \"definitions\" are visible. This approach could also fix #685.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/690/reactions",
        "total_count": 15,
        "+1": 14,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/688",
      "id": 3164773988,
      "node_id": "I_kwDOOje-Bs68op5k",
      "number": 688,
      "title": "`invalid-return-type` false positive on constrained generic",
      "user": {
        "login": "gusutabopb",
        "id": 4231387,
        "node_id": "MDQ6VXNlcjQyMzEzODc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4231387?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/gusutabopb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-06-21T05:11:09Z",
      "updated_at": "2026-01-09T13:46:07Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nSimilar to #621, but doesn't involve narrowing/`isinstance` checks:\n\n```python\nimport polars as pl\n\ndef with_column_x[T: pl.DataFrame | pl.LazyFrame](df: T) -> T:\n    return df.with_columns(pl.lit(True).alias(\"x\"))\n```\n\nBoth `DataFrame` and `LazyFrame` classes have a `with_columns` method that returns an object of the same type, so the above should be valid. However, `ty` complains about it:\n\n```\nReturn type does not match returned value: expected `T`, found `DataFrame | LazyFrame`\n```\n\nty doesn't complain about the following generic-less variations:\n\n```python\n# Variation 1\ndef with_column_x(df: pl.DataFrame | pl.LazyFrame) -> pl.DataFrame | pl.LazyFrame:\n    return df.with_columns(pl.lit(True).alias(\"x\"))\n```\n\n```python\n# Variation 2\ntype Frame = pl.DataFrame | pl.LazyFrame\n\ndef with_column_x(df: Frame) -> Frame:\n    return df.with_columns(pl.lit(True).alias(\"x\"))\n```\n\nThe generic-less variations however don't communicate that the return type will be exactly the same as the input type, so they have a slightly different meaning.\n\n\n### Version\n\nty 0.0.1-alpha.11 (1ae703836 2025-06-17)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/688/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/686",
      "id": 3162688299,
      "node_id": "I_kwDOOje-Bs68gssr",
      "number": 686,
      "title": "Add `--statistics` for an overview (like ruff)",
      "user": {
        "login": "Julian-J-S",
        "id": 25177421,
        "node_id": "MDQ6VXNlcjI1MTc3NDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/25177421?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Julian-J-S",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-06-20T10:04:18Z",
      "updated_at": "2025-12-18T10:50:23Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "ruff has: `ruff check --statistics` which can be very useful.\n\nI would love to see the same for ty.\n\nIntegration ruff / ty into a big repo and getting 10k+ \"errors\" is hard to manage.\nGetting some idea of how many different problems and counts would be very helpful :)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/686/reactions",
        "total_count": 5,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/676",
      "id": 3156624206,
      "node_id": "I_kwDOOje-Bs68JkNO",
      "number": 676,
      "title": "`match` over `Never`",
      "user": {
        "login": "pfaion-soundhound",
        "id": 141734669,
        "node_id": "U_kgDOCHKzDQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/141734669?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/pfaion-soundhound",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        },
        "1": {
          "id": 8645345133,
          "node_id": "LA_kwDOOje-Bs8AAAACA01_bQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type-inference",
          "name": "type-inference",
          "color": "442A97",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-06-18T12:07:08Z",
      "updated_at": "2025-11-18T16:10:33Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHey everyone,\n\nI was reading some of the issues around dealing with `Never` and decided to play around with it a bit myself on the playground to get an understanding of how `Never` is actually working.\n\nI came across the following example ([playground link](https://play.ty.dev/8892b6bf-232e-4a5c-a62a-88e69fa677fe)):\n```python\nfrom typing import Never\n\ndef f(v: Never):\n    match v:\n        case str():\n            x = input()\n        case _:\n            x = int(input())\n    reveal_type(x)     # Revealed type: `str` \n```\n\nI'm not even sure what's supposed to happen here, but I feel somewhat confident that the current behavior is wrong? Apologies if it isn't, curious to learn what the intended behavior is here!\n\nI didn't find any other issue with `match` and `Never` in the title, I hope this is not yet already known!\n\nVery excited about `ty`, thanks everyone for working on this! \n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/676/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/667",
      "id": 3152431079,
      "node_id": "I_kwDOOje-Bs675kfn",
      "number": 667,
      "title": "Prevent cascading diagnostics when using unknown type form",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "2": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-06-17T07:45:26Z",
      "updated_at": "2025-11-18T16:10:33Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We currently report multiple diagnostics in situations like the following:\n\n```py\n# Name `UnknownTypeForm` used when not defined (unresolved-reference) [Ln 1, Col 4]\n# Int literals are not allowed in this context in a type expression (invalid-type-form) [Ln 1, Col 20]\nx: UnknownTypeForm[1]\n\n\n# Name `UnknownTypeForm` used when not defined (unresolved-reference) [Ln 1, Col 4]\n# Syntax error in forward annotation: Unexpected token at the end of an expression (invalid-syntax-in-forward-annotation) [Ln 1, Col 20]\nx: UnknownTypeForm[\"some string\"]\n```\n\nThe first of these (`unresolved-reference`) is obviously fine, but I think we should suppress the other diagnostic. This can also cause false positives in unreachable code where legit type forms may be inferred as `Unknown`:\n\n```py\nassert False\n\nfrom typing_extensions import Literal\n\ndef outer():\n    # Syntax error in forward annotation: Unexpected token at the end of an expression (invalid-syntax-in-forward-annotation) [Ln 7, Col 26]\n    def inner(p: Literal[\"missing value\"]):\n        pass\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/667/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/666",
      "id": 3152086268,
      "node_id": "I_kwDOOje-Bs674QT8",
      "number": 666,
      "title": "Consider using top / bottom materialization for assignability check",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568526506,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlWqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-design",
          "name": "needs-design",
          "color": "F9D0C4",
          "default": false,
          "description": "Needs further design before implementation"
        },
        "1": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-06-17T05:12:00Z",
      "updated_at": "2025-11-18T16:10:33Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The concept of top and bottom materialization of a type was added in https://github.com/astral-sh/ruff/pull/18594.\n\n@carljm mentioned that this could potentially be used to perform assignability, especially when gradual types are involved. Formally, if we want to check whether `T` is assignable to `U`, then we could check whether `T'`, the bottom materialization (or lower bound materialization) of `T`, is a subtype of `U'`, the top materialization (or upper bound materialization) of `U`.\n\nThe main benefit here is that this would eliminate any special handling of gradual types in the subtyping check and could eliminate any potential bugs that might exists in the current assignability implementation.\n\nThis issue is to keep track of this potential change if we decide to do it.\n\nThis would still require fulfilling the TODOs that are currently present in the implementation of type materialization in `Type::materialize`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/666/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/665",
      "id": 3152060577,
      "node_id": "I_kwDOOje-Bs674KCh",
      "number": 665,
      "title": "Return intersection instead of Any for ambiguous overload match",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568526506,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlWqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-design",
          "name": "needs-design",
          "color": "F9D0C4",
          "default": false,
          "description": "Needs further design before implementation"
        },
        "1": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        },
        "2": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-06-17T04:55:21Z",
      "updated_at": "2025-11-18T16:10:32Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Consider the following example:\n\n`overloaded.pyi`:\n\n```pyi\nfrom typing import overload\nfrom typing_extensions import LiteralString\n\n@overload\ndef f(x: LiteralString) -> LiteralString: ...\n@overload\ndef f(x: str) -> str: ...\n```\n\n```py\nfrom typing import Any\nfrom typing_extensions import LiteralString\n\nfrom overloaded import f\n\ndef _(literal: LiteralString, string: str, any: Any):\n    reveal_type(f(literal))  # revealed: LiteralString\n    reveal_type(f(string))  # revealed: str\n\n    # `Any` matches both overloads, but the return types are not equivalent.\n    # Pyright and mypy both reveal `str` here, contrary to the spec.\n    reveal_type(f(any))  # revealed: Any\n```\n\nFor the last call, ty reveals `Any` while Pyright and mypy reveals `str`. The reason ty reveals `Any` is because the overload matching is ambiguous according to the spec. Here's how the algorithm detects that:\n\n1. Arity does not eliminate any overloads\n2. Type checking does not eliminate any overloads\n3. Step 3 is skipped since step 2 did not result in errors for all overloads\n4. Step 4 has no effect, since neither overload has a variadic parameter\n5. All materialization of `Any` are not assignable to either of the overloads since it could materialize into anything other than `LiteralString` or `str`. The return types of the remaining overloads are not equivalent so the overload matching is ambiguous.\n\nMore formally, at the end of step 5, before concluding that the overload matching is ambiguous, ty should check whether the return types are overlapping and return the widest type of them instead of `Any`.\n\nI'm not exactly sure if this is what Pyright / mypy does so it might be useful to hear from someone who knows about this.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/665/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/653",
      "id": 3145030236,
      "node_id": "I_kwDOOje-Bs67dVpc",
      "number": 653,
      "title": "Support narrowing generic upper bounds",
      "user": {
        "login": "thejchap",
        "id": 2475286,
        "node_id": "MDQ6VXNlcjI0NzUyODY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2475286?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/thejchap",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-06-13T23:06:27Z",
      "updated_at": "2025-11-13T07:38:25Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nNo error should be emitted on this snippet:\n\n```py\nclass A:\n    pass\n\nclass B:\n    x: int = 0\n\ndef _[C: A | B](c: C):\n    if isinstance(c, B):\n        reveal_type(c)\n        c.x = 42\n```\n\nMore discussion here: https://github.com/astral-sh/ruff/pull/18527#discussion_r2142659512\n\nExample: https://play.ty.dev/62d91bdb-cbf1-4758-8f2c-6a26722c9f47",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/653/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/645",
      "id": 3142927356,
      "node_id": "I_kwDOOje-Bs67VUP8",
      "number": 645,
      "title": "Implement name mangling semantics",
      "user": {
        "login": "pratt-fds",
        "id": 214457422,
        "node_id": "U_kgDODMhcTg",
        "avatar_url": "https://avatars.githubusercontent.com/u/214457422?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/pratt-fds",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-06-13T09:34:18Z",
      "updated_at": "2025-11-18T16:10:32Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nDunder private methods are not recognised. These methods have their names mangled on import (eg, Foo.__my_private_method becomes Foo._Foo__my_private_method), resulting in an unresolved-attribute error when validating test code\n\n![Image](https://github.com/user-attachments/assets/183640c8-e876-4f61-9ad4-badbb33d2abe)\n\n### Version\n\n0.0.1a8",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/645/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/644",
      "id": 3142446649,
      "node_id": "I_kwDOOje-Bs67Te45",
      "number": 644,
      "title": "Consider using a custom allocator",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8653735457,
          "node_id": "LA_kwDOOje-Bs8AAAACA82GIQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/memory",
          "name": "memory",
          "color": "e99695",
          "default": false,
          "description": "related to memory usage"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-06-13T06:39:48Z",
      "updated_at": "2025-12-31T15:27:30Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Mainly, mi-malloc. Considerations here are\n\n* peak memory consumption\n* long-running memory consumption (fragmentation)\n* performance\n\nCC: @ibraheemdev ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/644/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/639",
      "id": 3138869375,
      "node_id": "I_kwDOOje-Bs67F1h_",
      "number": 639,
      "title": "`tuple[Any]` should be assignable to `Never`",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 28,
      "created_at": "2025-06-12T05:13:01Z",
      "updated_at": "2025-11-18T16:10:31Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n`tuple[Any]` should be assignable to `Never` because `Never` is one of the materialization of `tuple[Any]` and it is a subtype of `Never` so as per the [consistent subtyping relation](https://typing.python.org/en/latest/spec/concepts.html#the-assignable-to-or-consistent-subtyping-relation) it should be assignable.\n\nPlayground: https://play.ty.dev/48729f64-0a5a-4f06-82e4-39aa671872d8\n\n```py\nfrom typing import Any, Never\nfrom ty_extensions import static_assert, is_assignable_to\n\n# This is false but should be true\nstatic_assert(is_assignable_to(tuple[Any], Never))\n```\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/639/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/635",
      "id": 3136721774,
      "node_id": "I_kwDOOje-Bs669pNu",
      "number": 635,
      "title": "Support auto-fixing diagnostics",
      "user": {
        "login": "asmith26",
        "id": 6988036,
        "node_id": "MDQ6VXNlcjY5ODgwMzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6988036?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/asmith26",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-06-11T12:53:04Z",
      "updated_at": "2025-11-18T16:10:31Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nI've briefly explored using https://github.com/facebook/pyre-check for automatically fixing static type problems. \n\nJust wondering if there are plans to support this feature in `ty`? Thanks!\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/635/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/632",
      "id": 3135374328,
      "node_id": "I_kwDOOje-Bs664gP4",
      "number": 632,
      "title": "[panic] expression should belong to this 'UnpackResult' and 'Unpacker' should have inferred a type for it",
      "user": {
        "login": "correctmost",
        "id": 134317971,
        "node_id": "U_kgDOCAGHkw",
        "avatar_url": "https://avatars.githubusercontent.com/u/134317971?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/correctmost",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        },
        "2": {
          "id": 9775918749,
          "node_id": "LA_kwDOOje-Bs8AAAACRrCunQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fuzzer",
          "name": "fuzzer",
          "color": "cf5f2e",
          "default": false,
          "description": "Issues surfaced by fuzzing ty"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-06-11T03:38:24Z",
      "updated_at": "2026-01-09T14:41:58Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nty crashes on this fuzzed code:\n\n```python\n-a,f'{a}'=\n```\n\n```\nerror[panic]: Panicked at crates/ty_python_semantic/src/types/infer.rs:3529:26 when checking `c.py`: `expression should belong to this `UnpackResult` and `Unpacker` should have inferred a type for it`\n```\n\n### Version\n\nty 0.0.1-alpha.8",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/632/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/631",
      "id": 3135203270,
      "node_id": "I_kwDOOje-Bs6632fG",
      "number": 631,
      "title": "one thread can spend a long time chasing a dependency trail",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-06-11T01:20:52Z",
      "updated_at": "2025-12-19T08:23:03Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Observed running ty on large codebases: our current parallelism model splits work among threads at the granularity of \"checking a file\", where \"a file\" is a file the user has requested be checked.\n\nIn a case where there are many third-party dependencies, or many first-party files that were excluded from checking, the task of \"check one file\" can potentially encompass a very deep traversal of a large chain of dependency modules, causing one thread to become very busy for a long time while other threads sit idle.\n\nIdeally, we would avoid this scenario. One possibility is that semantic indexing collects dependency modules and names depended on from those modules, and these also become part of a task list that we distribute to threads that would otherwise be idle.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/631/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/630",
      "id": 3135184807,
      "node_id": "I_kwDOOje-Bs663x-n",
      "number": 630,
      "title": "report unsafe operator type on subclasses",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-06-11T01:08:12Z",
      "updated_at": "2025-11-18T16:10:31Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### summary\n\n```py\nclass A:\n    def __add__(self, other: A) -> int:\n        return 1\n\n\nclass B(A):\n    def __radd__(self, other: A) -> str:\n        return \"B\"\n\n\ndef f(a1: A, a2: A):\n    x: int = a1 + a2\n    print(x)  # static: int, runtime: \"B\"\n\nf(A(), B())\n```\n\nhere, the right hand subtype rule will be used, and `B.__radd__` will be called first, resulting in `\"B\"`, not `1`\n\nif the supertype additionally defines a `__radd__`, then it can be incompatible with it's `__add__`, as all the information about the operation will be known\n\nto ensure safety we must report when the subtypes `__radd__` in incompatable with the supertypes `__add__`, when the super type does not define a `__radd__`. but the right hand subtype rule complicates things...\n\n## i see two options here:\n\n\n1. always report a subtypes incompatible right hand operator as unsafe (mypy mode):\n    ```py\n    class A:\n         def __add__(self, other: object) -> int: ...\n         def __radd__(self, other: object) -> str: ...\n    \n    class B(A):\n         def __radd__(self, other: object) -> str: ... # error: unsafe due to right hand subtype rule\n\n    def f(a1: A = A(), a2: A = B()):\n        # always assume the right hand can not declare an incompatible type\n        a1 + a2  # static: int, runtime: str, but that's okay, we gave an error\n    ``` \n\n2. always form a union when the lower bound is not known (my preference):\n    ```py\n    class A:\n         def __add__(self, other: object) -> int: ...\n         def __radd__(self, other: object) -> str: ...\n    \n         def __sub__(self, other: object) -> int: ...\n\n         def __or__(self, other: object) -> int: ...\n\n    class B(A):\n         def __radd__(self, other: object) -> str: ... # no error, valid override of A.__radd__\n\n         def __rsub__(self, other: object) -> Literal[1]: ... # not error, compatiable with A.__add__\n\n         def __ror__(self, other: object) -> str: ...  # error, incompatible with A.__or__\n\n    def f(a1: A = A(), a2: A = B()):\n        # when we don't know what `a2` is\n        a1 + a2  # static: int | str, runtime: str\n\n        # we definitely know that rhs is a subtype of lhs\n        A() + B()  # static: str, runtime: str\n\n        # we definitely know that rhs is not a subtype of lhs\n        a1 + A()  # static: int, runtime: int\n    ```\n\ni think the second option is more powerful and expressive, and supports more usecases without overly widening types. and can also be enhanced when this insight can be implemented to specialise these cases\n\n## this also applies to inplace operators\n```py\nclass A:\n    def __add__(self, other: A) -> int:\n        return 1\nclass B(A):\n    def __iadd__(self, other: A) -> str:   # expect error: `__iadd__` must be compatable with `A.__add__`, as `A` does not define `__iadd__`\n        return \"a\"\n\ndef f(a1: A, a2: A):\n    a = a1\n    a += a2\n    print(a)  # static: int, runtime: \"a\"\nf(B(), A())\n```\nnote that the righthand subtype rule applies __after__ `__iadd__`, so this case is much more straightforward to support",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/630/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/629",
      "id": 3135172798,
      "node_id": "I_kwDOOje-Bs663vC-",
      "number": 629,
      "title": "report unsafe `__get__` return types",
      "user": {
        "login": "KotlinIsland",
        "id": 65446343,
        "node_id": "MDQ6VXNlcjY1NDQ2MzQz",
        "avatar_url": "https://avatars.githubusercontent.com/u/65446343?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/KotlinIsland",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "1": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-06-11T00:58:26Z",
      "updated_at": "2025-11-18T16:10:30Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\ndescriptors can be unsafe:\n\n```py\nclass A: \n    pass\n\nclass B(A):\n    def __get__(self, *_) -> 1:\n        return 1\n\nclass C:\n    a: A = B()\n\nC.a  # static: A, runtime: 1\n```\n\nwe can avoid this by reporting an error on the signature of `__get__`: \"`__get__`s return type must be assignable to the super classes `__get__` (defaulting to the type of the superclass in it's absense)\"\n\nthe same applies to `__set__`\n\n(from #600)\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/629/reactions",
        "total_count": 6,
        "+1": 6,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/628",
      "id": 3134907523,
      "node_id": "I_kwDOOje-Bs662uSD",
      "number": 628,
      "title": "Assignment narrowing doesn't work with descriptor",
      "user": {
        "login": "max-muoto",
        "id": 41130755,
        "node_id": "MDQ6VXNlcjQxMTMwNzU1",
        "avatar_url": "https://avatars.githubusercontent.com/u/41130755?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/max-muoto",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        },
        "1": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-06-10T21:40:32Z",
      "updated_at": "2025-07-23T22:53:14Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nTake this simple example\n\n```python\n@dataclasses.dataclass\nclass Container:\n    x: int = 3\n    y: int | None = None\n\n\nx = Container()\nx.y = x.y or 34\nreveal_type(x.y) # Revealed type: `int & ~AlwaysFalsy`\n```\n\n`ty` is able to infer that is both an integer and non-falsey. However, `y` is a descriptor this behavior no-longer works:\n\n```python\nfrom __future__ import annotations\n\nfrom typing import Any, Self, overload, reveal_type, cast\n\nimport dataclasses\n\n\nclass Descriptor[T]:\n    def __get__(self, obj: Any, owner: Any) -> T:\n        return cast(T, 3)\n    def __set__(self, obj: Any, value: T) -> None: ...\n\n\n@dataclasses.dataclass\nclass Container:\n    x: int = 3\n    y: Descriptor[int | None] = Descriptor()\n\n\nx = Container()\nx.y = x.y or 34\nreveal_type(x.y) # Revealed type is `int | None`, Pyright would infer `int`.\n```\n\nTy playground: https://play.ty.dev/c6e6bb7e-afe0-44e0-8ef7-a2ed60b41e28\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/628/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/626",
      "id": 3134153644,
      "node_id": "I_kwDOOje-Bs66z2Os",
      "number": 626,
      "title": "correctly model short-circuting control flow in boolean expressions",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "1": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-06-10T16:05:08Z",
      "updated_at": "2025-07-23T22:55:42Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nFor example, in [this snippet](https://play.ty.dev/337ceb56-569f-4db8-aa55-f00b635b3be3) we should not emit a `possibly-unresolved-reference` error on the use of `x` inside the `if` block, because we can only reach the inside of the `if` block in a case where the assignment expression has definitely executed:\n\n```py\ndef _(flag: bool, number: int):\n    if flag and (x := number):\n        reveal_type(x)\n```\n\n(Note that we disable `possibly-unresolved-reference` by default, so to reproduce this on the command line you'll have to use `--error possibly-unresolved-reference`.)\n\nThis was previously fixed in https://github.com/astral-sh/ruff/pull/18010, but the fix caused a large performance regression in some cases (see https://github.com/astral-sh/ty/issues/431 for details) and was reverted in https://github.com/astral-sh/ruff/pull/18150. So one useful way to approach this issue is to reapply the previous fix and explore the cause of the performance regression (and add a benchmark that would catch that regression in future.)\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/626/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/623",
      "id": 3133308127,
      "node_id": "I_kwDOOje-Bs66wnzf",
      "number": 623,
      "title": "improve typevar solving",
      "user": {
        "login": "DetachHead",
        "id": 57028336,
        "node_id": "MDQ6VXNlcjU3MDI4MzM2",
        "avatar_url": "https://avatars.githubusercontent.com/u/57028336?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/DetachHead",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dcreager",
          "id": 7499,
          "node_id": "MDQ6VXNlcjc0OTk=",
          "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dcreager",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-06-10T11:56:31Z",
      "updated_at": "2025-12-10T18:05:46Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 18,
        "completed": 6,
        "percent_completed": 33
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 1,
        "total_blocking": 1
      },
      "body": "### Summary\n\n```py\ndef safe[T](value: T | None) -> T: ...\n\n\ndef _(value: int | None):\n    reveal_type(safe(value)) # int | None\n```\nhttps://play.ty.dev/8370e070-c8b0-430a-8e42-b645793e5561\n\nit looks like `T` is being inferred as `int | None`, but it would be more convenient if it was inferred as `int`, so that the `safe` function can behave sort of like a type guard that removes `None` from types.\n\nboth [pyright](https://basedpyright.com/?typeCheckingMode=all&code=CYUwZgBAzghmIG0AqBdAFANxgGwK4gC4IkIAfCAOQHsA7EASggFoA%2BYogOi4ChfRIA%2Bphz4iASxoAXMpVoMC3CEogAnEBhA4BkgJ4AHEGljxheBowDEECZKA) and [mypy](https://mypy-play.net/?mypy=latest&python=3.12&gist=c87e6bb90e256b9e3dfd15db83195ff4) support inferring the generics this way. \n\n### Version\n\n0.0.1-alpha.8 (c1337c962 2025-06-02)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/623/reactions",
        "total_count": 14,
        "+1": 12,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 2
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/622",
      "id": 3133198750,
      "node_id": "I_kwDOOje-Bs66wNGe",
      "number": 622,
      "title": "option to ban Unknown and `Any`",
      "user": {
        "login": "DetachHead",
        "id": 57028336,
        "node_id": "MDQ6VXNlcjU3MDI4MzM2",
        "avatar_url": "https://avatars.githubusercontent.com/u/57028336?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/DetachHead",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8760037609,
          "node_id": "LA_kwDOOje-Bs8AAAACCiOQ6Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/lint",
          "name": "lint",
          "color": "a3b2aa",
          "default": false,
          "description": "Label for features that we would implement as lint rules, not core type checker features"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-06-10T11:20:42Z",
      "updated_at": "2025-11-18T16:10:30Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "opening an issue for this because it was mentioned [here](https://github.com/astral-sh/ruff/blob/161446a47a7f49b1da96e2547acdb1f963d9af10/crates/ty_python_semantic/resources/mdtest/doc/public_type_undeclared_symbols.md?plain=1#L24) and i couldn't find an existing issue for it:\n\n> Together with a possible future type-checker mode that would detect the prevalence of dynamic types, this could help developers catch such mistakes.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/622/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/621",
      "id": 3133134297,
      "node_id": "I_kwDOOje-Bs66v9XZ",
      "number": 621,
      "title": "`invalid-return-type` false positive on constrained generic when narrowing for each constraint",
      "user": {
        "login": "DetachHead",
        "id": 57028336,
        "node_id": "MDQ6VXNlcjU3MDI4MzM2",
        "avatar_url": "https://avatars.githubusercontent.com/u/57028336?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/DetachHead",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-06-10T10:59:08Z",
      "updated_at": "2025-09-05T17:21:44Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n```py\ndef foo[T: (int, str)](value: T) -> T:\n    if isinstance(value, int):\n        return 1\n    return \"\"\n```\n```\nReturn type does not match returned value: expected `T`, found `Literal[1]` (invalid-return-type) [Ln 3, Col 16]\nReturn type does not match returned value: expected `T`, found `Literal[\"\"]` (invalid-return-type) [Ln 4, Col 12]\n```\nhttps://play.ty.dev/2aab612b-e197-46d2-a47f-7a288cbe3574\n\nsince this is a constraint instead of a regular generic, this should be allowed\n\n### Version\n\n0.0.1-alpha.8 (c1337c962 2025-06-02)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/621/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/618",
      "id": 3130743701,
      "node_id": "I_kwDOOje-Bs66m1uV",
      "number": 618,
      "title": "Make `project.is_file_open` cheaper",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-06-09T16:05:19Z",
      "updated_at": "2025-07-24T17:15:23Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "`project.is_file_open` can be pretty expensive because it requires indexing all project files. The main reason for it is to check if a file isn't gitignored. \n\nThis isn't as much of a problem for the CLI where we index all files anyway, but it is somewhat costly for the VS code extension.\n\nIt would be great if `is_file_open` could determine whether a file is included simply on its path without requiring a full traversal.\n\nRelated to https://github.com/astral-sh/ty/issues/97",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/618/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/615",
      "id": 3129996262,
      "node_id": "I_kwDOOje-Bs66j_Pm",
      "number": 615,
      "title": "datetimes and dates are not substitutable but ty thinks they are",
      "user": {
        "login": "m-aciek",
        "id": 9288014,
        "node_id": "MDQ6VXNlcjkyODgwMTQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/9288014?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/m-aciek",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-06-09T11:18:29Z",
      "updated_at": "2025-11-18T16:10:30Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "```python\nfrom datetime import date, datetime\n\nif datetime.now() < date.today():\n    print(\"that's a surprise!\")\n```\n\n* What is the actual behavior/output?\nNo error!\n\n* What is the behavior/output you expect?\nA warning, since at runtime we get `TypeError: can't compare datetime.datetime to datetime.date`.\n\n`datetime` subclassing `date` is a violation of Liskov substitution principle in Python. Though I'd expect typecheckers to at least warn the developer.\n\nRelated report in mypy: https://github.com/python/mypy/issues/9015.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/615/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/606",
      "id": 3127050116,
      "node_id": "I_kwDOOje-Bs66Yv-E",
      "number": 606,
      "title": "rule to ban blanket `#ty: ignore` comments",
      "user": {
        "login": "DetachHead",
        "id": 57028336,
        "node_id": "MDQ6VXNlcjU3MDI4MzM2",
        "avatar_url": "https://avatars.githubusercontent.com/u/57028336?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/DetachHead",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568539448,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmJOA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/suppression",
          "name": "suppression",
          "color": "705393",
          "default": false,
          "description": "Related to supression of violations e.g. ty:ignore"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-06-07T14:02:20Z",
      "updated_at": "2025-06-07T14:04:49Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "> PGH003\n> \n> I think we should instead make it an option for ty whether blanked ignore comments are allowed or not, rather than building it into ruff \n\n _Originally posted by @MichaReiser in [#18529](https://github.com/astral-sh/ruff/issues/18529#issuecomment-2952477648)_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/606/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/592",
      "id": 3124658413,
      "node_id": "I_kwDOOje-Bs66PoDt",
      "number": 592,
      "title": "`invalid-parameter-default` error from generic with default of `None`",
      "user": {
        "login": "samuelcolvin",
        "id": 4039449,
        "node_id": "MDQ6VXNlcjQwMzk0NDk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4039449?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/samuelcolvin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 7,
      "created_at": "2025-06-06T12:35:46Z",
      "updated_at": "2025-11-13T06:33:07Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nChecking the following code\n\n```py\nfrom typing import TypeVar\n\nD = TypeVar('D')\n\n\ndef foo(x: D = None) -> D:\n    return x\n```\n\nGives\n\n```\nerror[invalid-parameter-default]: Default value of type `None` is not assignable to annotated parameter type `D`\n --> ex.py:6:9\n  |\n6 | def foo(x: D = None) -> D:\n  |         ^^^^^^^^^^^\n7 |     return x\n  |\ninfo: rule `invalid-parameter-default` is enabled by default\n```\n\nThis passes with pyright and IMHO should not cause an error.\n\nApologies if this is reported elsewhere, nothing came up with the search \"invalid-parameter-default generic\".\n\n### Version\n\nty 0.0.1-alpha.8 (c1337c962 2025-06-02)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/592/reactions",
        "total_count": 6,
        "+1": 6,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/585",
      "id": 3121020907,
      "node_id": "I_kwDOOje-Bs66Bv_r",
      "number": 585,
      "title": "Improve diagnostics (and documentation) for unresolved imports caused by editable installs that use setuptools as their build backend",
      "user": {
        "login": "SoftwareApe",
        "id": 17566442,
        "node_id": "MDQ6VXNlcjE3NTY2NDQy",
        "avatar_url": "https://avatars.githubusercontent.com/u/17566442?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/SoftwareApe",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-06-05T12:25:29Z",
      "updated_at": "2025-11-13T15:31:54Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHi,\n\nI hope this isn't a duplicate issue. I scanned through https://github.com/astral-sh/ty/issues/445 and the current open issues but didn't find it.\n\nI have some development submodules added through `uv add --editable ...`. These are found in the `tool.uv.sources` section of the `pyproject.toml`.\n\nThey seem to work fine with uv and ruff. But `ty` complains that:\n\n```\nerror[unresolved-import]: Cannot resolve imported module ...\n```\n\nPS: Amazing work from the astral team as always. This alpha version is already better than many mature python type-checkers!\n\n### Version\n\n`ty==0.0.1a8`\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/585/reactions",
        "total_count": 2,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 2,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/576",
      "id": 3114243388,
      "node_id": "I_kwDOOje-Bs65n5U8",
      "number": 576,
      "title": "strict-equality",
      "user": {
        "login": "zwing99",
        "id": 8599743,
        "node_id": "MDQ6VXNlcjg1OTk3NDM=",
        "avatar_url": "https://avatars.githubusercontent.com/u/8599743?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zwing99",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8760037609,
          "node_id": "LA_kwDOOje-Bs8AAAACCiOQ6Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/lint",
          "name": "lint",
          "color": "a3b2aa",
          "default": false,
          "description": "Label for features that we would implement as lint rules, not core type checker features"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-06-03T14:33:03Z",
      "updated_at": "2025-12-16T16:29:43Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nIs tests for strict equality on the roadmap for ty. In mypy we can check for \"strict equality\" using the `--strict-equality` flag or equivalent configuration setting. This check flags a class of error where the developer might accidentally be comparing disparate types for equality. Naively it looks like this but you can imagine more complex scenarios.\n\nExample:\n```python\nan_int: int = 42\na_str: str = \"42\"\n\nif an_int == a_str:\n    print(\"This should not print, as int and str are not equal\")\n```\n\nmypy returns:\n```\nmain.py:###: error: Non-overlapping equality check (left operand type: \"int\", right operand type: \"str\")  [comparison-overlap]\n```\n\nty does not warn or give an error and all the default ignored rules do not seem like they would capture this.\n\nAnyways, the point is me wondering if this is on ty's roadmap? It is a feature of mypy that i discovered recently and seems very valuable!\n\n### Version\n\n0.0.1-alpha.8 (c1337c962 2025-06-02)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/576/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/575",
      "id": 3114053315,
      "node_id": "I_kwDOOje-Bs65nK7D",
      "number": 575,
      "title": "Starred target expression is inferred as `Never`",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-06-03T13:45:34Z",
      "updated_at": "2025-11-14T14:34:50Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Random thing I noticed while playing around with this branch locally just now: do you know why `Never` is given as the inlay type on the playground here? (This is a local deploy of the ty playground on your branch)\r\n\r\n![image](https://github.com/user-attachments/assets/c9efc181-f47b-426f-ab2c-6c495803419a)\r\n\r\n_Originally posted by @AlexWaygood in https://github.com/astral-sh/ruff/issues/18438#issuecomment-2934413527_\r\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/575/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/562",
      "id": 3107187109,
      "node_id": "I_kwDOOje-Bs65M-ml",
      "number": 562,
      "title": "Report invalid arbitrary-length tuple forms",
      "user": {
        "login": "MatthewMckee4",
        "id": 119673440,
        "node_id": "U_kgDOByISYA",
        "avatar_url": "https://avatars.githubusercontent.com/u/119673440?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MatthewMckee4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-06-01T12:31:23Z",
      "updated_at": "2025-11-14T14:36:44Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "From the typing spec: https://typing.python.org/en/latest/spec/tuples.html#tuple-type-form, we currently do not support emitting errors for these examples:\n```py\nt1: tuple[int, ...]  # OK\nt2: tuple[int, int, ...]  # Invalid\nt3: tuple[...]  # Invalid\nt4: tuple[..., int]  # Invalid\nt5: tuple[int, ..., int]  # Invalid\nt6: tuple[*tuple[str], ...]  # Invalid\nt7: tuple[*tuple[str, ...], ...]  # Invalid\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/562/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/561",
      "id": 3107173737,
      "node_id": "I_kwDOOje-Bs65M7Vp",
      "number": 561,
      "title": "Support narrowing on tuple match cases",
      "user": {
        "login": "MatthewMckee4",
        "id": 119673440,
        "node_id": "U_kgDOByISYA",
        "avatar_url": "https://avatars.githubusercontent.com/u/119673440?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MatthewMckee4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-06-01T12:24:08Z",
      "updated_at": "2025-12-22T02:22:23Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "From the typing spec: https://typing.python.org/en/latest/spec/tuples.html#type-compatibility-rules, we currently do not support this.\n```py\ndef func(subj: tuple[int | str, int | str]):\n    match subj:\n        case x, str():\n            reveal_type(subj)  # tuple[int | str, str]\n        case y:\n            reveal_type(subj)  # tuple[int | str, int]\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/561/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/560",
      "id": 3107168847,
      "node_id": "I_kwDOOje-Bs65M6JP",
      "number": 560,
      "title": "Support narrowing on tuple length checks",
      "user": {
        "login": "MatthewMckee4",
        "id": 119673440,
        "node_id": "U_kgDOByISYA",
        "avatar_url": "https://avatars.githubusercontent.com/u/119673440?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MatthewMckee4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 10,
      "created_at": "2025-06-01T12:21:07Z",
      "updated_at": "2026-01-09T15:24:40Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "From the typing spec: https://typing.python.org/en/latest/spec/tuples.html#type-compatibility-rules, we currently do not support this.\n```py\ndef func(val: tuple[int] | tuple[str, str] | tuple[int, *tuple[str, ...], int]):\n    if len(val) == 1:\n        # Type can be narrowed to tuple[int].\n        reveal_type(val)  # tuple[int]\n\n    if len(val) == 2:\n        # Type can be narrowed to tuple[str, str] | tuple[int, int].\n        reveal_type(val)  # tuple[str, str] | tuple[int, int]\n\n    if len(val) == 3:\n        # Type can be narrowed to tuple[int, str, int].\n        reveal_type(val)  # tuple[int, str, int]\n```\nIm happy to take this on but i think that we may need to wait until we understand `tuple[int, *tuple[str, ...], int]`",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/560/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/542",
      "id": 3101372691,
      "node_id": "I_kwDOOje-Bs642zET",
      "number": 542,
      "title": "Convert tracing warnings during `site-packages` discovery to diagnostic warnings",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "2": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-05-29T20:09:04Z",
      "updated_at": "2025-11-13T06:55:19Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This file has lots of places where it emits tracing warnings if `site-packages` discovery doesn't go to plan: https://github.com/astral-sh/ruff/blob/main/crates/ty_python_semantic/src/site_packages.rs. Ideally we should convert these to warning-level diagnostics so that they're more visible to IDE users (suggested by @MichaReiser in https://github.com/astral-sh/ruff/pull/18335#discussion_r2111051215)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/542/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/541",
      "id": 3101231626,
      "node_id": "I_kwDOOje-Bs642QoK",
      "number": 541,
      "title": "Infer class specializations for class and static methods",
      "user": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-05-29T19:04:05Z",
      "updated_at": "2025-11-13T06:48:45Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We can currently infer the specialization of a generic class from its constructor methods, if they include parameters that use the class's typevars:\n\n```py\nclass C[T]:\n    def __init__(self, value: T) -> None: ...\n\nreveal_type(C(1))  # revealed: C[int]\n```\n\nWe should do the same for `@classmethod`s and `@staticmethod`s:\n\n```py\nclass C[T]:\n    @classmethod\n    def create(cls, value: T) -> C[T]: ...\n\n    @staticmethod\n    def instantiate(value: T) -> C[T]: ...\n\nreveal_type(C.create(1))  # revealed: C[int]\nreveal_type(C.instantiate(1))  # revealed: C[int]\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/541/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/536",
      "id": 3097108608,
      "node_id": "I_kwDOOje-Bs64miCA",
      "number": 536,
      "title": "uv integration",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8598724674,
          "node_id": "LA_kwDOOje-Bs8AAAACAIYgQg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/uv",
          "name": "uv",
          "color": "DE5FE9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 0,
      "created_at": "2025-05-28T12:01:17Z",
      "updated_at": "2025-11-18T16:10:29Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Detect when a project uses uv/uv is available and use it to detect the python version / virtual environment path, ... \n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/536/reactions",
        "total_count": 13,
        "+1": 13,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/534",
      "id": 3097029446,
      "node_id": "I_kwDOOje-Bs64mOtG",
      "number": 534,
      "title": "Type hierarchy",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-05-28T11:33:21Z",
      "updated_at": "2025-11-14T09:18:53Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Add support for the [type hierarchy](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_prepareTypeHierarchy) request (shows the type hierarchy of the symbol under the cursor)\n\n<img width=\"2581\" height=\"413\" alt=\"Image\" src=\"https://github.com/user-attachments/assets/c540a44f-1f19-4db4-b784-b3bb85db119d\" />",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/534/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/529",
      "id": 3096123520,
      "node_id": "I_kwDOOje-Bs64ixiA",
      "number": 529,
      "title": "Support or work-around for alternative base class declaration",
      "user": {
        "login": "dimaqq",
        "id": 662249,
        "node_id": "MDQ6VXNlcjY2MjI0OQ==",
        "avatar_url": "https://avatars.githubusercontent.com/u/662249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dimaqq",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239609,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPuQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/question",
          "name": "question",
          "color": "BFD4F2",
          "default": true,
          "description": "Asking for support or clarification"
        },
        "1": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-05-28T05:55:33Z",
      "updated_at": "2025-11-18T16:10:29Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nWe've got some code that has to support both pydantic 1 and 2 for historical reasons.\n\nIt looks like this:\n\n```py\nPYDANTIC_IS_V1 = int(pydantic.version.VERSION.split(\".\")[0]) < 2\nif PYDANTIC_IS_V1:\n    class DatabagModel(BaseModel):  # type: ignore\n        ...\nelse:\n    class DatabagModel(BaseModel):\n        ...\n```\n\nAttempting to use this model is rejected by `ty`:\n\n```py\nwarning[unsupported-base]: Unsupported class base with type `<class 'DatabagModel'> | <class 'DatabagModel'>`\n   --> lib/charms/traefik_k8s/v2/ingress.py:238:30\n    |\n238 | class IngressRequirerAppData(DatabagModel):\n    |                              ^^^^^^^^^^^^\n```\n\n\n\n### Version\n\nty 0.0.1-alpha.7 (afb20f6fe 2025-05-26)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/529/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/528",
      "id": 3095891690,
      "node_id": "I_kwDOOje-Bs64h47q",
      "number": 528,
      "title": "advanced support for template strings",
      "user": {
        "login": "InSyncWithFoo",
        "id": 122007197,
        "node_id": "U_kgDOB0WunQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/122007197?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/InSyncWithFoo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239603,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPsw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/feature",
          "name": "feature",
          "color": "a2eeef",
          "default": false,
          "description": "New feature or request"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-05-28T03:43:14Z",
      "updated_at": "2025-11-18T16:10:28Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "[PEP 750](https://peps.python.org/pep-0750/) introduces <i>template strings</i>, also known as t-strings:\n\n```python\ntemplate: Template = t'Hello {name}'\n```\n\nAccording to the PEP, this feature is expected to be used for \"safety checks, web templating, domain-specific languages, and more\".\n\n---\n\nObviously, this is a big feature and needs some design, but here are a few ideas to get things started:\n\n```python\ntype_checker = 'ty'                   # Literal['ty']\ntemplate = t'{type_checker} is fast'  # LiteralTemplate[t'{type_checker} is fast', type_checker: Literal['ty']]\n\nreveal_type(template.strings)         # tuple[Literal[''], 'is fast']\nreveal_type(template.interpolations)  # tuple[LiteralInterpolation[Literal['ty']]]\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/528/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/527",
      "id": 3095541066,
      "node_id": "I_kwDOOje-Bs64gjVK",
      "number": 527,
      "title": "Consider a strict mode for ty",
      "user": {
        "login": "nth10sd",
        "id": 488630,
        "node_id": "MDQ6VXNlcjQ4ODYzMA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/488630?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/nth10sd",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-05-27T23:53:22Z",
      "updated_at": "2025-12-31T16:47:20Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 1,
        "percent_completed": 100
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nWill ty consider having a strict mode, similar to the one found in `mypy`?\n\nAsking because `division-by-zero` was [disabled by default](https://github.com/astral-sh/ruff/pull/18220), and parsing the rules reference [to turn on everything](https://github.com/astral-sh/ty/blob/main/docs/reference/rules.md) seems less than optimal.\n\n`pyright` / `basedpyright` also has different levels of modes.\n\n### Version\n\n0.0.1-alpha.7",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/527/reactions",
        "total_count": 10,
        "+1": 10,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/523",
      "id": 3093553554,
      "node_id": "I_kwDOOje-Bs64Y-GS",
      "number": 523,
      "title": "Panic if `--typeshed` is set to a subdirectory of a first-party search path",
      "user": {
        "login": "kkpattern",
        "id": 897336,
        "node_id": "MDQ6VXNlcjg5NzMzNg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/897336?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/kkpattern",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "2": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        },
        "3": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 9,
      "created_at": "2025-05-27T11:12:13Z",
      "updated_at": "2025-06-06T16:03:39Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Reproduce step\n\n1. create a file named  `main.py` with the following content:\n\n```python\ndef add(a: int, b: int) -> int:\n    return a + b\n\nadd(1, \"2\")\n```\n\n2. Execute the following commands:\n\n```bash\ngit clone https://github.com/python/typeshed.git\ncd typeshed\ngit checkout ea39b363e02f47debdf583dd88b477e0b0bd546d\ncd ..\nty check --typeshed typeshed main.py\n```\n\nOutput:\n\n```bash\nerror[panic]: Panicked at /root/.cargo/git/checkouts/salsa-e6f3bb7c2a062968/4818b15/src/function/fetch.rs:143:25 when checking `/home/.../ty-playground/main.py`: `dependency graph cycle when querying try_call_dunder_get_(Id(6802)), set cycle_fn/cycle_initial to fixpoint iterate.\nQuery stack:\n[\n    check_types(Id(c00)),\n    infer_scope_types(Id(1000)),\n    explicit_bases_(Id(2c02)),\n    infer_deferred_types(Id(32c8)),\n    explicit_bases_(Id(2c03)),\n    infer_deferred_types(Id(50cc)),\n    explicit_bases_(Id(2c04)),\n    infer_deferred_types(Id(505e)),\n    explicit_bases_(Id(2c05)),\n    infer_deferred_types(Id(5056)),\n    infer_definition_types(Id(5014)),\n    infer_expression_types(Id(24ac)),\n    symbol_by_id(Id(2806)),\n    infer_expression_type(Id(248b)),\n    infer_expression_types(Id(248b)),\n    member_lookup_with_policy_(Id(4c01)),\n    symbol_by_id(Id(2807)),\n    infer_definition_types(Id(550b)),\n    explicit_bases_(Id(2c0c)),\n    infer_deferred_types(Id(550a)),\n    infer_definition_types(Id(5488)),\n    explicit_bases_(Id(2c15)),\n    infer_deferred_types(Id(6c8b)),\n    infer_definition_types(Id(57ca)),\n    infer_expression_types(Id(254e)),\n    try_call_dunder_get_(Id(6802)),\n    class_member_with_policy_(Id(6409)),\n    symbol_by_id(Id(280f)),\n    infer_definition_types(Id(1453)),\n    signature_(Id(4005)),\n    infer_deferred_types(Id(5019)),\n    infer_definition_types(Id(500d)),\n    infer_expression_types(Id(24a5)),\n    member_lookup_with_policy_(Id(4c12)),\n    try_call_dunder_get_(Id(6801)),\n    class_member_with_policy_(Id(6406)),\n    try_call_dunder_get_(Id(6804)),\n    class_member_with_policy_(Id(6410)),\n    class_member_with_policy_(Id(6410)),\n    infer_definition_types(Id(3b4f)),\n    try_mro_(Id(5805)),\n]`\ninfo: This indicates a bug in ty.\ninfo: If you could open an issue at https://github.com/astral-sh/ty/issues/new?title=%5Bpanic%5D, we'd be very appreciative!\ninfo: Platform: linux x86_64\ninfo: Args: [\"ty\", \"check\", \"--typeshed\", \"typeshed\", \"main.py\"]\ninfo: run with `RUST_BACKTRACE=1` environment variable to show the full backtrace information\ninfo: query stacktrace:\n   0: infer_expression_types(Id(24a5))\n             at crates/ty_python_semantic/src/types/infer.rs:223\n             cycle heads: symbol_by_id(Id(2807)) -> 0, symbol_by_id(Id(2806)) -> 0, infer_expression_type(Id(248b)) -> 0, member_lookup_with_policy_(Id(4c01)) -> 0, symbol_by_id(Id(280f)) -> 0, infer_definition_types(Id(1453)) -> 0\n   1: infer_definition_types(Id(500d))\n             at crates/ty_python_semantic/src/types/infer.rs:149\n   2: infer_deferred_types(Id(5019))\n             at crates/ty_python_semantic/src/types/infer.rs:187\n   3: signature_(Id(4005))\n             at crates/ty_python_semantic/src/types.rs:6927\n   4: infer_definition_types(Id(1453))\n             at crates/ty_python_semantic/src/types/infer.rs:149\n             cycle heads: symbol_by_id(Id(2807)) -> 0, symbol_by_id(Id(2806)) -> 0, infer_expression_type(Id(248b)) -> 0, member_lookup_with_policy_(Id(4c01)) -> 0\n   5: symbol_by_id(Id(280f))\n             at crates/ty_python_semantic/src/symbol.rs:586\n   6: class_member_with_policy_(Id(6409))\n             at crates/ty_python_semantic/src/types.rs:550\n   7: try_call_dunder_get_(Id(6802))\n             at crates/ty_python_semantic/src/types.rs:550\n   8: infer_expression_types(Id(254e))\n             at crates/ty_python_semantic/src/types/infer.rs:223\n             cycle heads: symbol_by_id(Id(2806)) -> 0, infer_expression_type(Id(248b)) -> 0, symbol_by_id(Id(2807)) -> 0, member_lookup_with_policy_(Id(4c01)) -> 0\n   9: infer_definition_types(Id(57ca))\n             at crates/ty_python_semantic/src/types/infer.rs:149\n  10: infer_deferred_types(Id(6c8b))\n             at crates/ty_python_semantic/src/types/infer.rs:187\n  11: explicit_bases_(Id(2c15))\n             at crates/ty_python_semantic/src/types/class.rs:551\n  12: infer_definition_types(Id(5488))\n             at crates/ty_python_semantic/src/types/infer.rs:149\n             cycle heads: symbol_by_id(Id(2807)) -> 0, member_lookup_with_policy_(Id(4c01)) -> 0, symbol_by_id(Id(2806)) -> 0, infer_expression_type(Id(248b)) -> 0\n  13: infer_deferred_types(Id(550a))\n             at crates/ty_python_semantic/src/types/infer.rs:187\n  14: explicit_bases_(Id(2c0c))\n             at crates/ty_python_semantic/src/types/class.rs:551\n  15: infer_definition_types(Id(550b))\n             at crates/ty_python_semantic/src/types/infer.rs:149\n  16: symbol_by_id(Id(2807))\n             at crates/ty_python_semantic/src/symbol.rs:586\n  17: member_lookup_with_policy_(Id(4c01))\n             at crates/ty_python_semantic/src/types.rs:550\n  18: infer_expression_types(Id(248b))\n             at crates/ty_python_semantic/src/types/infer.rs:223\n  19: infer_expression_type(Id(248b))\n             at crates/ty_python_semantic/src/types/infer.rs:279\n  20: symbol_by_id(Id(2806))\n             at crates/ty_python_semantic/src/symbol.rs:586\n  21: infer_expression_types(Id(24ac))\n             at crates/ty_python_semantic/src/types/infer.rs:223\n  22: infer_definition_types(Id(5014))\n             at crates/ty_python_semantic/src/types/infer.rs:149\n  23: infer_deferred_types(Id(5056))\n             at crates/ty_python_semantic/src/types/infer.rs:187\n  24: explicit_bases_(Id(2c05))\n             at crates/ty_python_semantic/src/types/class.rs:551\n  25: infer_deferred_types(Id(505e))\n             at crates/ty_python_semantic/src/types/infer.rs:187\n  26: explicit_bases_(Id(2c04))\n             at crates/ty_python_semantic/src/types/class.rs:551\n  27: infer_deferred_types(Id(50cc))\n             at crates/ty_python_semantic/src/types/infer.rs:187\n  28: explicit_bases_(Id(2c03))\n             at crates/ty_python_semantic/src/types/class.rs:551\n  29: infer_deferred_types(Id(32c8))\n             at crates/ty_python_semantic/src/types/infer.rs:187\n  30: explicit_bases_(Id(2c02))\n             at crates/ty_python_semantic/src/types/class.rs:551\n  31: infer_scope_types(Id(1000))\n             at crates/ty_python_semantic/src/types/infer.rs:122\n  32: check_types(Id(c00))\n             at crates/ty_python_semantic/src/types.rs:84\n\n\nFound 1 diagnostic\nWARN A fatal error occurred while checking some files. Not all project files were analyzed. See the diagnostics list above for details.\n```\n\nWithout the `--typeshed` ty can work correctly:\n\n```bash\nerror[invalid-argument-type]: Argument to function `add` is incorrect\n --> main.py:4:8\n  |\n2 |     return a + b\n3 |\n4 | add(1, \"2\")\n  |        ^^^ Expected `int`, found `Literal[\"2\"]`\n  |\ninfo: Function defined here\n --> main.py:1:5\n  |\n1 | def add(a: int, b: int) -> int:\n  |     ^^^         ------ Parameter declared here\n2 |     return a + b\n  |\ninfo: rule `invalid-argument-type` is enabled by default\n\nFound 1 diagnostic\n```\n\n## Version\nty 0.0.1-alpha.7\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/523/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/521",
      "id": 3093206756,
      "node_id": "I_kwDOOje-Bs64Xpbk",
      "number": 521,
      "title": "Support truthiness type narrowing for checks involving `all(…)` / `any(…)`",
      "user": {
        "login": "Julian-J-S",
        "id": 25177421,
        "node_id": "MDQ6VXNlcjI1MTc3NDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/25177421?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Julian-J-S",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8579117676,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1rybA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/narrowing",
          "name": "narrowing",
          "color": "0e8a16",
          "default": false,
          "description": "related to flow-sensitive type narrowing"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-05-27T09:05:44Z",
      "updated_at": "2026-01-05T20:17:02Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "A python concept I often see in functions is checking if a certain set of variables is not None.\n\nChecking that individually with `if not x: return` works fine.\n\nBut checking for multiple variables at a time with `if not all(...)` seems to break currently type checkers which is unfortunate.\n\n```python\ndata: dict[str, str] = {\n    \"a\": \"hello\",\n    \"b\": \"world\",\n}\n\na_val = data.get(\"a\")\nb_val = data.get(\"b\")\n\ndef test1():  # >>> This works 👍 \n    if not a_val or not b_val:\n        return\n\n    _ = a_val * 2  # ✅ \n    _ = b_val * 2  # ✅ \n\n\ndef test2():  # This breaks 💥 \n    if not all([a_val, b_val]):\n        return\n\n    _ = a_val * 2  # 🛑 \n    _ = b_val * 2  # 🛑 \n\n```\n\nAny way this could be achieved? 🤓 ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/521/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/518",
      "id": 3092168806,
      "node_id": "I_kwDOOje-Bs64TsBm",
      "number": 518,
      "title": "`ClassVar` shouldn't be allowed to contain type variables",
      "user": {
        "login": "karlicoss",
        "id": 291333,
        "node_id": "MDQ6VXNlcjI5MTMzMw==",
        "avatar_url": "https://avatars.githubusercontent.com/u/291333?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/karlicoss",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "2": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-05-26T22:58:50Z",
      "updated_at": "2025-11-13T06:48:58Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nSee \nhttps://typing.python.org/en/latest/spec/class-compat.html#classvar\n\n```\nNote that a ClassVar parameter cannot include any type variables, regardless of the level of nesting: ClassVar[T] and ClassVar[list[set[T]]] are both invalid if T is a type variable.\n```\n\n\nI find their example unnecessarily complicated, here's a simpler reproducer\n```\nfrom typing import ClassVar, reveal_type, cast\n\nclass Box[T]:\n    value: ClassVar[T] = cast(T, None) \n\nint_box = Box[int]()\nreveal_type(int_box.value)\n\nstr_box = Box[str]()\nreveal_type(str_box.value)\n```\n\nCurrently this passes, inferring conflicting types:\n```\ninfo[revealed-type]: Revealed type\n --> test_classvar.py:7:13\n  |\n6 | int_box = Box[int]()\n7 | reveal_type(int_box.value)\n  |             ^^^^^^^^^^^^^ `int`\n8 |\n9 | str_box = Box[str]()\n  |\n\ninfo[revealed-type]: Revealed type\n  --> test_classvar.py:10:13\n   |\n 9 | str_box = Box[str]()\n10 | reveal_type(str_box.value)\n   |             ^^^^^^^^^^^^^ `str`\n   |\n\nFound 2 diagnostics\n```\n\n# Expected result\nShould be rejected, e.g. mypy rejects this with `error: ClassVar cannot contain type variables  [misc]`\n\n# Relevant issues\n- perhaps somewhat relevant to https://github.com/astral-sh/ty/issues/166\n\n\n\n### Version\n\nty 0.0.1-alpha.7",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/518/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/517",
      "id": 3091943277,
      "node_id": "I_kwDOOje-Bs64S09t",
      "number": 517,
      "title": "Add literal math support for shift operators",
      "user": {
        "login": "correctmost",
        "id": 134317971,
        "node_id": "U_kgDOCAGHkw",
        "avatar_url": "https://avatars.githubusercontent.com/u/134317971?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/correctmost",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "brandtbucher",
        "id": 40968415,
        "node_id": "MDQ6VXNlcjQwOTY4NDE1",
        "avatar_url": "https://avatars.githubusercontent.com/u/40968415?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/brandtbucher",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "brandtbucher",
          "id": 40968415,
          "node_id": "MDQ6VXNlcjQwOTY4NDE1",
          "avatar_url": "https://avatars.githubusercontent.com/u/40968415?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/brandtbucher",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 2,
      "created_at": "2025-05-26T19:35:22Z",
      "updated_at": "2025-11-18T16:10:28Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nty doesn't currently perform \"literal math\" when using the left and right shift operators:\n\n```python\nfrom typing import reveal_type\n\nreveal_type(2<<2)  # int\nreveal_type(2>>2)  # int\n```\n\nThis seems like an inconsistency given the support for other operators.  (Pyright has support for both shift operators.)\n\nThe [Python docs](https://docs.python.org/3.13/library/stdtypes.html#bitwise-operations-on-integer-types) note that \"Negative shift counts are illegal and cause a ValueError to be raised\".\n\n### Version\n\nty 0.0.1-alpha.7",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/517/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/512",
      "id": 3089735830,
      "node_id": "I_kwDOOje-Bs64KaCW",
      "number": 512,
      "title": "Intersection with `@final` generic class is incorrectly simplified to Never",
      "user": {
        "login": "JelleZijlstra",
        "id": 906600,
        "node_id": "MDQ6VXNlcjkwNjYwMA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/906600?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/JelleZijlstra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "2": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-05-26T01:12:52Z",
      "updated_at": "2025-10-06T16:56:27Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis intersection is incorrectly simplified to Never.\n\n```python\nfrom typing import TypeVar, Generic, final, reveal_type\nfrom ty_extensions import Intersection\n\nT_co = TypeVar(\"T_co\", covariant=True)\n\nclass Base(Generic[T_co]):\n    def f(self) -> T_co:\n        raise NotImplementedError\n\n@final\nclass Child(Base[T_co]):\n    pass\n\ndef f(x: Intersection[Base[int], Child[object]]):\n    reveal_type(x)  # Never, expect Child[int]\n```\n\nhttps://play.ty.dev/06b37356-775c-4128-ab4a-7a65e159bc87\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/512/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/509",
      "id": 3089361479,
      "node_id": "I_kwDOOje-Bs64I-pH",
      "number": 509,
      "title": "Annotated assignments of non-name targets are not checked",
      "user": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "2": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-05-25T15:03:54Z",
      "updated_at": "2025-08-15T01:50:31Z",
      "closed_at": null,
      "author_association": "COLLABORATOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThe following code passes without any errors.\n\n```python\nl = []\nl[0]: int = \"foo\"\n\nclass C:\n    declared: int\n\nc = C()\nc.unresolved: int = \"foo\"\nc.declared: str = \"foo\"\n```\n\nI thought these should be reported as type errors, but it seems that mypy and pyright treat such annotated assignments as \"semantically invalid\" and report errors without type checking.\nIn any case, since the current version of ty does not report any problems for this, some kind of fix should be made. In particular, the lack of checking for attribute existence (`c.unresolved`) is an obvious bug that should be fixed.\n\nsee also: https://github.com/microsoft/pylance-release/issues/537\n\n### Version\n\nty 0.0.1a6 (ruff@83a036960)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/509/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/2410",
      "id": 3796156081,
      "node_id": "I_kwDOOje-Bs7iRL6x",
      "number": 2410,
      "title": "Server: Mono-repo support",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 15,
      "created_at": "2025-05-25T11:19:49Z",
      "updated_at": "2026-01-09T10:24:54Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It's not uncommon to have a single repository that contains both the frontend and backend (Python) code. As a user, I want to be able to have the ty configuration in the backend folder. See\n\nhttps://github.com/astral-sh/ty-vscode/issues/40\nhttps://github.com/astral-sh/ty-vscode/issues/17\n\nWe could\n\n* Scan for configurations in sub-directories if the root folder has no explicit `ty` configuration\n* Add an option",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/2410/reactions",
        "total_count": 30,
        "+1": 30,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/504",
      "id": 3088749688,
      "node_id": "I_kwDOOje-Bs64GpR4",
      "number": 504,
      "title": "Option for not stripping `Annotated` metadata.",
      "user": {
        "login": "carrascomj",
        "id": 46683255,
        "node_id": "MDQ6VXNlcjQ2NjgzMjU1",
        "avatar_url": "https://avatars.githubusercontent.com/u/46683255?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carrascomj",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-05-24T21:24:33Z",
      "updated_at": "2025-12-06T01:17:50Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "As a user, I would like to be able to see the [`Annotated` ](https://docs.python.org/3/library/typing.html#typing.Annotated)metadata on hover.\n\n### Current behavior\n\nThe first argument is correctly interpreted as the type but the metadata is stripped on hover.\n\n![Image](https://github.com/user-attachments/assets/ba249ae0-62d4-4fe9-8609-37c149887f56)\n\n### Desired behavior\n\nThe user should be able to configure `ty` to use it (maybe not by default). My particular use case is `jaxtyping` for annotating tensor shapes. If I use `ty` (or `pyright`, which [likely won't implement it](https://github.com/microsoft/pyright/discussions/6528#discussioncomment-7654251)), I don't see the shape on hover, which is very helpful for programming with tensors in [pytorch](https://pytorch.org/), [jax](https://docs.jax.dev/en/latest/), etc.\n\nFor example, (this is with pyright):\n\n![Image](https://github.com/user-attachments/assets/d4a49ac1-b64e-4041-8418-618a764e910f)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/504/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/498",
      "id": 3086784785,
      "node_id": "I_kwDOOje-Bs63_JkR",
      "number": 498,
      "title": "CLI docs: auto-annotate defaults",
      "user": {
        "login": "brainwane",
        "id": 842790,
        "node_id": "MDQ6VXNlcjg0Mjc5MA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/842790?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/brainwane",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239594,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/documentation",
          "name": "documentation",
          "color": "0075ca",
          "default": true,
          "description": "Improvements or additions to documentation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-05-23T15:39:07Z",
      "updated_at": "2025-05-23T15:41:44Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "`docs/reference/cli.md` lists a few options that are lacking documentation of default values (e.g.  `--color`).\r\n\r\nPer @carljm in https://github.com/astral-sh/ruff/issues/18246#issuecomment-2899218319 , \r\n\r\n> This seems like useful information for users to have in the command reference; should we just add it in the comment at https://github.com/astral-sh/ruff/blob/d098118e37be9437345d527c29a5aeea91b676a6/crates/ty/src/args.rs#L289, or is there a way to update the script so that we automatically output this in the reference based on the existing `[#default]` annotation?\r\n\r\nSeems to me it would be more elegant to do the latter, if feasible.\r\n\r\n(Sub-issue within #149; followup to #478)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/498/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/497",
      "id": 3086566697,
      "node_id": "I_kwDOOje-Bs63-UUp",
      "number": 497,
      "title": "Streaming diagnostics",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-05-23T14:26:41Z",
      "updated_at": "2025-08-15T12:10:08Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This has been on my mind for some time. I also briefly discussed it with @MichaReiser some weeks ago. The progress bar that we have looks cool, but it would be even more useful if we could start showing diagnostics as early as possible [^1]. This reduces latency (time to first diagnostic), but also has the potential to reduce the overall runtime (time until all diagnostics are printed), I believe. This is because we could start with the IO-heavy work of printing out the diagnostics while the CPU-intense work is still ongoing, instead of waiting for it to be completely over [^2]. The obvious problem here is determinism. We currently sort all diagnostics before printing them. So we cannot simply send the diagnostics over a channel and print them out as soon as we generate them. But there might be some strategy where streaming is still possible. We know all files (that can produce diagnostics) before we start. So if we order diagnostics by file, we could print out all diagnostics of file `a/a/a.py` if no other file comes before it in the list of ordered files. It's questionable if this would work in practice though. `a/a/a.py` might be a file that depends on a lot of other files [^3]. It might therefore take a long time until we can start to even print out the diagnostics of the very first file.\n\nAnother option might be to give up on determinism in the output. Users probably value performance over a deterministic sort order. And we could still have a `--sorted` CLI flag or similar that restores determinism at the cost of performance.\n\n[^1]: I think it's technically possible to do this in addition to showing the progress bar.\n[^2]: Another thing that we could look into is to render the diagnostics on the worker threads (instead of the receiving main thread). Right now, if there are many diagnostics, we do quite a lot of single-threaded work at the end of a ty run.\n[^3]: That actually makes me think if we can tune performance by changing the order in which we check files. Maybe it makes sense to check files in `deeply/nested/folders` first, as they are more likely to be dependencies of other files? Or the other way around?",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/497/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/496",
      "id": 3086375317,
      "node_id": "I_kwDOOje-Bs639lmV",
      "number": 496,
      "title": "Add `--no-config-file` option",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568526506,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlWqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-design",
          "name": "needs-design",
          "color": "F9D0C4",
          "default": false,
          "description": "Needs further design before implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-05-23T13:26:02Z",
      "updated_at": "2025-06-05T04:58:52Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Similar to uv's `--no-config-file` option\n\n```\nAvoid discovering configuration files (`pyproject.toml`, `uv.toml`).\n\n          Normally, configuration files are discovered in the current directory, parent directories, or user configuration directories.\n\n          [env: UV_NO_CONFIG=]\n```\n\nDepends on https://github.com/astral-sh/ruff/pull/18083",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/496/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/493",
      "id": 3085370750,
      "node_id": "I_kwDOOje-Bs635wV-",
      "number": 493,
      "title": "Tuples of unions, Unions of tuples",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 7,
      "created_at": "2025-05-23T06:48:21Z",
      "updated_at": "2025-10-06T08:19:12Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "An example that I got from [this post](https://discuss.python.org/t/specify-that-assert-type-checks-for-equivalence/92967). As mentioned there, it's probably hard to support this in full generality, but it seems like those base cases should maybe be handled:\n\n```py\nfrom ty_extensions import static_assert, is_equivalent_to, is_assignable_to, is_subtype_of\n\nstatic_assert(is_equivalent_to(tuple[int | str], tuple[int] | tuple[str]))  # currently fails\nstatic_assert(is_assignable_to(tuple[int | str], tuple[int] | tuple[str]))  # currently fails\nstatic_assert(is_subtype_of(tuple[int | str], tuple[int] | tuple[str]))  # currently fails\n```\nhttps://play.ty.dev/fa049103-bd97-454c-891e-92bda33973a5",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/493/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/492",
      "id": 3084948425,
      "node_id": "I_kwDOOje-Bs634JPJ",
      "number": 492,
      "title": "Different specializations of the same generic are considered different bases",
      "user": {
        "login": "InSyncWithFoo",
        "id": 122007197,
        "node_id": "U_kgDOB0WunQ",
        "avatar_url": "https://avatars.githubusercontent.com/u/122007197?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/InSyncWithFoo",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "2": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-05-23T02:14:17Z",
      "updated_at": "2025-11-13T06:58:27Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Consider the following innocent-looking example ([playground](https://play.ty.dev/c7337e08-b762-456f-a988-91812a6e296e)):\n\n```python\nclass StrConverter[T](Protocol):\n    def convert(self, original: T, /) -> str: ...\n\nclass NumberToStrConverter(StrConverter[int], StrConverter[float]):\n    def convert(self, original: int | float, /) -> str:\n        return str(original)\n```\n\nIt appears that ty considers `StrConverter[int]` and `StrConverter[float]` to be two different bases. This is incorrect; at runtime, the two specializations are considered the same base class, having the same [`origin`](https://docs.python.org/3/library/typing.html#typing.get_origin), and so the class definition fails:\n\n```text\nTypeError: duplicate base class StrConverter\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/492/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/491",
      "id": 3084345912,
      "node_id": "I_kwDOOje-Bs6312I4",
      "number": 491,
      "title": "Assume (with mypy/pyright) that a Callable ClassVar is a bound method descriptor",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 14,
      "created_at": "2025-05-22T19:22:56Z",
      "updated_at": "2025-12-19T11:21:03Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently we assume that Callable types do not implement the descriptor protocol -- specifically, the bound method descriptor behavior that function and lambda objects implement, to bind the first argument to the receiver instance.\n\nThis is a reasonable choice, since the Callable type definitely includes objects which are not bound method descriptors (e.g. you can assign a callable instance or protocol or staticmethod object -- none of which are bound method descriptors -- to a callable type). If you consider the bound-method descriptor behavior as additional behavior that can be provided by a subtype, then our current behavior makes the most sense: `Callable` implies only `__call__`, function and lambda objects are subtypes of Callable which add the `__get__` method as well.\n\nThe problem with this is that adding a bound-method `__get__` is Liskov-incompatible -- it changes the behavior in an incompatible way, that makes the bound method descriptor object not safely substitutable (as a class attribute) for a callable with the same signature that is not a bound-method descriptor.\n\nThis is a fundamental problem with the Python type system, and there's not much we can do about it. Any choice we make in this area will be unsound; the only sound option would be a wholesale change to Python typing to (in general) not consider adding a `__get__` method to be a Liskov-compatible change in a subtype; this is not practical.\n\nGiven that we can't be sound, we may want to at least be _compatible_ and match the behavior of existing type checkers. I've created this \"test suite\" to check the behavior of existing type checkers:\n\n<details>\n\n```py\nfrom typing import Callable, ClassVar, assert_type\n\nclass Descriptor:\n    def __get__(self, instance: object, owner: type) -> int:\n        return 1\n\ndef impl(self: \"C\", x: int) -> int:\n    return x\n\nclass C:\n    descriptor: Descriptor = Descriptor()\n    classvar_descriptor: ClassVar[Descriptor] = Descriptor()\n\n    callable: Callable[[\"C\", int], int] = impl\n    classvar_callable: ClassVar[Callable[[\"C\", int], int]] = impl\n    static_callable: Callable[[\"C\", int], int] = staticmethod(impl)\n    static_classvar_callable: ClassVar[Callable[[\"C\", int], int]] = staticmethod(impl)\n\nc = C()\n\n# Establish a baseline that type checkers generally respect the descriptor\n# protocol for values assigned in the class body, whether annotated with\n# ClassVar or no:\nassert_type(c.descriptor, int)\nassert_type(c.classvar_descriptor, int)\n\n# The calls and assignments below are all correct per runtime behavior;\n# if a type checker errors on any of them and expects a different\n# signature, that indicates unsound behavior. Note that the static_*\n# variants are annotated exactly the same as the non-static variants,\n# but have different runtime behavior, because Callable does not\n# distinguish descriptor vs non-descriptor. Thus, it's unlikely that any\n# type checker can get all of these correct.\n\n# If a type-checker assumes that callable types are not descriptors,\n# it will (wrongly) error on these calls and assignments:\n\nc.callable(1)\nc.classvar_callable(1)\n\nx1: Callable[[int], int] = c.callable\nx1(1)\nx2: Callable[[int], int] = c.classvar_callable\nx2(1)\n\n# If a type-checker assumes that callable types are descriptors,\n# it will (wrongly) error on these calls and assignments:\n\nc.static_callable(C(), 1)\nc.static_classvar_callable(C(), 1)\n\ny1: Callable[[\"C\", int], int] = c.static_callable\ny1(C(), 1)\ny2: Callable[[\"C\", int], int] = c.static_classvar_callable\ny2(C(), 1)\n\n# Now let's look specifically at annotated `__call__` attributes:\n\ndef cm_impl(self: \"CallMethod\", x: int) -> int:\n    return x\n\nclass CallMethod:\n    __call__: Callable[[\"CallMethod\", int], int] = cm_impl\n\ndef cmc_impl(self: \"CallMethodClassVar\", x: int) -> int:\n    return x\n\nclass CallMethodClassVar:\n    __call__: ClassVar[Callable[[\"CallMethodClassVar\", int], int]] = cmc_impl\n\ndef cms_impl(self: \"CallMethodStatic\", x: int) -> int:\n    return x\n\nclass CallMethodStatic:\n    __call__: Callable[[\"CallMethodStatic\", int], int] = staticmethod(cms_impl)\n\ndef cmcs_impl(self: \"CallMethodClassVarStatic\", x: int) -> int:\n    return x\n\nclass CallMethodClassVarStatic:\n    __call__: ClassVar[Callable[[\"CallMethodClassVarStatic\", int], int]] = staticmethod(cmcs_impl)\n\n# Again, all of these are correct per runtime behavior; type checker\n# errors indicate an unsound interpretation:\n\n# Type checkers which assume callables are not descriptors will (wrongly)\n# error on these:\n\nCallMethod()(1)\ncm: Callable[[int], int] = CallMethod()\ncm(1)\n\nCallMethodClassVar()(1)\ncmc: Callable[[int], int] = CallMethodClassVar()\ncmc(1)\n\n# Type checkers which assume callables are descriptors will (wrongly)\n# error on these:\n\nCallMethodStatic()(CallMethodStatic(), 1)\ncms: Callable[[\"CallMethodStatic\", int], int] = CallMethodStatic()\ncms(CallMethodStatic(), 1)\n\n\nCallMethodClassVarStatic()(CallMethodClassVarStatic(), 1)\ncmcs: Callable[[\"CallMethodClassVarStatic\", int], int] = CallMethodClassVarStatic()\ncmcs(CallMethodClassVarStatic(), 1)\n\n```\n\n</details>\n\nIt seems that both [pyright](https://pyright-play.net/?strict=true&code=GYJw9gtgBALgngBwJYDsDmUkQWEMoDCAhgDYlEBGJApgDSHkDOjAakSPUc9XgPrwJqAKCEBjJoygARao1EgkCGLgBcQqBqgATasCi9eaajAMAKRtRLB6qRjCIpR1FVDAUAVtVEx6YAO4oPC4C1ACUUAC0AHyYKDBqmolQIMYAriAoUACMIjp6WAgk5pbALgBEBGX0AB4uqDDh0bHx6popMOmZ1SLiXJIECZo6cgpKqtKy8orKIFAAvBMj07imoa0avcwAbuy8w1NjIC4EEmwgANoyS4cAuvOLBzOrIomipORUzoTvlDTn5xUqs0bjY4ncFgUSOsoJtGDsQLw3mRfl8Tn0zudiMjPv9AaCYCDgeDMNgoYk7EQYEhRIifp9jnS-gDKvjCfViRSqaIIMYABZgLSmSFrcn2LmIiTw2nYmjHU7sTGM6i4lnA1kcsXUnkwfmC4U9e4EZ5CADEUAAohSqEhGLyoEQoBQuJZUNRYLzKbBEG7RLyvABrHiSIyBEDvODJWSCbzut37UYzU1QBDgZSiMAkKDAXBQHYkVKye3MJBoQJaWKxmESR0CuD0Px%2BnU8e0oFBgMXUct%2BJA6pNo5hnVyzNtqPo8EwhUyiAB08eWHGaazHfEnM9hUrnh3xayTABU-TD3pIHOW%2BiWUDy4pIKJZ-PaUvayDDcCkY4JZiBUnEsG6bx6tkguAANxJkgegOiEMJ%2BqIgazDw4AgJIYCZA4EZgHoTbQCeUDUNU0YwMe2hgcAPDUHESaMOelLpHQ7qeqgWjUpShZfowYBfuWf5EABuDTlAABy7ZujqnpNlAnLUrwABUSbwkgDgEfeboOG2HblrhRDeCQEZiYwRA8kWlZtigEQSaIubsPJV60EmFCpPg-5xsRpFxMkX5UgZXE8QuN5vKkFjfDKcZgIWqlJoxdioGgqQ2nam4zLmkjGRE8W8VA%2B7%2BTYMAAOSSF%2BJBIIG2l0fgqFJpBvoBs2byZEYpVPuhsYBemICvjA04iGaACS4FeoIESVTBzZ9KkPKSCJ%2BBIh8NB9YW7Buqp2iTAmuCMDZZo9lA3ZPqYfjgOg2nhPBObIU1PpHi2p7FqWl4EWoYjTlNKKmFkaxrpKuxPZ8L07tUWQMkF-zsqy9xrkqQh-T9EMAEwA9NyrnMDwKg49H0Il9NAw1DSY9fas0DdBsFFowo2FhNh5BbNx4PqliHrZg%2BDbZmu37Wgh04a1J2ZE2zUXdhZ43WRd09NOZnSvDphGqE9CvQ9Yvrp9SqS6sMs7nA-2BfDKpAkj7Io-L4Pq8r0vZGscCw5rKLa6yIMLDO8to%2BLKJCObxuq51Al3jQOWSCQYBgP64nRmBTFkBGnoqe2zHlgABgYU0GDH9owDACh2TAsj3XkMIQLwkLFFY5RYiQACyfICkCtSLpEMT1IMGjtJ0UDdGI1bF2XOoCvX%2BjiwYcNW8y7wd7qOtgrbOd56SuS6DnNL5xYhdQBUQ-l1o-asOwld1HEjS13E3eNxkzc9G3K%2Bd2v8pHNC8fvH3DDogqxcD8vZDDwK69nKPBLqqDEBz1PQhs7ckYJPQoBdShL3bqvAAypqUQW9q5NDrtCQ%2BXQT59E1m-LQsDKTUm7jfMgd8n44kHq-GBcCv5sjBPcMy2pdRTggCA-UgCZ7clEEw0k4Ci5n11B-dgOCuQIPqLvZoB80hHxbrCTBq8%2BEgAEXg6%2BvdeBygfhcYhTIX6lxkZfeR8CbZEhoXAuhAoGHsNASQHcZoACCaAiCoE4A1DCfoArzWfK1Lw%2BB3xuW-J5ag-5AIgCArNKCVUQBJmOohWIjE3gZxbFAVi7EUDlnqDwFMxhcHIXumaXc3oQlDUiQ2akdoRoGQxnNB8i1aaSCZlAFmyE2ZwDWGaCJrhubOOcCIKB59VhQ25P3EhutqELC6fQt6EBsYjPfpfHpss2H9KZIMgkhoeFTNUc8Nh2Nsm5MGrBapvIinE1JhTeG1M4zLXnNUpAO09r1MOuEzmsxTo8w6UISZ2C4E9LebolWpsxCMPmQjTRWDdGUPHl8j5YzGCSxWe83Bogfmy06TC2R3zQjQrIefFFEL3ZsMYAClUyKdEUP0XrYZhLVGor%2Bew9FWjMVErhQitYQA) and [mypy](https://mypy-play.net/?mypy=latest&python=3.12&gist=2935159a8183d1929c8a78b1e586059b) implement a heuristic in which callable class attributes explicitly annotated as `ClassVar` are assumed to be bound-method descriptors, and those not so annotated are assumed not to be. (Note that this distinction is specific to callable types; both mypy and pyright are in general happy to execute the descriptor protocol on class attributes not explicitly annotated as `ClassVar`.) Mypy appears to add one additional wrinkle: `__call__` attributes annotated with a callable type are always assumed to be bound-method descriptors, unlike other attributes. Pyright doesn't implement this bit.\n\n[Pyrefly](https://pyrefly.org/sandbox/?code=GYJw9gtgBALgngBwJYDsDmUkQWEMoDCAhgDYlEBGJApgDSHkDOjAakSPUc9XgPrwJqAKCEBjJoygARao1EgkCGLgBcQqBqgATasCi9eaajAMAKRtRLB6qRjCIpR1FVDAUAVtVEx6YAO4oPC4C1ACUUAC0AHyYKDBqmolQIMYAriAoUACMIjp6WAgk5pbALgBEBGX0AB4uqDDh0bHx6popMOmZ1SLiXJIECZo6cgpKqtKy8orKIFAAvBMj07imoa0avcwAbuy8w1NjIC4EEmwgANoyS4cAuvOLBzOrIomipORUzoTvlDTn5xUqs0bjY4ncFgUSOsoJtGDsQLw3mRfl8Tn0zudiMjPv9AaCYCDgeDMNgoYk7EQYEhRIifp9jnS-gDKvjCfViRSqaIIMYABZgLSmSFrcn2LmIiTw2nYmjHU7sTGM6i4lnA1kcsXUnkwfmC4U9e4EZ5CADEUAAohSqEhGLyoEQoBQuJZUNRYLzKbBEG7RLyvABrHiSIyBEDvODJWSCbzut37UYzU1QBDgZSiMAkKDAXBQHYkVKye3MJBoQJaWKxmESR0CuD0Px+nU8e0oFBgMXUct+JA6pNo5hnVyzNtqPo8EwhUyiAB08eWHGaazHfEnM9hUrnh3xayTABU-TD3pIHOW+iWUDy4pIKJZ-PaUvayDDcCkY4JZiBUnEsG6bx6tkguAANxJkgegOiEMJ+qIgazDw4AgJIYCZA4EZgHoTbQCeUDUNU0YwMe2hgcAPDUHESaMOelLpHQ7qeqgWjUpShZfowYBfuWf5EABuDTlAABy7ZujqnpNlAnLUrwABUSbwkgDgEfeboOG2HblrhRDeCQEZiYwRA8kWlZtigEQSaIubsPJV60EmFCpPg-5xsRpFxMkX5UgZXE8QuN5vKkFjfDKcZgIWqlJoxdioGgqQ2nam4zLmkjGRE8W8VA+7+TYMAAOSSF+JBIIG2l0fgqFJpBvoBs2byZEYpVPuhsYBemICvjA04iGaACS4FeoIESVTBzZ9KkPKSCJ+BIh8NB9YW7Buqp2iTAmuCMDZZo9lA3ZPqYfjgOg2nhPBObIU1PpHi2p7FqWl4EWoYjTlNKKmFkaxrpKuxPZ8L07tUWQMkF-zsqy9xrkqQh-T9EMAEwA9NyrnMDwKg49H0Il9NAw1DSY9fas0DdBsFFowo2FhNh5BbNx4PqliHrZg+DbZmu37Wgh04a1J2ZE2zUXdhZ43WRd09NOZnSvDphGqE9CvQ9Yvrp9SqS6sMs7nA-2BfDKpAkj7Io-L4Pq8r0vZGscCw5rKLa6yIMLDO8to+LKJCObxuq51Al3jQOWSCQYBgP64nRmBTFkBGnoqe2zHlgABgYU0GDH9owDACh2TAsj3XkMIQLwkLFFY5RYiQACyfICkCtSLpEMT1IMGjtJ0UDdGI1bF2XOoCvX+jiwYcNW8y7wd7qOtgrbOd56SuS6DnNL5xYhdQBUQ-l1o-asOwld1HEjS13E3eNxkzc9G3K+d2v8pHNC8fvH3DDogqxcD8vZDDwK69nKPBLqqDEBz1PQhs7ckYJPQoBdShL3bqvAAypqUQW9q5NDrtCQ+XQT59E1m-LQsDKTUm7jfMgd8n44kHq-GBcCv5sjBPcMy2pdRTggCA-UgCZ7clEEw0k4Ci5n11B-dgOCuQIPqLvZoB80hHxbrCTBq8+EgAEXg6+vdeBygfhcYhTIX6lxkZfeR8CbZEhoXAuhAoGHsNASQHcZoACCaAiCoE4A1DCfoArzWfK1Lw+B3xuW-J5ag-5AIgCArNKCVUQBJmOohWIjE3gZxbFAVi7EUDlnqDwFMxhcHIXulA8+qwobcn7iQ3W1CFjZPoW9CA2NSnv0vrk2WbCClMiKQSQ0PDqmqOeGwyprTsFwNyVUnpuDRAq1NmIRhDSEaaKwboyh49+m6I6YwyW3T5km1liIfpsiVlLLIefTZvTVnlPYeMlU3S9mDJmcjEppydH7NGew7ZWjdk3MGcM2WQA) currently implements the same thing [we do](https://play.ty.dev/b60ede58-af47-437a-8af0-a492f792095a): callables are never assumed to be bound-method descriptors.",
      "closed_by": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/491/reactions",
        "total_count": 4,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 2,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/487",
      "id": 3083486089,
      "node_id": "I_kwDOOje-Bs63ykOJ",
      "number": 487,
      "title": "improve diagnostics for C extension modules without stubs",
      "user": {
        "login": "johnniemorrow",
        "id": 15838644,
        "node_id": "MDQ6VXNlcjE1ODM4NjQ0",
        "avatar_url": "https://avatars.githubusercontent.com/u/15838644?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/johnniemorrow",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-05-22T13:57:20Z",
      "updated_at": "2025-11-24T17:16:48Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nHi ty-team,\n\nI was trying to fix up some unresolved-attribute errors reported by ty related to lxml.etree in [lxml](https://pypi.org/project/lxml/).\n\nReducing it down to just an import statement, ty doesn't seem to be able to see lxml.etree:\n\n```bash\n$ cat use_lxml.py \nimport lxml.etree\n\n```\n\n\n```bash\n$ ty check use_lxml.py \nWARN ty is pre-release software and not ready for production use. Expect to encounter bugs, missing features, and fatal errors.\nerror[unresolved-import]: Cannot resolve imported module `lxml.etree`\n --> use_lxml.py:1:8\n  |\n1 | import lxml.etree\n  |        ^^^^^^^^^^\n  |\ninfo: make sure your Python environment is properly configured: https://github.com/astral-sh/ty/blob/main/docs/README.md#python-environment\ninfo: rule `unresolved-import` is enabled by default\n\nFound 1 diagnostic\n\n``` \n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/487/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/483",
      "id": 3082445207,
      "node_id": "I_kwDOOje-Bs63umGX",
      "number": 483,
      "title": "Incorrect `invalid-return-type` in type-preserving generic mapping function branching on runtime type",
      "user": {
        "login": "shilch",
        "id": 11890358,
        "node_id": "MDQ6VXNlcjExODkwMzU4",
        "avatar_url": "https://avatars.githubusercontent.com/u/11890358?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/shilch",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-05-22T08:03:34Z",
      "updated_at": "2025-11-18T16:10:28Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nFollowing function is flagged incorrectly(?) my ty:\n\n```python\ndef func[T](val: T) -> T:\n    if type(val) is str:\n        return ''\n    return val\n```\n\nThe following output is generated:\n\n```\nerror[invalid-return-type]: Return type does not match returned value\n --> test.py:1:24\n  |\n1 | def func[T](val: T) -> T:\n  |                        - Expected `T` because of return type\n2 |     if type(val) is str:\n3 |         return ''\n  |                ^^ expected `T`, found `Literal[\"\"]`\n4 |     return val\n  |\ninfo: rule `invalid-return-type` is enabled by default\n```\n\nThis behavior is consistent with mypy but looks erroneous: https://github.com/python/mypy/issues/12989#issuecomment-1691226161\n\n### Version\n\nty 0.0.1-alpha.6",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/483/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/475",
      "id": 3081058873,
      "node_id": "I_kwDOOje-Bs63pTo5",
      "number": 475,
      "title": "Is there some way we can support setuptools-style editable installs?",
      "user": {
        "login": "pythonweb2",
        "id": 32141163,
        "node_id": "MDQ6VXNlcjMyMTQxMTYz",
        "avatar_url": "https://avatars.githubusercontent.com/u/32141163?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/pythonweb2",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 7,
      "created_at": "2025-05-21T18:15:12Z",
      "updated_at": "2025-11-24T08:19:29Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nThis issues exists in other type checkers (e.g. https://github.com/python/mypy/issues/13392), and I can see it exists here as well.\n\nWhen I install an editable dependency, in this case using uv as my package manager, I get a whole bunch of `unresolved-import` issues. What I had to do with mypy was this:\n\n```\n[[tool.mypy.overrides]]\nmodule = [\n    \"editable_1.*\",\n    etc...\n]\nignore_missing_imports = true\n```\n\nMainly I'm just wondering if you are planning on supporting resolving editable dependencies, or at least being able to ignore these errors in a targeted manner, as opposed to disabling the check entirely.\n\nThanks for the work on the new exciting project!\n\n### Version\n\nty 0.0.1-alpha.6 (f11c6012d 2025-05-20)",
      "closed_by": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/475/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/471",
      "id": 3080330629,
      "node_id": "I_kwDOOje-Bs63mh2F",
      "number": 471,
      "title": "Persistent caching",
      "user": {
        "login": "serjflint",
        "id": 4900246,
        "node_id": "MDQ6VXNlcjQ5MDAyNDY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4900246?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/serjflint",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239603,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPsw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/feature",
          "name": "feature",
          "color": "a2eeef",
          "default": false,
          "description": "New feature or request"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "ibraheemdev",
        "id": 34988408,
        "node_id": "MDQ6VXNlcjM0OTg4NDA4",
        "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ibraheemdev",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "ibraheemdev",
          "id": 34988408,
          "node_id": "MDQ6VXNlcjM0OTg4NDA4",
          "avatar_url": "https://avatars.githubusercontent.com/u/34988408?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/ibraheemdev",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 6,
      "created_at": "2025-05-21T13:55:00Z",
      "updated_at": "2025-11-18T16:10:27Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nHello! Thank you for your great work and I am very excited about ty.\n\nWe have a large codebases and we have a declarative dependency graph. We run mypy for each node and store its .mypy_cache for later use in leaf nodes. Will it be possible to use file cache in `ty` between runs for even more performance?\n\n### Version\n\n0.0.1a3",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/471/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/462",
      "id": 3077593056,
      "node_id": "I_kwDOOje-Bs63cFfg",
      "number": 462,
      "title": "Create separate representations for specialized and unspecialized function literals",
      "user": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-05-20T16:24:48Z",
      "updated_at": "2025-11-14T14:42:09Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We currently represent \"class literals\" and \"class types\" differently, which differ in how they handle generic classes. For a generic class, the class literal is unspecialized, and the class type is specialized.\n\nWe did not do the same thing for functions, thinking that it wasn't needed since specialized functions are ephemeral, only needed for the duration of checking a particular call of the specialized function. This is not true, though, for a method of a generic class, which should have the specialization of the class applied to its signature. (It's possible to \"persist\" this \"generic\" function via e.g. `C[int].method`.)\n\nWe should update the function representation to encode the same distinction. This will help with the property test failure in https://github.com/astral-sh/ty/issues/459.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/462/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/455",
      "id": 3074498522,
      "node_id": "I_kwDOOje-Bs63QR_a",
      "number": 455,
      "title": "Failed to parse pyvenv.cfg file on MacOS",
      "user": {
        "login": "Skylion007",
        "id": 2053727,
        "node_id": "MDQ6VXNlcjIwNTM3Mjc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2053727?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Skylion007",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 6,
      "created_at": "2025-05-19T17:05:12Z",
      "updated_at": "2025-11-14T14:43:04Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\n`ty 0.0.1-alpha.5 (3b726d87a 2025-05-17)`\n\nContents of pyvenv.cfg\n```\nhome = /usr/local/Cellar/python@3.9/3.9.1_8/Frameworks/Python.framework/Versions/3.9\nimplementation = CPython\nversion_info = 3.9.1.final.0\nvirtualenv = 20.4.2\ninclude-system-site-packages = false\nbase-prefix = /usr/local/Cellar/python@3.9/3.9.1_8/Frameworks/Python.framework/Versions/3.9\nbase-exec-prefix = /usr/local/Cellar/python@3.9/3.9.1_8/Frameworks/Python.framework/Versions/3.9\nbase-executable = /usr/local/opt/python@3.9/bin/python3.9\n```\n\nlogs:\n```\n2025-05-19 13:02:29.541067 WARN ty is pre-release software and not ready for production use. Expect to encounter bugs, missing features, and fatal errors.\n2025-05-19 13:02:29.691439 DEBUG Version: 0.0.1-alpha.5 (3b726d87a 2025-05-17)\n2025-05-19 13:02:29.691521 DEBUG Architecture: x86_64, OS: macos, case-sensitive: case-insensitive\n2025-05-19 13:02:29.691559 DEBUG Searching for a project in '/Users/agokaslan/git/pytorch'\n2025-05-19 13:02:29.691944 DEBUG Resolving requires-python constraint: `>=3.9`\n2025-05-19 13:02:29.69197 DEBUG Resolved requires-python constraint to: 3.9\n2025-05-19 13:02:29.692004 DEBUG Project without `tool.ty` section: '/Users/agokaslan/git/pytorch'\n2025-05-19 13:02:29.69202 DEBUG Searching for a user-level configuration at `/Users/agokaslan/.config/ty/ty.toml`\n2025-05-19 13:02:29.692044 INFO Defaulting to python-platform `darwin`\n2025-05-19 13:02:29.692062 INFO Python version: Python 3.9, platform: darwin\n2025-05-19 13:02:29.692079 DEBUG Adding first-party search path '/Users/agokaslan/git/pytorch'\n2025-05-19 13:02:29.692094 DEBUG Using vendored stdlib\n2025-05-19 13:02:29.692741 DEBUG Discovering site-packages paths from sys-prefix `/Users/agokaslan/venvs/ai_habitat_brew_py3` (`VIRTUAL_ENV` environment variable')\n2025-05-19 13:02:29.692805 DEBUG Attempting to parse virtual environment metadata at '/Users/agokaslan/venvs/ai_habitat_brew_py3/pyvenv.cfg'\n```\n\nError:\n```\nty failed\n  Cause: Invalid search path settings\n  Cause: Failed to discover the site-packages directory: Failed to parse the pyvenv.cfg file at /Users/agokaslan/venvs/ai_habitat_brew_py3/pyvenv.cfg because the following error was encountered when trying to resolve the `home` value to a directory on disk: No such file or directory (os error 2)\n```\n\nTis a shame because the previous version worked great too.\n\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/455/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/452",
      "id": 3074167403,
      "node_id": "I_kwDOOje-Bs63PBJr",
      "number": 452,
      "title": "Improve docs for how to configure settings in the playground",
      "user": {
        "login": "danielhollas",
        "id": 9539441,
        "node_id": "MDQ6VXNlcjk1Mzk0NDE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/9539441?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/danielhollas",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239594,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/documentation",
          "name": "documentation",
          "color": "0075ca",
          "default": true,
          "description": "Improvements or additions to documentation"
        },
        "1": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "2": {
          "id": 8568562675,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rnj8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/playground",
          "name": "playground",
          "color": "1C71A4",
          "default": false,
          "description": "A playground-specific issue"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2025-05-19T15:05:15Z",
      "updated_at": "2025-05-19T15:52:41Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "What it says on the tin",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/452/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/449",
      "id": 3073857063,
      "node_id": "I_kwDOOje-Bs63N1Yn",
      "number": 449,
      "title": "ty should error on Union syntax in function definition without annotations import in Python 3.9",
      "user": {
        "login": "metaist",
        "id": 1476702,
        "node_id": "MDQ6VXNlcjE0NzY3MDI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1476702?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/metaist",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-05-19T13:27:43Z",
      "updated_at": "2025-11-14T14:44:28Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nSplitting this off from #437. Although `UnionType` was introduced in Python 3.10, it is possible to use the union syntax in function definitions (but not in type aliases or elsewhere) in Python 3.9 if you include `from __future__ import annotations`\n\n`mypy` catches this; `ty` does not.\n\nhttps://play.ty.dev/5c47f2d5-ef8c-4d2f-b227-f93178b29e57\n\n```python\ndef f(x: int|str) -> None: ...\n```\n\n```bash\n$ uvx --python 3.9 mypy --strict test.py\ntest.py:1: error: X | Y syntax for unions requires Python 3.10  [syntax]\nFound 1 error in 1 file (checked 1 source file)\n\n$ uvx ty check --python-version 3.9 test.py\nAll checks passed!\n```\nhttps://play.ty.dev/23b020e7-4d07-49d7-9671-9918244dad1c\n\n```python\nfrom __future__ import annotations\ndef f(x: int|str) -> None: ...\n```\n\n```bash\n$ uvx --python 3.9 mypy --strict test.py\nSuccess: no issues found in 1 source file\n\n$ uvx ty check --python-version 3.9 test.py\nAll checks passed!\n```\n\n### Version\n\nty 0.0.1-alpha.5 (4ad13f2 2025-05-17)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/449/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/419",
      "id": 3068135902,
      "node_id": "I_kwDOOje-Bs624Ane",
      "number": 419,
      "title": "[playground] Tracing",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8568562675,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rnj8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/playground",
          "name": "playground",
          "color": "1C71A4",
          "default": false,
          "description": "A playground-specific issue"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-05-16T07:02:18Z",
      "updated_at": "2025-05-16T07:02:37Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Add a way to enable tracing in the playground (`?trace=true` or `?trace=salsa=trace` URL?)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/419/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/418",
      "id": 3068134862,
      "node_id": "I_kwDOOje-Bs624AXO",
      "number": 418,
      "title": "[playground] Download ZIP button",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8568562675,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rnj8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/playground",
          "name": "playground",
          "color": "1C71A4",
          "default": false,
          "description": "A playground-specific issue"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-05-16T07:01:49Z",
      "updated_at": "2025-05-16T07:01:49Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For easier local reproduction, add a download as zip button that downloads all files as a zip archive. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/418/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/409",
      "id": 3066703377,
      "node_id": "I_kwDOOje-Bs62yi4R",
      "number": 409,
      "title": "improve diagnostics for other sources of failed calls to overloaded routines",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        },
        "2": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-05-15T15:45:47Z",
      "updated_at": "2025-11-14T14:45:30Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This issue builds off of #274. The task here is to improve diagnostics for calls to overloaded routines that aren't \"normal\" function or method calls. In particular, https://github.com/astral-sh/ruff/pull/18122 improved diagnostics for function/method calls, but didn't cover any other cases.\n\nOne such notable case is just\n\n```python\ntype()\n```\n\nWhich currently has this diagnostic:\n\n```python\nerror[no-matching-overload]: No overload of class `type` matches arguments\n --> main.py:1:1\n  |\n1 | type()\n  | ^^^^^^\n  |\ninfo: rule `no-matching-overload` is enabled by default\n\nFound 1 diagnostic\n```\n\nCompare that with\n\n```python\nfrom typing import overload\n\n@overload\ndef f(x: int) -> int: ...\n\n@overload\ndef f(x: str) -> str: ...\n\ndef f(x: int | str) -> int | str:\n    return x\n\nf(b\"foo\")\n```\n\nand these diagnostics:\n\n```\nerror[no-matching-overload]: No overload of function `f` matches arguments\n  --> main.py:12:1\n   |\n10 |     return x\n11 |\n12 | f(b\"foo\")\n   | ^^^^^^^^^\n   |\ninfo: First overload defined here\n --> main.py:4:5\n  |\n3 | @overload\n4 | def f(x: int) -> int: ...\n  |     ^^^^^^^^^^^^^^^^\n5 |\n6 | @overload\n  |\ninfo: Possible overloads for function `f`:\ninfo:   (x: int) -> int\ninfo:   (x: str) -> str\ninfo: Overload implementation defined here\n  --> main.py:9:5\n   |\n 7 | def f(x: str) -> str: ...\n 8 |\n 9 | def f(x: int | str) -> int | str:\n   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n10 |     return x\n   |\ninfo: rule `no-matching-overload` is enabled by default\n\nFound 1 diagnostic\n```\n\nIdeally, the existing diagnostic code path could be used for other cases:\n\nhttps://github.com/astral-sh/ruff/blob/69393b2e6ee1eec4fc69906f8f6514994218e3b3/crates/ty_python_semantic/src/types/call/bind.rs#L1123-L1127\n\nSpecifically, those other cases can be found here:\n\nhttps://github.com/astral-sh/ruff/blob/466021d5e1793ca30e0d860cb1cd27e32f5233aa/crates/ty_python_semantic/src/types/call/bind.rs#L1504-L1523\n\nRef https://github.com/astral-sh/ty/issues/274#issuecomment-2881856028\n\ncc @dhruvmanila ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/409/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/406",
      "id": 3065756528,
      "node_id": "I_kwDOOje-Bs62u7tw",
      "number": 406,
      "title": "ty should error on possibly unbound variable usage after exception, but allow guarded access via `locals()` check",
      "user": {
        "login": "diego-pm",
        "id": 99246556,
        "node_id": "U_kgDOBeph3A",
        "avatar_url": "https://avatars.githubusercontent.com/u/99246556?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/diego-pm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        },
        "1": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-05-15T10:28:11Z",
      "updated_at": "2025-11-18T16:10:28Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "ty currently does not detect possible unbound variables in a try-except block, as show in the following example:\n\n```python\nfrom typing import reveal_type\n\ndef could_raise() -> None: ...\ndef foo() -> str: ...  # ty: ignore[invalid-return-type]\n\ntry:\n    could_raise()\n    a = foo()\n    could_raise()\nexcept:\n    reveal_type(a)  # str\n    print(a)  # should error because 'a' is possibly unbound\n    if \"a\" in locals():\n        reveal_type(a)  # str\n        print(a)  # should pass\n```\n\nAlso, the guards `\"a\" in locals()` or `\"a\" in globals()` should allow accessing the variable wihout error.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/406/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/399",
      "id": 3064669755,
      "node_id": "I_kwDOOje-Bs62qyY7",
      "number": 399,
      "title": "`ty self update`",
      "user": {
        "login": "billy-doyle",
        "id": 50842911,
        "node_id": "MDQ6VXNlcjUwODQyOTEx",
        "avatar_url": "https://avatars.githubusercontent.com/u/50842911?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/billy-doyle",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-05-15T02:02:12Z",
      "updated_at": "2025-11-13T07:31:57Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Question\n\nHaving used uv since 0.1.x, when `uv self update` was added, made it so easy to test all the new and fun changes in each new version released at breakneck pace.\n\nUnsure if `ty self` is a desired api, but if it is like in uv https://github.com/astral-sh/uv/blob/b326bb92a0a2aabc1fb4f12b8d5fa8265a3b3693/crates/uv-cli/src/lib.rs#L572, would enjoy having this added in the early dev.\n\n### Version\n\nty 0.0.1-alpha.2 (59c45cc60 2025-05-14)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/399/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/391",
      "id": 3063901307,
      "node_id": "I_kwDOOje-Bs62n2x7",
      "number": 391,
      "title": "improve diagnostic context for unsupported-operator",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-05-14T18:06:21Z",
      "updated_at": "2025-11-14T14:47:36Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When we get `unsupported-operator` errors from custom classes with custom (but somehow wrong) dunder methods defined, we currently don't offer any context on what actually went wrong in trying to make the implicit call to implement the operator.\n\nhttps://github.com/astral-sh/ty/issues/315 shows one case where this made it difficult for the user to understand the nature of the problem.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/391/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/350",
      "id": 3059413506,
      "node_id": "I_kwDOOje-Bs62WvIC",
      "number": 350,
      "title": "\"Missing self argument\" error after dynamically replacing method",
      "user": {
        "login": "shiw-yang",
        "id": 55988379,
        "node_id": "MDQ6VXNlcjU1OTg4Mzc5",
        "avatar_url": "https://avatars.githubusercontent.com/u/55988379?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/shiw-yang",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        },
        "2": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-05-13T09:41:32Z",
      "updated_at": "2025-08-15T15:16:41Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nIn the provided example, I dynamically replace the A.f1 method with f1_replace through the f2 function. After this replacement,  ty reports an error:\nNo argument provided for required parameter 'self' of function 'f1' when calling a.f1(), though the code actually runs correctly.\n\n### Steps to Reproduce:\n\n```python\n\nclass A:\n    def f1(self):\n        print(\"f1\")\n\n    def f1_replace(self):\n        print(\"replace\")\n\n    def f2(self):\n        self.f1 = self.f1_replace\n\n\na = A() \na.f1()  # No argument provided for required parameter `self` of function `f1`\na.f2()\na.f1()  # No argument provided for required parameter `self` of function `f1`\n\n```\n\nthen use `ty check` show: \n\n```bash\n$ ty check main.py\nWARN ty is pre-release software and not ready for production use. Expect to encounter bugs, missing features, and fatal errors.\nerror[missing-argument]: No argument provided for required parameter `self` of function `f1`\n  --> main.py:39:1\n   |\n38 | a = A()\n39 | a.f1()\n   | ^^^^^^\n40 | a.f2()\n41 | a.f1()\n   |\ninfo: Union variant `def f1(self) -> Unknown` is incompatible with this call site\ninfo: Attempted to call union type `(bound method A.f1() -> Unknown) | (def f1(self) -> Unknown)`\ninfo: `missing-argument` is enabled by default\n\nerror[missing-argument]: No argument provided for required parameter `self` of function `f1`\n  --> main.py:41:1\n   |\n39 | a.f1()\n40 | a.f2()\n41 | a.f1()\n   | ^^^^^^\n   |\ninfo: Union variant `def f1(self) -> Unknown` is incompatible with this call site\ninfo: Attempted to call union type `(bound method A.f1() -> Unknown) | (def f1(self) -> Unknown)`\ninfo: `missing-argument` is enabled by default\n\nFound 2 diagnostics\n```\n\n### Version\n\nty 0.0.0-alpha.8",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/350/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/338",
      "id": 3058385947,
      "node_id": "I_kwDOOje-Bs62S0Qb",
      "number": 338,
      "title": "Intersections of multiple synthesized protocols should be merged together into a single synthesized protocol",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        },
        "1": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        },
        "2": {
          "id": 8612171571,
          "node_id": "LA_kwDOOje-Bs8AAAACAVNPMw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/Protocols",
          "name": "Protocols",
          "color": "1d76db",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 0,
      "created_at": "2025-05-12T23:31:32Z",
      "updated_at": "2025-11-18T16:10:26Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961576,
        "node_id": "IT_kwDOBulz184BEhJo",
        "name": "Task",
        "description": "A specific piece of work",
        "color": "yellow",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently we reveal the following here:\n\n```py\nfrom typing import reveal_type\n\ndef f(x: object):\n    if hasattr(x, \"foo\") and hasattr(x, \"bar\"):\n        reveal_type(x)  # revealed: <Protocol with members 'foo'> & <Protocol with members 'bar'>\n```\n\nhttps://play.ty.dev/6eba5550-5bb9-4481-a3e6-7a616a09c3a3\n\nWhat would be better would be if we merged the two synthesized protocols together into a single synthesized protocol:\n\n```py\nfrom typing import reveal_type\n\ndef f(x: object):\n    if hasattr(x, \"foo\") and hasattr(x, \"bar\"):\n        reveal_type(x)  # revealed: <Protocol with members 'foo', 'bar'>\n```\n\nThis could be implemented as part of the logic in our `IntersectionBuilder`. We would only want to implement the change for synthesized protocols, not for class-based protocols.\n\nThe reasons for merging them together are:\n- the merged versions more readable in its display\n- it will probably be better for our performance\n\nHowever, I don't think we should implement this change until we start considering the types of protocol members for assignability/subtyping/equivalence. That will lead to significant changes in the inner structure of synthesized protocols.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/338/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/308",
      "id": 3054230682,
      "node_id": "I_kwDOOje-Bs62C9ya",
      "number": 308,
      "title": "Suggest type annotations or \"better\" types for existing annotations",
      "user": {
        "login": "jack-mcivor",
        "id": 10228081,
        "node_id": "MDQ6VXNlcjEwMjI4MDgx",
        "avatar_url": "https://avatars.githubusercontent.com/u/10228081?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/jack-mcivor",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-05-10T14:56:12Z",
      "updated_at": "2025-11-18T16:10:28Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Could ty analyze variable usage to suggest type annotations or \"better\" types for existing annotations?\n\nI have a couple of motivating cases in mind where annotations could be improved on function arguments:\n* Broadening collection types: for arguments typed as `list[T]`, if usage only requires common sequence/iterable operations, suggest `Sequence[T]` or `Iterable[T]`. This allows broader input types (e.g., tuples, generators).\n* Inferring literal types: for arguments typed as `str`, if the function body checks against a fixed set of string values, suggest a `Literal` type (eg. `Literal[\"bisect\", \"newton\", \"brentq\"]`). This clarifies valid inputs for callers.\n\nAFAIK existing type checking tools cannot do this - it goes beyond checking type correctness and so is probably outside the scope of most tools I know of.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/308/reactions",
        "total_count": 9,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 9,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/296",
      "id": 3052608021,
      "node_id": "I_kwDOOje-Bs618xoV",
      "number": 296,
      "title": "distinguish \"doesn't exist\" from \"doesn't exist on this Python version\"",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-05-09T16:09:06Z",
      "updated_at": "2025-11-18T16:10:26Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "If a user has their Python version mis-configured, and gets an error like `module 'datetime' has no attribute 'UTC'`, it's not necessarily obvious that the reason for this is that they are on the wrong Python version. It would be nice if we could offer an info context on the diagnostic saying \"it exists on other Python versions, but you are running with Python 3.9\"\n\nWe have basic support for this, but there's more we could do. Quoting a comment below: We now:\n\n* Report this precise info when you import a stdlib module we have VERSIONS info for ([18403](github.com/astral-sh/ruff/issues/18403), [20908](https://github.com/astral-sh/ruff/pull/20908))\n* Mention what version you're on when you fail to access an attribute on a stdlib module we believe *does* exist in *some* version/platform ([20909](https://github.com/astral-sh/ruff/pull/20909))\n\nWe do not:\n* Report on attributes of types, optional function arguments, etc.\n* Report the exact version(s) needed for attributes\n* Report the exact platform(s) needed for attributes (or mention the current platform)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/296/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/283",
      "id": 3049855645,
      "node_id": "I_kwDOOje-Bs61yRqd",
      "number": 283,
      "title": "Add compiler",
      "user": {
        "login": "nickdrozd",
        "id": 17630138,
        "node_id": "MDQ6VXNlcjE3NjMwMTM4",
        "avatar_url": "https://avatars.githubusercontent.com/u/17630138?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/nickdrozd",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-05-08T19:05:42Z",
      "updated_at": "2025-11-18T16:10:28Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "An extremely useful and underappreciated feature of Mypy is that it is able to use type information to generate C extensions. Or IOW, it acts as a Python compiler (Mypyc). The result is substantially faster than plain interpreted Python. It is a good middle ground between doing nothing and doing a full RIIR.\n\nIt would be very cool if Ty could do this. Obviously this is a long-term feature request. Good to keep in mind at this early stage.\n\nCould try out different codegen backends, etc.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/283/reactions",
        "total_count": 24,
        "+1": 9,
        "-1": 0,
        "laugh": 3,
        "hooray": 0,
        "confused": 0,
        "heart": 11,
        "rocket": 0,
        "eyes": 1
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/281",
      "id": 3049726746,
      "node_id": "I_kwDOOje-Bs61xyMa",
      "number": 281,
      "title": "respect return type of `__new__`",
      "user": {
        "login": "nickdrozd",
        "id": 17630138,
        "node_id": "MDQ6VXNlcjE3NjMwMTM4",
        "avatar_url": "https://avatars.githubusercontent.com/u/17630138?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/nickdrozd",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592556385,
          "node_id": "LA_kwDOOje-Bs8AAAACACgBYQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/calls",
          "name": "calls",
          "color": "f9d0c4",
          "default": false,
          "description": "Issues relating to call-signature checking and diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "charliermarsh",
        "id": 1309177,
        "node_id": "MDQ6VXNlcjEzMDkxNzc=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/charliermarsh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "charliermarsh",
          "id": 1309177,
          "node_id": "MDQ6VXNlcjEzMDkxNzc=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1309177?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/charliermarsh",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-05-08T18:04:30Z",
      "updated_at": "2025-12-31T16:39:02Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nThis code passes Ty without any warnings. But when run it will fail half the time.\n\n```python\nfrom __future__ import annotations\n\nfrom random import randint\nfrom typing import TYPE_CHECKING\n\nclass A:\n    def __new__(cls) -> int | A:\n        if randint(0, 1):\n            return object.__new__(cls)\n        else:\n            return randint(0, 100)\n\ndef f(x: A) -> None:\n    assert isinstance(x, A)\n\na = A()\n\nf(a)\n```\n\n`f` expects value of type `A`. But `A.__new__` might return `int`. So constructor of `A` should not be assumed to always return `A`. Ty should flag call `f(a)`.\n\n### Version\n\nty 0.0.0-alpha.7",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/281/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/272",
      "id": 3049042250,
      "node_id": "I_kwDOOje-Bs61vLFK",
      "number": 272,
      "title": "Recognize user intent when using `--python 3.13`",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        },
        "2": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 8,
      "created_at": "2025-05-08T13:39:49Z",
      "updated_at": "2025-11-13T17:55:05Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For some reason I do this wrong all the time. I run `ty check --python 3.13` and press enter before I realize that it should be `--python-version`, not `--python`. It would be nice to detect this (directory \"3.13\" does not exist and it successfully parses as a python version) and to show a nice error message (\"did you mean `--python-version 3.13`\")?\n```\n▶ ty check --python 3.13  # oops\nty failed\n  Cause: Invalid search path settings\n  Cause: Failed to discover the site-packages directory: Invalid `--python` argument: `/home/shark/ecosystem/ami-notifications-api/3.13` could not be canonicalized\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/272/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/269",
      "id": 3048810369,
      "node_id": "I_kwDOOje-Bs61uSeB",
      "number": 269,
      "title": "`pre-commit` hook for `ty`",
      "user": {
        "login": "janosh",
        "id": 30958850,
        "node_id": "MDQ6VXNlcjMwOTU4ODUw",
        "avatar_url": "https://avatars.githubusercontent.com/u/30958850?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/janosh",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568525375,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlSPw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-decision",
          "name": "needs-decision",
          "color": "D810FB",
          "default": false,
          "description": "Awaiting a decision from a maintainer"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 30,
      "created_at": "2025-05-08T12:10:17Z",
      "updated_at": "2025-12-21T14:39:03Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "looking forward to the https://github.com/astral-sh/ruff-pre-commit equivalent for `ty`\n\ni understand `ty` is pre-release but i think there would be value in offering `pre-commit` integration even before the beta",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/269/reactions",
        "total_count": 229,
        "+1": 175,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 25,
        "rocket": 13,
        "eyes": 16
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/267",
      "id": 3048640607,
      "node_id": "I_kwDOOje-Bs61tpBf",
      "number": 267,
      "title": "`unresolved-attribute` for `@<field>.validator` in `attrs` class",
      "user": {
        "login": "my1e5",
        "id": 10064103,
        "node_id": "MDQ6VXNlcjEwMDY0MTAz",
        "avatar_url": "https://avatars.githubusercontent.com/u/10064103?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/my1e5",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592544541,
          "node_id": "LA_kwDOOje-Bs8AAAACACfTHQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/dataclasses",
          "name": "dataclasses",
          "color": "1d76db",
          "default": false,
          "description": "Issues relating to dataclasses and dataclass_transform"
        },
        "1": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        },
        "2": {
          "id": 9098771829,
          "node_id": "LA_kwDOOje-Bs8AAAACHlQ9dQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/library",
          "name": "library",
          "color": "b71686",
          "default": false,
          "description": "Dedicated support for popular third-party libraries"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 14,
      "created_at": "2025-05-08T11:02:31Z",
      "updated_at": "2025-11-14T14:56:52Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nReporting this here to understand if this is something that needs sorting on the `attrs` library side.\n\n`attrs` allows you to define a validator for an attribute using a decorator (`@<field>.validator`)\n\n```py\n# /// script\n# requires-python = \">=3.13\"\n# dependencies = [\n#     \"attrs\",\n# ]\n# ///\n\nfrom typing import Any\n\nfrom attrs import define, field\n\n\n@define(kw_only=True)\nclass Foo:\n    name: str = field(default=\"\")\n    age: int = field(default=0)\n\n    @age.validator\n    def check_age(self, _: Any, value: int) -> None:\n        if value < 0:\n            raise ValueError(\"Age must be a positive integer.\")\n\n\nif __name__ == \"__main__\":\n    foo = Foo(age=3)\n    foo.age = -2  # This will raise a ValueError\n```\n### ty \n```\n$ uvx --with attrs==25.3.0 ty check foo.py \nInstalled 2 packages in 51ms\nerror: lint:unresolved-attribute: Type `Literal[0]` has no attribute `validator`\n  --> foo.py:18:6\n   |\n16 |     age: int = field(default=0)\n17 |\n18 |     @age.validator\n   |      ^^^^^^^^^^^^^\n19 |     def check_age(self, _: Any, value: int) -> None:\n20 |         if value < 0:\n   |\ninfo: `lint:unresolved-attribute` is enabled by default\n\nFound 1 diagnostic\n```\n### mypy\n```\n$ uvx --with attrs mypy --strict foo.py\nSuccess: no issues found in 1 source file\n```\n\n### Version\n\nty 0.0.0-alpha.7 (905a3e1e5 2025-05-07)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/267/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/31",
      "id": 3040163661,
      "node_id": "I_kwDOOje-Bs61NTdN",
      "number": 31,
      "title": "Dependency Dashboard",
      "user": {
        "login": "renovate[bot]",
        "id": 29139614,
        "node_id": "MDM6Qm90MjkxMzk2MTQ=",
        "avatar_url": "https://avatars.githubusercontent.com/in/2740?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/renovate%5Bbot%5D",
        "type": "Bot",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-05-05T16:20:40Z",
      "updated_at": "2026-01-09T20:35:59Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This issue lists Renovate updates and detected dependencies. Read the [Dependency Dashboard](https://docs.renovatebot.com/key-concepts/dashboard/) docs to learn more.<br>[View this repository on the Mend.io Web Portal](https://developer.mend.io/github/astral-sh/ty).\n\n> [!NOTE]\nThese dependencies have not received updates for an extended period and may be unmaintained:\n\n<details>\n<summary>View abandoned dependencies (1)</summary>\n\n| Datasource | Name | Last Updated |\n|------------|------|-------------|\n| github-actions | `addnab/docker-run-action` | `2021-03-17` |\n\n</details>\n\nPackages are marked as abandoned when they exceed the [`abandonmentThreshold`](https://docs.renovatebot.com/configuration-options/#abandonmentthreshold) since their last release.\nUnlike deprecated packages with official notices, abandonment is detected by release inactivity.\n\n\n## Awaiting Schedule\n\nThe following updates are awaiting their schedule. To get an update now, click on a checkbox below.\n\n - [ ] <!-- unschedule-branch=renovate/actions-checkout-digest -->Update actions/checkout digest to 0c366fd\n - [ ] <!-- unschedule-branch=renovate/pre-commit-dependencies -->Update pre-commit dependencies (`astral-sh/uv-pre-commit`, `crate-ci/typos`, `rhysd/actionlint`)\n - [ ] <!-- unschedule-branch=renovate/astral-sh-setup-uv-7.x -->Update astral-sh/setup-uv action to v7.2.0\n - [ ] <!-- create-all-awaiting-schedule-prs -->🔐 **Create all awaiting schedule PRs at once** 🔐\n\n## Detected Dependencies\n\n<details><summary>github-actions (7)</summary>\n<blockquote>\n\n<details><summary>.github/workflows/build-binaries.yml (42)</summary>\n\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `actions/setup-python v6.1.0@83679a892e2d95755f2dac6acb0bfd1e9ac5d548`\n - `PyO3/maturin-action v1.49.4@86b9d133d34bc1b40018696f782949dac11bd380`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `actions/setup-python v6.1.0@83679a892e2d95755f2dac6acb0bfd1e9ac5d548`\n - `PyO3/maturin-action v1.49.4@86b9d133d34bc1b40018696f782949dac11bd380`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `actions/setup-python v6.1.0@83679a892e2d95755f2dac6acb0bfd1e9ac5d548`\n - `PyO3/maturin-action v1.49.4@86b9d133d34bc1b40018696f782949dac11bd380`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `actions/setup-python v6.1.0@83679a892e2d95755f2dac6acb0bfd1e9ac5d548`\n - `PyO3/maturin-action v1.49.4@86b9d133d34bc1b40018696f782949dac11bd380`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `actions/setup-python v6.1.0@83679a892e2d95755f2dac6acb0bfd1e9ac5d548`\n - `PyO3/maturin-action v1.49.4@86b9d133d34bc1b40018696f782949dac11bd380`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `actions/setup-python v6.1.0@83679a892e2d95755f2dac6acb0bfd1e9ac5d548`\n - `PyO3/maturin-action v1.49.4@86b9d133d34bc1b40018696f782949dac11bd380`\n - `uraimo/run-on-arch-action v3.0.1@d94c13912ea685de38fccc1109385b83fd79427d`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `actions/setup-python v6.1.0@83679a892e2d95755f2dac6acb0bfd1e9ac5d548`\n - `PyO3/maturin-action v1.49.4@86b9d133d34bc1b40018696f782949dac11bd380`\n - `addnab/docker-run-action v3@4f65fabd2431ebc8d299f8e5a018d79a769ae185`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `actions/setup-python v6.1.0@83679a892e2d95755f2dac6acb0bfd1e9ac5d548`\n - `PyO3/maturin-action v1.49.4@86b9d133d34bc1b40018696f782949dac11bd380`\n - `uraimo/run-on-arch-action v3.0.1@d94c13912ea685de38fccc1109385b83fd79427d`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n\n</details>\n\n<details><summary>.github/workflows/build-docker.yml (18)</summary>\n\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `docker/setup-buildx-action v3.12.0@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f`\n - `docker/login-action v3.6.0@5e57cd118135c172c3672efd75eb46360885c0ef`\n - `docker/metadata-action v5.10.0@c299e40c65443455700f0fdfc63efafe5b349051`\n - `docker/build-push-action v6.18.0@263435318d21b8e681c14492fe198d362a7d2c83`\n - `actions/upload-artifact v6.0.0@b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/download-artifact v7.0.0@37930b1c2abaa49bbe596cd826c3c89aef350131`\n - `docker/setup-buildx-action v3.12.0@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f`\n - `docker/metadata-action v5.10.0@c299e40c65443455700f0fdfc63efafe5b349051`\n - `docker/login-action v3.6.0@5e57cd118135c172c3672efd75eb46360885c0ef`\n - `docker/setup-buildx-action v3.12.0@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f`\n - `docker/login-action v3.6.0@5e57cd118135c172c3672efd75eb46360885c0ef`\n - `docker/metadata-action v5.10.0@c299e40c65443455700f0fdfc63efafe5b349051`\n - `docker/build-push-action v6.18.0@263435318d21b8e681c14492fe198d362a7d2c83`\n - `actions/download-artifact v7.0.0@37930b1c2abaa49bbe596cd826c3c89aef350131`\n - `docker/setup-buildx-action v3.12.0@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f`\n - `docker/metadata-action v5.10.0@c299e40c65443455700f0fdfc63efafe5b349051`\n - `docker/login-action v3.6.0@5e57cd118135c172c3672efd75eb46360885c0ef`\n\n</details>\n\n<details><summary>.github/workflows/ci.yaml (12)</summary>\n\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `actions/setup-python v6.1.0@83679a892e2d95755f2dac6acb0bfd1e9ac5d548`\n - `Swatinem/rust-cache v2.8.2@779680da715d629ac1d338a641029a2f4372abb5`\n - `PyO3/maturin-action v1.49.4@86b9d133d34bc1b40018696f782949dac11bd380`\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `astral-sh/setup-uv v7.1.6@681c641aba71e4a1c380be3ab5e12ad51f415867` → [Updates: `v7.2.0`]\n - `actions/cache v5.0.1@9255dc7a253b0ccc959486e2bca901246202afeb`\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `astral-sh/setup-uv v7.1.6@681c641aba71e4a1c380be3ab5e12ad51f415867` → [Updates: `v7.2.0`]\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `astral-sh/setup-uv v7.1.6@681c641aba71e4a1c380be3ab5e12ad51f415867` → [Updates: `v7.2.0`]\n - `actions/setup-python v6.1.0@83679a892e2d95755f2dac6acb0bfd1e9ac5d548`\n\n</details>\n\n<details><summary>.github/workflows/daily_property_tests.yml (4)</summary>\n\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `rui314/setup-mold v1@725a8794d15fc7563f59595bd9556495c0564878`\n - `Swatinem/rust-cache v2.8.2@779680da715d629ac1d338a641029a2f4372abb5`\n - `actions/github-script v8.0.0@ed597411d8f924073f98dfc5c65a23a2325f34cd`\n\n</details>\n\n<details><summary>.github/workflows/publish-docs.yml (3)</summary>\n\n - `actions/checkout v6.0.1@8e8c483db84b4bee98b60c0593521ed34d9990e8`\n - `actions/setup-python v6.1.0@83679a892e2d95755f2dac6acb0bfd1e9ac5d548`\n - `python 3.14`\n\n</details>\n\n<details><summary>.github/workflows/publish-pypi.yml (2)</summary>\n\n - `astral-sh/setup-uv v7.1.6@681c641aba71e4a1c380be3ab5e12ad51f415867` → [Updates: `v7.2.0`]\n - `actions/download-artifact v7.0.0@37930b1c2abaa49bbe596cd826c3c89aef350131`\n\n</details>\n\n<details><summary>.github/workflows/release.yml (13)</summary>\n\n - `actions/checkout 8e8c483db84b4bee98b60c0593521ed34d9990e8` → [Updates: `undefined`]\n - `actions/upload-artifact b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/upload-artifact b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/checkout 8e8c483db84b4bee98b60c0593521ed34d9990e8` → [Updates: `undefined`]\n - `actions/download-artifact 37930b1c2abaa49bbe596cd826c3c89aef350131`\n - `actions/download-artifact 37930b1c2abaa49bbe596cd826c3c89aef350131`\n - `actions/upload-artifact b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/checkout 8e8c483db84b4bee98b60c0593521ed34d9990e8` → [Updates: `undefined`]\n - `actions/download-artifact 37930b1c2abaa49bbe596cd826c3c89aef350131`\n - `actions/download-artifact 37930b1c2abaa49bbe596cd826c3c89aef350131`\n - `actions/upload-artifact b7c566a772e6b6bfb58ed0dc250532a479d7789f`\n - `actions/checkout 8e8c483db84b4bee98b60c0593521ed34d9990e8` → [Updates: `undefined`]\n - `actions/download-artifact 37930b1c2abaa49bbe596cd826c3c89aef350131`\n\n</details>\n\n</blockquote>\n</details>\n\n<details><summary>pre-commit (1)</summary>\n<blockquote>\n\n<details><summary>.pre-commit-config.yaml (13)</summary>\n\n - `astral-sh/uv-pre-commit 0.9.18` → [Updates: `0.9.21`]\n - `pre-commit/pre-commit-hooks v6.0.0`\n - `astral-sh/ruff-pre-commit v0.14.10` → [Updates: `v0.14.11`]\n - `abravalheri/validate-pyproject v0.24.1`\n - `mdformat-mkdocs ==5.1.1` → [Updates: `==5.1.2`]\n - `mdformat-footnote ==0.1.2`\n - `executablebooks/mdformat 1.0.0`\n - `igorshubovych/markdownlint-cli v0.47.0`\n - `crate-ci/typos v1.40.0` → [Updates: `v1.41.0`]\n - `rbubley/mirrors-prettier v3.7.4`\n - `zizmorcore/zizmor-pre-commit v1.19.0` → [Updates: `v1.20.0`]\n - `python-jsonschema/check-jsonschema 0.36.0`\n - `rhysd/actionlint v1.7.9` → [Updates: `v1.7.10`]\n\n</details>\n\n</blockquote>\n</details>\n\n---\n\n- [ ] <!-- manual job -->Check this box to trigger a request for Renovate to run again on this repository\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/31/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/96",
      "id": 3046348843,
      "node_id": "I_kwDOOje-Bs61k5gr",
      "number": 96,
      "title": "Stack overflow for large chain of inter-dependent definitions",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8579103828,
          "node_id": "LA_kwDOOje-Bs8AAAAB_1q8VA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/fatal",
          "name": "fatal",
          "color": "C45D35",
          "default": false,
          "description": "a fatal error (panic or crash)"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 12,
      "created_at": "2025-05-05T14:22:57Z",
      "updated_at": "2025-10-17T08:17:47Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "EDIT to summarize discussion below: the issue is related to large chains of dependent bindings, which (if analyzed lazily from last to first) are inferred recursively, potentially leading to large stack usage, especially in debug builds. We increased our max stack size and can now handle up to around 2500 such chained definitions in a release build (~500 in a debug build.) Low priority to do more here unless we see this as an issue in real-world codebases.\n\nThe full stack trace is attached, but is not very informative. The stack overflow is not deterministic. This might be related to some huge files like [manticore/tests/native/test_x86.py](https://github.com/trailofbits/manticore/blob/master/tests/native/test_x86.py) (120,000 lines).\n\n[backtrace_manticore.txt](https://github.com/user-attachments/files/20038462/backtrace_manticore.txt)\n\n",
      "closed_by": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/96/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": "reopened",
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/71",
      "id": 3046303369,
      "node_id": "I_kwDOOje-Bs61kuaJ",
      "number": 71,
      "title": "ty is slow for large tuples",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-05-05T13:44:31Z",
      "updated_at": "2025-08-15T15:03:12Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The file mentioned in https://github.com/astral-sh/ruff/issues/17572 takes very long to type check. It passes immediately if I shrink the large tuple.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/71/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/97",
      "id": 3046348921,
      "node_id": "I_kwDOOje-Bs61k5h5",
      "number": 97,
      "title": "Avoid re-indexing when new files are added",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 5,
      "created_at": "2025-05-04T11:03:42Z",
      "updated_at": "2025-06-09T16:57:59Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "ty re-indexes all project files when a new file is added because it currently has no other way to determine if the file is ignored by a .gitignore (or some other rule). This is wasteful and can make ty unnecessarily slow when switching between commits. \n\nWe should explore a cheaper way to determine if a file is excluded that doesn't require traversing an entire sub-tree.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/97/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/102",
      "id": 3046349247,
      "node_id": "I_kwDOOje-Bs61k5m_",
      "number": 102,
      "title": "Display of overloaded definitions",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8568526506,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlWqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-design",
          "name": "needs-design",
          "color": "F9D0C4",
          "default": false,
          "description": "Needs further design before implementation"
        },
        "2": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 12,
      "created_at": "2025-05-01T20:36:33Z",
      "updated_at": "2026-01-08T15:48:47Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently, an overloaded definition is displayed using the following format:\n\n```py\nOverload[<signature of overload 1>, <signature of overload 2>, ...]\n```\n\nFor example:\n\n```py\nOverload[() -> None, (x: int) -> int]\n```\n\nThe main use cases are `reveal_type`, error messages (?), hover implementation in the language server.\n\nThis issue is to keep track of whether we want to improve the display and if so then how?\n\nThere was some discussion over at https://github.com/astral-sh/ruff/pull/17294#issuecomment-2789998693.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/102/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/103",
      "id": 3046349586,
      "node_id": "I_kwDOOje-Bs61k5sS",
      "number": 103,
      "title": "Check for overlapping overloads",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-05-01T20:11:57Z",
      "updated_at": "2025-06-11T01:02:59Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This requires some discussion on what the concrete rules are. There's some context on a discussion about this when the overloads chapter in the typing spec was being updated: https://github.com/python/typing/pull/1839#discussion_r1728160022.\n\nFor example (copied from the above discussion):\n\n```py\nfrom typing import Literal, overload\n\n@overload\ndef is_one(x: Literal[1]) -> True: ...\n@overload\ndef is_one(x: int) -> False: ...\n\ndef f(x: int) -> bool:\n    return is_one(x)\n\nf(1)  # Presumably True at runtime, but type checker will say False (unless it performs inlining)\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/103/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/109",
      "id": 3046350037,
      "node_id": "I_kwDOOje-Bs61k5zV",
      "number": 109,
      "title": "Check implementation consistency for an overloaded function",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "1": {
          "id": 8592557769,
          "node_id": "LA_kwDOOje-Bs8AAAACACgGyQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/overloads",
          "name": "overloads",
          "color": "1526D9",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {
        "0": {
          "login": "LaBatata101",
          "id": 20308796,
          "node_id": "MDQ6VXNlcjIwMzA4Nzk2",
          "avatar_url": "https://avatars.githubusercontent.com/u/20308796?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/LaBatata101",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-04-30T18:56:06Z",
      "updated_at": "2025-06-11T01:01:14Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961576,
        "node_id": "IT_kwDOBulz184BEhJo",
        "name": "Task",
        "description": "A specific piece of work",
        "color": "yellow",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The task here is to check whether the overloaded signatures is consistent with the implementation signature if it's present. Specifically, from the spec:\n\n> If an overload implementation is defined, type checkers should validate that it is consistent with all of its associated overload signatures. The implementation should accept all potential sets of arguments that are accepted by the overloads and should produce all potential return types produced by the overloads. In typing terms, this means the input signature of the implementation should be [assignable](https://typing.python.org/en/latest/spec/glossary.html#term-assignable) to the input signatures of all overloads, and the return type of all overloads should be assignable to the return type of the implementation.\n> \n> If the implementation is inconsistent with its overloads, a type checker should report an error.\n>\n> https://typing.python.org/en/latest/spec/overload.html#implementation-consistency\n\nThe following function is the one where all overload checks happen:\n\nhttps://github.com/astral-sh/ruff/blob/bd5fb826bce149d8a834767e6c175c2e4d90105a/crates/red_knot_python_semantic/src/types/infer.rs#L990-L990\n\nSpecifically, it loops over each of the overloaded function that needs to be checked here:\n\nhttps://github.com/astral-sh/ruff/blob/bd5fb826bce149d8a834767e6c175c2e4d90105a/crates/red_knot_python_semantic/src/types/infer.rs#L1036-L1039\n\nwhich are used to perform various checks.\n\n**Notes:**\n* We can reuse the [`INVALID_OVERLOAD`](https://github.com/astral-sh/ruff/blob/bd5fb826bce149d8a834767e6c175c2e4d90105a/crates/red_knot_python_semantic/src/types/diagnostic.rs#L487-L487) lint rule to raise a diagnostic for this check\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/109/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/111",
      "id": 3046350172,
      "node_id": "I_kwDOOje-Bs61k51c",
      "number": 111,
      "title": "Advanced dataclass support",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592544541,
          "node_id": "LA_kwDOOje-Bs8AAAACACfTHQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/dataclasses",
          "name": "dataclasses",
          "color": "1d76db",
          "default": false,
          "description": "Issues relating to dataclasses and dataclass_transform"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 13,
      "created_at": "2025-04-28T08:13:21Z",
      "updated_at": "2025-12-13T17:30:11Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We already have initial support for dataclasses, but some more advanced features are still missing. The following list is most probably not complete:\n\n- [x] Make sure that `dataclass` can be used as a non-decorator: `class C: …; C = dataclass(C)`. See empty [test here](https://github.com/astral-sh/ruff/blob/dbc137c9516808baa292da7a928e50ba36a14d39/crates/red_knot_python_semantic/resources/mdtest/dataclasses.md?plain=1#L703C1-L703C6).\n- [x] Emit an error if >=2 variables in a dataclass class body are annotated with `KW_ONLY` (failing test [here](https://github.com/astral-sh/ruff/blob/913f136d33fbc1b7d20fc91190431ccef2e2834c/crates/ty_python_semantic/resources/mdtest/dataclasses.md?plain=1#L744-L757))\n- [x] Support for `dataclasses.KW_ONLY`\n- [x] Support for `Final[…]` fields and `ClassVar[Final[…]]` fields.\n- [x] Improve support for frozen dataclasses to [handle subclasses of frozen dataclasses also](https://github.com/astral-sh/ruff/pull/17974#discussion_r2101813542)\n- [x] Support for `dataclasses.InitVar` https://github.com/astral-sh/ruff/pull/19527\n- [x] Support for [dataclass `field`s](https://docs.python.org/3/library/dataclasses.html#dataclasses.field)\n- [x] Add support for [other synthesized functions / arguments](https://github.com/astral-sh/ruff/blob/dbc137c9516808baa292da7a928e50ba36a14d39/crates/red_knot_python_semantic/resources/mdtest/dataclasses.md?plain=1#L366-L388)\n  - [x] unsafe_hash\n  - [x] match_args\n  - [x] kw_only\n  - [x] slots: astral-sh/ruff#20278\n  - [x] weakref_slot\n  - [x] The synthesized `__replace__` method on Python 3.13+ https://github.com/astral-sh/ruff/pull/19545\n- [ ] Emit diagnostic when defining a field without a default after a field with a default, see [existing TODO](https://github.com/astral-sh/ruff/blob/dbc137c9516808baa292da7a928e50ba36a14d39/crates/red_knot_python_semantic/resources/mdtest/dataclasses.md?plain=1#L120): https://github.com/astral-sh/ruff/pull/19825\n- [ ] Emit diagnostic when setting `order=True` on a dataclass that has a custom `__lt__` (or similar), see [existing TODO](https://github.com/astral-sh/ruff/blob/dbc137c9516808baa292da7a928e50ba36a14d39/crates/red_knot_python_semantic/resources/mdtest/dataclasses.md?plain=1#L361)\n- [ ] Verify signature of methods such as `__post_init__`, see [this comment](https://github.com/astral-sh/ruff/pull/19527#discussion_r2228364684)\n- [ ] Emit diagnostic if `frozen=True` but the class has a custom `__setattr__` or `__delattr__` method in the class body (this raises `TypeError` at runtime) https://github.com/astral-sh/ruff/pull/21430\n- [x] Add support for `dataclasses.field(kw_only=True)`",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/111/reactions",
        "total_count": 15,
        "+1": 15,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/113",
      "id": 3046350299,
      "node_id": "I_kwDOOje-Bs61k53b",
      "number": 113,
      "title": "Type inferred as `Never` from cyclic * import",
      "user": {
        "login": "MatthewMckee4",
        "id": 119673440,
        "node_id": "U_kgDOByISYA",
        "avatar_url": "https://avatars.githubusercontent.com/u/119673440?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MatthewMckee4",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 10,
      "created_at": "2025-04-23T20:44:53Z",
      "updated_at": "2025-11-13T06:28:34Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nMy reproduction is maybe not great, but there is a package `klayout` that contains a `.pyi` file with > 75,000 lines.\n```bash\nmkdir /tmp/test-repro\ncd /tmp/test-repro\nuv venv\nuv pip install klayout\necho \"import klayout.db as kdb\n\nfrom typing_extensions import reveal_type\n\n\ndef _(x: kdb.LayerInfo, y: kdb.LEFDEFReaderConfiguration):\n    reveal_type(x)\n    reveal_type(y)\n\" > main.py\nuv run <red-knot-bin> check main.py\n```\n\nThis gives the following error:\n```bash\nerror: lint:invalid-type-form: Variable of type `Never` is not allowed in a type expression\n --> /tmp/test-repro/main.py:6:10\n  |\n6 | def _(x: kdb.LayerInfo):\n  |          ^^^^^^^^^^^^^\n7 |     reveal_type(x)\n  |\n\ninfo: revealed-type: Revealed type\n --> /tmp/test-repro/main.py:7:5\n  |\n6 | def _(x: kdb.LayerInfo):\n7 |     reveal_type(x)\n  |     ^^^^^^^^^^^^^^ `Unknown`\n  |\n\nFound 2 diagnostics\n```\n\nAlso to note `LayerInfo` is defined at line 36702 and `LEFDEFReaderConfiguration` at line 35628 (and `LEFDEFReaderConfiguration` works fine)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/113/reactions",
        "total_count": 3,
        "+1": 3,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/114",
      "id": 3046350366,
      "node_id": "I_kwDOOje-Bs61k54e",
      "number": 114,
      "title": "Calling `is_file_open` degrades current query to durability LOW",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-04-23T06:35:19Z",
      "updated_at": "2025-08-15T07:00:08Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We noticed in https://github.com/astral-sh/ruff/pull/17463#discussion_r2054587050 that calling `is_file_open` degrades the durability of otherwise MEDIUM or HIGH durability queries to LOW because the `Project::open_files_set` and `Project::files` fields have durability LOW. \n\nWhat this means is that we degrade the durability of type inference and semantic index queries to LOW if they have any type checking or semantic syntax errors. Which is unfortunate, because it requires that Salsa can't use the fast-path to mark the queries as \"up-to-date\" after a revision change. \n\nTo some extend, this problem is similar to the one we experienced in the module resolver where module resolution first tries first-party files (that have a low durability) and only then tests for third party files. \n\nThe easiest solution is to change `is_file_open` to early return for vendored paths and system paths that aren't subpaths of the project directory. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/114/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/116",
      "id": 3046350490,
      "node_id": "I_kwDOOje-Bs61k56a",
      "number": 116,
      "title": "Subscripted generic classes should not be considered instances of `type`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        },
        "2": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-04-22T13:45:24Z",
      "updated_at": "2025-12-18T20:34:09Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nty currently emits no error on the following code, but it should:\n\n```py\nclass Foo[T]: ...\n\ndef requires_type(x: type): ...\n\nrequires_type(Foo[int])\n```\n\n`Foo[int]` here is not an instance of `type`. In the long run, it'll be quite important for us to understand this, as the runtime frequently distinguishes between generic aliases and instances of types:\n\n<details>\n<summary>REPL session demonstrating several places where generic aliases are not accepted as instances of `type`</summary>\n\n```pycon\nPython 3.13.1 (main, Jan  3 2025, 12:04:03) [Clang 15.0.0 (clang-1500.3.9.4)] on darwin\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n>>> class Foo[T]: ...\n... \n>>> isinstance(object(), Foo[int])\nTraceback (most recent call last):\n  File \"<python-input-1>\", line 1, in <module>\n    isinstance(object(), Foo[int])\n    ~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^\n  File \"/Users/alexw/.pyenv/versions/3.13.1/lib/python3.13/typing.py\", line 1375, in __instancecheck__\n    return self.__subclasscheck__(type(obj))\n           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^\n  File \"/Users/alexw/.pyenv/versions/3.13.1/lib/python3.13/typing.py\", line 1378, in __subclasscheck__\n    raise TypeError(\"Subscripted generics cannot be used with\"\n                    \" class and instance checks\")\nTypeError: Subscripted generics cannot be used with class and instance checks\n>>> issubclass(object, Foo[int])\nTraceback (most recent call last):\n  File \"<python-input-2>\", line 1, in <module>\n    issubclass(object, Foo[int])\n    ~~~~~~~~~~^^^^^^^^^^^^^^^^^^\n  File \"/Users/alexw/.pyenv/versions/3.13.1/lib/python3.13/typing.py\", line 1378, in __subclasscheck__\n    raise TypeError(\"Subscripted generics cannot be used with\"\n                    \" class and instance checks\")\nTypeError: Subscripted generics cannot be used with class and instance checks\n>>> from functools import singledispatch\n>>> @singledispatch\n... def f(arg): ...\n... \n>>> @f.register(list[int])\n... def f(arg): ...\n... \nTraceback (most recent call last):\n  File \"<python-input-5>\", line 1, in <module>\n    @f.register(list[int])\n     ~~~~~~~~~~^^^^^^^^^^^\n  File \"/Users/alexw/.pyenv/versions/3.13.1/lib/python3.13/functools.py\", line 893, in register\n    raise TypeError(\n    ...<3 lines>...\n    )\nTypeError: Invalid first argument to `register()`: list[int]. Use either `@register(some_class)` or plain `@register` on an annotated function.\n```\n\n</details>\n\nThis bug can also be seen in that both these assertions currently pass, when they should fail:\n\n```py\nfrom ty_extensions import static_assert, is_subtype_of, is_assignable_to, TypeOf\n\nclass Foo[T]: ...\n\nstatic_assert(is_subtype_of(TypeOf[Foo[int]], type))\nstatic_assert(is_assignable_to(TypeOf[Foo[int]], type))\n```\nhttps://play.ty.dev/d373a056-b58c-451b-a136-323e76970454\n\nCc. @dcreager for generics!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/116/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/119",
      "id": 3046350675,
      "node_id": "I_kwDOOje-Bs61k59T",
      "number": 119,
      "title": "Avoid type inference diagnostics on nodes with invalid syntax",
      "user": {
        "login": "ntBre",
        "id": 36778786,
        "node_id": "MDQ6VXNlcjM2Nzc4Nzg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/36778786?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ntBre",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-04-21T13:21:14Z",
      "updated_at": "2025-11-18T16:10:23Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "hmm, yeah, ideally we would get rid of the `invalid-type-form` error here; it's just redundant noise to the user to have two diagnostics for the same problem. I think @MichaReiser has mentioned in the past that he wanted a global solution to make sure we didn't emit any red-knot diagnostics from type inference on nodes that were already known to be invalid syntax. Would be another thing that would be good to file a followup issue for IMO.\r\n\r\n_Originally posted by @AlexWaygood in https://github.com/astral-sh/ruff/pull/17463#discussion_r2051164780_\r\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/119/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/120",
      "id": 3046350742,
      "node_id": "I_kwDOOje-Bs61k5-W",
      "number": 120,
      "title": "Update `star.md` tests to avoid syntax errors",
      "user": {
        "login": "ntBre",
        "id": 36778786,
        "node_id": "MDQ6VXNlcjM2Nzc4Nzg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/36778786?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ntBre",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        },
        "1": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        },
        "2": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": null,
      "comments": 0,
      "created_at": "2025-04-21T13:08:46Z",
      "updated_at": "2025-11-18T16:10:25Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "A few `match` tests in `star.md` have cases like this:\n\n```py\nmatch 42:\n    case P | Q:  # error: [invalid-syntax] \"name capture `P` makes remaining patterns unreachable\"\n        ...\n```\n\nwhere the first catch-all makes the second unreachable. @AlexWaygood and I discussed a couple of approaches in [this thread](https://github.com/astral-sh/ruff/pull/17463#discussion_r2050870163), but the best approach that preserved the meaning of the test wasn't immediately clear. We also stumbled upon a new syntax error that I'll add to astral-sh/ruff#17412.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/120/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/121",
      "id": 3046354580,
      "node_id": "I_kwDOOje-Bs61k66U",
      "number": 121,
      "title": "Add more tests for inference of async comprehensions with invalid syntax",
      "user": {
        "login": "ntBre",
        "id": 36778786,
        "node_id": "MDQ6VXNlcjM2Nzc4Nzg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/36778786?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/ntBre",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        },
        "1": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-04-21T13:02:54Z",
      "updated_at": "2025-11-18T16:10:23Z",
      "closed_at": null,
      "author_association": "NONE",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Similarly here, I don't think the intent here was for this to test our resilience to invalid syntax (the test case is titled \"Basic\" 😄), so I'd be inclined to do this to avoid the syntax error:\r\n\r\n```suggestion\r\nasync def _():\r\n    [reveal_type(x) async for x in AsyncIterable()]\r\n```\r\n\r\nalthough it probably _is_ a good idea for us to add a _separate_ test case that demonstrates that we still infer types correctly even if there is invalid syntax!\r\n\r\n_Originally posted by @AlexWaygood in https://github.com/astral-sh/ruff/pull/17463#discussion_r2050872442_\r\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/121/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/124",
      "id": 3046354781,
      "node_id": "I_kwDOOje-Bs61k69d",
      "number": 124,
      "title": "support large unions of literals",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-04-16T02:59:04Z",
      "updated_at": "2025-05-11T07:38:35Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "With https://github.com/astral-sh/ruff/pull/17419 we set a low limit on the size of unions-of-literals. We will probably want to increase this limit (maybe to somewhere in the 4-5000 range?), so we can support e.g. exhaustiveness checks on large code-generated enum types.\n\nIn order to do this without exposing ourselves to exponential slowdowns, we will need to expand the optimization in https://github.com/astral-sh/ruff/pull/17403 so that, instead of applying just to `UnionBuilder`, it is applied throughout our union and intersection representation. (That is, groups of same-kind literals are kept in a set and can be handled as a single block, instead of repetitively.)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/124/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/125",
      "id": 3046354838,
      "node_id": "I_kwDOOje-Bs61k6-W",
      "number": 125,
      "title": "validate incremental correctness by checking successive commits of real projects",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-04-15T21:25:46Z",
      "updated_at": "2025-11-18T16:10:23Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We should increase confidence in the correctness of our incremental checking by taking real projects (e.g. mypy-primer projects) and running red-knot incrementally on successive commits of those projects, then validating that the resulting diagnostics are identical to running a cold check on each of those commits.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/125/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/126",
      "id": 3046354899,
      "node_id": "I_kwDOOje-Bs61k6_T",
      "number": 126,
      "title": "model the possibility of mid-module external mutation of module globals?",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-04-14T23:03:04Z",
      "updated_at": "2025-11-18T16:10:23Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It is possible for module-level code to execute some code (via call and/or import) which in turn mutates the currently-executing module's globals.\n\nCurrently we don't respect this possibility.\n\nIf we did, it would mean that all module-level code would need to rely only on declared types of module-level variables, never a locally-inferred type.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/126/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/128",
      "id": 3046355319,
      "node_id": "I_kwDOOje-Bs61k7F3",
      "number": 128,
      "title": "Return type inference",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "mtshiba",
          "id": 45118249,
          "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
          "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mtshiba",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 19,
      "created_at": "2025-04-11T10:54:01Z",
      "updated_at": "2025-12-12T16:11:23Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 1,
        "total_blocking": 1
      },
      "body": "It would be great if we could infer return types for functions where it is not annotated\n\n```py\ndef f(x: int, y: str):\n    if x > 10:\n        return x\n    elif x > 5:\n        return y\n\nreveal_type(f(some_int, \"a\"))  # ideally: int | str | None\n```\n\nIt seems like it would simply be a union of all reachable return expressions (and possible `None`, if the function can implicitly return it — we already have functionality to detect that).",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/128/reactions",
        "total_count": 17,
        "+1": 15,
        "-1": 1,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 1,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/132",
      "id": 3046355695,
      "node_id": "I_kwDOOje-Bs61k7Lv",
      "number": 132,
      "title": "Consider custom `getattr_static` method",
      "user": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-04-09T13:51:35Z",
      "updated_at": "2025-11-18T16:10:20Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In https://github.com/astral-sh/ruff/pull/17023/files#r2033191626 @sharkdp called out that with generic classes, our implementation of `getattr_static` does not match its runtime behavior, since at runtime, generic aliases are instances of the special `_GenericAlias` class. We treat generic aliases as a specialized instance of the underlying class literal.\r\n\r\nThis `getattr_static` behavior is arguably better for our type checker, but @carljm suggested that we might consider a custom `getattr_static` in `knot_extensions` (instead of piggy-backing on the name of the runtime's `inspect.getattr_static`) to clarify this difference in behavior.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/132/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/134",
      "id": 3046355827,
      "node_id": "I_kwDOOje-Bs61k7Nz",
      "number": 134,
      "title": "Default to 'concise' output format if stdout is not a TTY",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-04-07T07:04:43Z",
      "updated_at": "2025-05-11T07:58:43Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The `concise` output format is helpful when piping Red Knot's output to other tools. For example, I find myself frequently doing something like\n```bash\nred_knot check --output-format concise | rg unresolved-import\n```\n\nI wonder if we should default to using `--output-format concise` when the output is not a TTY? The way this could work is that we introduce `--output-format auto`, which would be the new default. When stdout is an interactive terminal, `auto` would be equivalent to `full`, and otherwise it would be `concise`. This way, users could still force `--output-format full` if they really want to pipe the \"rich\" output format to a file or another tool.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/134/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/135",
      "id": 3046355912,
      "node_id": "I_kwDOOje-Bs61k7PI",
      "number": 135,
      "title": "Improve `[unresolved-attribute]` diagnostic for the case of an invalid `__getattr__` method",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-04-06T19:58:34Z",
      "updated_at": "2025-05-11T08:06:11Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "For this code:\n\n```py\nclass Foo:\n    def __getattr__(self) -> str:\n        return \"foo\"\n\nFoo().attr\n```\n\nred-knot currently emits the following diagnostic:\n\n```\nerror: lint:unresolved-attribute\n --> /Users/alexw/dev/experiment2/foo.py:5:1\n  |\n3 |         return \"foo\"\n4 |\n5 | Foo().attr\n  | ^^^^^^^^^^ Type `Foo` has no attribute `attr`\n  |\n```\n\nIt's correct for us to emit a diagnostic here, but the diagnostic implies that the code will fail with `AttributeError`, and it doesn't say anything about the `__getattr__` method, which (if you didn't look at it too closely) you _might_ think would allow arbitrary attributes to be accessed on instances of `Foo` at runtime. In actual fact, the `__getattr__` method is invalid (it needs to take two arguments, not one), so running this code fails with `TypeError` at runtime rather than `AttributeError`:\n\n```pytb\n~/dev/experiment2 [1] % python foo.py\nTraceback (most recent call last):\n  File \"/Users/alexw/dev/experiment2/foo.py\", line 5, in <module>\n    Foo().attr\nTypeError: Foo.__getattr__() takes 1 positional argument but 2 were given\n```\n\nIt would be great to add a subdiagnostic for this specific case pointing out that the reason why the attribute access will fail _despite_ the existence of the `__getattr__` method is that the `__getattr__` method is invalid",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/135/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/136",
      "id": 3046355976,
      "node_id": "I_kwDOOje-Bs61k7QI",
      "number": 136,
      "title": "prefer more precise declared type over gradual inferred type, or vice versa",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 44,
      "created_at": "2025-04-06T18:43:23Z",
      "updated_at": "2026-01-09T15:28:53Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "In a case like this:\n\n```py\nfrom typing import Any\n\ndef f(x: Any):\n    y: str = x\n    reveal_type(y)\n```\n\nWe currently reveal Any because we prefer inferred over declared type. But in this case that's counter productive because our inferred type is just Any. \n\nOne policy we could use here is that if the declared type is assignable to the inferred type, that suggests it is at least as precise, and we should prefer it.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/136/reactions",
        "total_count": 4,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/137",
      "id": 3046356055,
      "node_id": "I_kwDOOje-Bs61k7RX",
      "number": 137,
      "title": "add Type::TypeVar to property tests",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        },
        "1": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-04-03T23:47:32Z",
      "updated_at": "2025-11-13T16:12:07Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": null,
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/137/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/138",
      "id": 3046356099,
      "node_id": "I_kwDOOje-Bs61k7SD",
      "number": 138,
      "title": "Typevar should specialize to a single type across different statements",
      "user": {
        "login": "dcreager",
        "id": 7499,
        "node_id": "MDQ6VXNlcjc0OTk=",
        "avatar_url": "https://avatars.githubusercontent.com/u/7499?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dcreager",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581688285,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4Ir3Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/generics",
          "name": "generics",
          "color": "36DCB5",
          "default": false,
          "description": "Bugs or features relating to ty's generics implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-04-03T20:09:46Z",
      "updated_at": "2025-11-18T16:10:20Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "A typevar should specialize to a single type each time its generic class or function is specialized. We're already considering that, and have a (currently failing) mdtest for this example:\r\n\r\n```py\r\ndef f[T: (int, str)](t: T, u: T) -> T:\r\n  return t + u\r\n```\r\n\r\nThis is valid since `int` has an `__add__` method that takes in another `int`, and `str` has one that takes in another `str`.  It's not an error that `int`'s method doesn't take in a `str`, since if `t` is an `int`, `u` must be one too. This is an important way that constrained typevars are different from a union.\r\n\r\n@carljm and I were trying to brainstorm whether this kind of propagation could occur across multiple statements, and he came up with this example:\r\n\r\n```py\r\ndef f[T](a: T, b: T):\r\n    if isinstance(a, int):\r\n        reveal_type(a)  # revealed: int\r\n        reveal_type(b)  # hopefully: int\r\n```\r\n\r\nThe narrowing constraint machinery seems like it provides what we need to make this work — the `isinstance` call would (waving hands wildly) not just add a narrowing constraint on `a`, but also on any typevars that appear in the type of `a`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/138/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/141",
      "id": 3046356293,
      "node_id": "I_kwDOOje-Bs61k7VF",
      "number": 141,
      "title": "Fix `@no_type_check` regression involving unknown decorators",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-04-02T07:36:35Z",
      "updated_at": "2025-12-17T14:07:56Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "astral-sh/ruff#17017 introduced a regression in our understanding of `@no_type_check`, leading to two open `TODO`s in the tests here:\r\n\r\nhttps://github.com/astral-sh/ruff/blob/ae2cf91a360e927f5da307d0290be1a6229ced9a/crates/red_knot_python_semantic/resources/mdtest/suppressions/no_type_check.md?plain=1#L41-L72\r\n\r\nAddressing this might involve introducing a new function (salsa query?) that explicitly checks for the existence of a `@no_type_check` decorator in the definition of the function that is currently being type checked.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/141/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/142",
      "id": 3046356354,
      "node_id": "I_kwDOOje-Bs61k7WC",
      "number": 142,
      "title": "Add support for properties with deleters",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-04-02T07:31:11Z",
      "updated_at": "2025-05-11T07:54:33Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Emit a diagnostic if `del` is used on a property that has no deleter configured.\r\n\r\nSee also: existing `property.deleter` test in `properties.md`",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/142/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/143",
      "id": 3046356415,
      "node_id": "I_kwDOOje-Bs61k7W_",
      "number": 143,
      "title": "Add proper support for class decorators",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-04-02T07:28:48Z",
      "updated_at": "2026-01-08T08:31:25Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Similar to function decorators implemented in https://github.com/astral-sh/ruff/pull/17017, we need to support class decorators properly.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/143/reactions",
        "total_count": 5,
        "+1": 5,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/144",
      "id": 3046356475,
      "node_id": "I_kwDOOje-Bs61k7X7",
      "number": 144,
      "title": "Goto-type and hover-type for non-expression nodes (identifiers in statements)",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-04-01T10:55:10Z",
      "updated_at": "2025-12-31T16:37:53Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961576,
        "node_id": "IT_kwDOBulz184BEhJo",
        "name": "Task",
        "description": "A specific piece of work",
        "color": "yellow",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://github.com/astral-sh/ruff/pull/16901 implemented basic goto type definition support. However, there are still a handful of nodes that have identifier children for which goto type definition doesn't work because the enclosing node isn't an expression or a definition. We should add support for goto type definition for those nodes as well. \n\nSee the TODO comments in `ty_ide::goto::GotoTarget::inferred_type` \n\nStatus:\n\n* [x] goto-declaration\n* [x] goto-definition\n* [x] find-references\n* [x] rename (caveat: https://github.com/astral-sh/ty/issues/1661) \n* [x] hover (caveat: we do not display the type on hover, limited by goto-type)\n* [ ] goto-type\n  * [x] imports\n  * [ ] global/nonlocal - needs type inference changes to compute+record the type\n  * [ ] match patterns - needs type inference changes to compute+record the type\n  * [ ] type params (? should we even do anything here) ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/144/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/145",
      "id": 3046356849,
      "node_id": "I_kwDOOje-Bs61k7dx",
      "number": 145,
      "title": "Add an opt-in diagnostic warning about unsound calls to `type[]`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-03-31T11:37:20Z",
      "updated_at": "2025-05-11T07:57:41Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Red-knot allows you to call `type[]` types, and accurately infers the result of these calls:\n\n```py\nclass A: ...\n\ndef f(x: type[A]):\n    y = x()\n    reveal_type(y)\n```\n\nBut it's pretty easy to demonstrate that this is unsound:\n- `type[]` is covariant, meaning that a subclass of `A` could be passed into `f` and red-knot would not complain\n- subclasses of `A` are allowed to override `__init__` and/or `__new__` any way they like, since constructors are not checked for Liskov compatibility by type checkers.\n\n```py\nclass B(A):\n    def __init__(self, required_argument: int): pass\n\nf(B)  # boom, but not detected by red-knot\n```\n\nThe ability to call `type[]` types is useful for a variety of reasons, so we should allow it by default. However, we should add an opt-in diagnostic that warns users when they call `type[]` types, because of this unsoundness. When the rule is enabled, the behaviour would be something like this:\n\n\n```py\nclass A: ...\n\ndef f(x: type[A]):\n    y = x()  # error: [unsound-type-call] \"Calling a `type[]` type is unsound as constructor methods are not checked for Liskov compatibility by type checkers\"\n    reveal_type(y)  # revealed: A\n```\n\nOriginally suggested by @carljm in https://github.com/astral-sh/ruff/issues/15948. I think @mishamsk may be interested in working on this issue!",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/145/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/146",
      "id": 3046356921,
      "node_id": "I_kwDOOje-Bs61k7e5",
      "number": 146,
      "title": "Pass the typing conformance suite",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-03-27T18:41:57Z",
      "updated_at": "2026-01-09T15:28:04Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "...or explicitly document the cases where we intentionally choose to diverge from it? (In which case we should advocate for a change to / relaxation of the spec.)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/146/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/149",
      "id": 3046357110,
      "node_id": "I_kwDOOje-Bs61k7h2",
      "number": 149,
      "title": "full documentation",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239594,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/documentation",
          "name": "documentation",
          "color": "0075ca",
          "default": true,
          "description": "Improvements or additions to documentation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-03-26T18:14:02Z",
      "updated_at": "2025-05-23T05:46:09Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": null,
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/149/reactions",
        "total_count": 4,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 2,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 2
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/152",
      "id": 3046358584,
      "node_id": "I_kwDOOje-Bs61k744",
      "number": 152,
      "title": "context managers may silence exceptions",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "mtshiba",
        "id": 45118249,
        "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
        "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/mtshiba",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "mtshiba",
          "id": 45118249,
          "node_id": "MDQ6VXNlcjQ1MTE4MjQ5",
          "avatar_url": "https://avatars.githubusercontent.com/u/45118249?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/mtshiba",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-03-26T18:12:16Z",
      "updated_at": "2026-01-06T01:47:01Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": null,
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/152/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/154",
      "id": 3046358712,
      "node_id": "I_kwDOOje-Bs61k764",
      "number": 154,
      "title": "support TypedDict (and Required, NotRequired, ReadOnly)",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "1": {
          "id": 9596740363,
          "node_id": "LA_kwDOOje-Bs8AAAACPAKjCw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typeddict",
          "name": "typeddict",
          "color": "46775a",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 13,
      "created_at": "2025-03-26T18:06:53Z",
      "updated_at": "2026-01-09T15:53:18Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 3,
        "completed": 2,
        "percent_completed": 66
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "- [x] Introduce a new `Type` variant, basic support for class-based `TypedDict` syntax\n  - [x] Parse a `TypedDict` specification from the class body\n  - [x] Implement / test assignability to `Mapping[str, object]`\n  - [x] Make sure that `TypedDict`-based objects do not behave like instances of that class. For example, attribute access should not work.\n  - [x] Implement fallback to `_typeshed._type_checker_internals.TypedDictFallback`\n- [x] Type inference for key accesses (`movie['directory'] -> str`)\n- [x] Validation of writes to keys (synthesized `__setitem__` method with `key: Literal[\"key1\"], value: ValueType1`?)\n- [x] Validation of constructor calls (`Movie(name=\"Blade Runner\", year=1982)`)\n- [x] Validation of `{…}` literals to `TypedDict` types\n- [x] [Totality](https://typing.python.org/en/latest/spec/typeddict.html#totality)\n  - [x] `Required` and `NotRequired`\n- [x] Implement / write tests for generic `TypedDict`s\n- [x] Implement / write tests for recursive `TypedDict`s\n- [x] Support type inference for `instance.get(\"known_key\")`?\n- [x] [PEP 705 support](https://peps.python.org/pep-0705/) (`ReadOnly`)\n- [x] #1387 \n- [x] Implement disjointness for `TypedDict`.\n- [ ] Support `TypedDict`s in all contexts (`return` position, function call arguments, etc) => #168 \n- [ ] [PEP 728 support](https://peps.python.org/pep-0728/) (\"openness\", `extra_items`)\n- [ ] Functional syntax (`Movie = TypedDict('Movie', {'name': str, 'year': int})`)\n- [ ] Support for `Unpack`\n- [ ] Overriding of fields in inheritance\n- [ ] Correctness, validation\n  - [ ] Implement checks based on [supported and unsupported operations](https://typing.python.org/en/latest/spec/typeddict.html#supported-and-unsupported-operations)\n  - [ ] `TypedDict` type objects cannot be used in `isinstance` checks\n  - [ ] Only item definitions in the class body (no methods, for example)\n  - [ ] Specifying a metaclass is not allowed\n  - [ ] Can only subclass `TypedDict`, `TypedDict`- based types and `Generic`\n  - [ ] Implement / write tests for subclassing of `TypedDict`-based classes including multiple inheritance\n- [ ] Performance\n  - [ ] Try out the optimization proposed in https://github.com/astral-sh/ruff/pull/19763#discussion_r2256719857\n  - [ ] Add a micro-benchmark for large `TypedDict`s\n- [x] Implement `.normalize()` for `TypeDictType`.\n- [x] Investigate Pydantic-specific performance problems introduced in [#21467](https://github.com/astral-sh/ruff/pull/21467).\n- [ ] Add `TypedDict` to property tests.\n- [x] Submit a correction to the upstream assignability rules => https://github.com/python/typing/pull/2119\n- [ ] LSP support (competitions, go to definitions, rename, hover, ...)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/154/reactions",
        "total_count": 34,
        "+1": 34,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/155",
      "id": 3046358768,
      "node_id": "I_kwDOOje-Bs61k77w",
      "number": 155,
      "title": "support `@typing.override`",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 1,
      "created_at": "2025-03-26T18:06:17Z",
      "updated_at": "2025-11-26T19:29:40Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "- [x] (basic) error if a method decorated `@override` does not override anything\n- [ ] (strict) error if a method that overrides a super method is not decorated with `@override`",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/155/reactions",
        "total_count": 5,
        "+1": 5,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/156",
      "id": 3046358851,
      "node_id": "I_kwDOOje-Bs61k79D",
      "number": 156,
      "title": "support TypeVarTuple",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "dhruvmanila",
          "id": 67177269,
          "node_id": "MDQ6VXNlcjY3MTc3MjY5",
          "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/dhruvmanila",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-03-26T18:05:25Z",
      "updated_at": "2025-12-03T19:43:16Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": null,
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/156/reactions",
        "total_count": 6,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 6,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/160",
      "id": 3046359111,
      "node_id": "I_kwDOOje-Bs61k8BH",
      "number": 160,
      "title": "Multi-platform checking",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568544160,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmboA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/wish",
          "name": "wish",
          "color": "CDFC48",
          "default": false,
          "description": "Not on the current roadmap; maybe in the future"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 10,
      "created_at": "2025-03-26T13:31:28Z",
      "updated_at": "2025-11-18T16:10:28Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Calling a platform-specific method with no `python-platform` set currently always emits a `possibly-unbound` warning ([playground](https://playknot.ruff.rs/baf5d9d3-f4e7-4c87-ab8a-8302d2add03d)), even if the branch is guarded by an explicit `sys.platform` check. \n\nThe only way around the `possibly-unbound` warning seems to be to \n\n1. Use a suppression comment\n1. Only check for a specific platform, but that's not an option for everyone\n\nIdeally, the `sys.platform` narrowing would be sufficient but that's probably non-trivial. A more short-term solution would be to explore ways to avoid the `possibly-unbound` false positive. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/160/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/162",
      "id": 3046359248,
      "node_id": "I_kwDOOje-Bs61k8DQ",
      "number": 162,
      "title": "walrus expressions in a comprehension scope \"leak\" into the comprehension's enclosing scope",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2025-03-24T15:36:10Z",
      "updated_at": "2025-05-11T07:30:31Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\n\nList/set/dict comprehensions, and generator expressions, run code in an isolated scope, meaning that names defined in the comprehension body cannot be accessed from outside the comprehension:\n\n```pycon\n>>> [x for x in range(2)]\n[0, 1]\n>>> x\nTraceback (most recent call last):\n  File \"<python-input-1>\", line 1, in <module>\n    x\nNameError: name 'x' is not defined\n```\n\nBut... there is one exception to this: walrus expressions! Here, `y` is not accessible from outside the comprehension scope, but `x` _is_ because it was defined using a walrus (it \"leaks\" into the comprehension's enclosing scope):\n\n```pycon\n>>> [(x := y*2) for y in range(2)]\n[0, 2]\n>>> y\nTraceback (most recent call last):\n  File \"<python-input-3>\", line 1, in <module>\n    y\nNameError: name 'y' is not defined\n>>> x\n2\n```\n\nThis inconsistency might _look_ like a bug in CPython, but it's intentional behaviour. PEP 572, which introduced walrus expressions to Python, [states](https://peps.python.org/pep-0572/#scope-of-the-target):\n\n> An assignment expression does not introduce a new scope. In most cases the scope in which the target will be bound is self-explanatory: it is the current scope. If this scope contains a `nonlocal` or `global` declaration for the target, the assignment expression honors that. A lambda (being an explicit, if anonymous, function definition) counts as a scope for this purpose.\n>\n> There is one special case: an assignment expression occurring in a list, set or dict comprehension or in a generator expression (below collectively referred to as “comprehensions”) binds the target in the containing scope, honoring a `nonlocal` or `global` declaration for the target in that scope, if one exists. For the purpose of this rule the containing scope of a nested comprehension is the scope that contains the outermost comprehension. A lambda counts as a containing scope.\n> \n> The motivation for this special case is twofold. First, it allows us to conveniently capture a “witness” for an `any()` expression, or a counterexample for `all()`, for example:\n> \n> ```py\n> if any((comment := line).startswith('#') for line in lines):\n>     print(\"First comment:\", comment)\n> else:\n>     print(\"There are no comments\")\n> \n> if all((nonblank := line).strip() == '' for line in lines):\n>     print(\"All lines are blank\")\n> else:\n>     print(\"First non-blank line:\", nonblank)\n> ```\n> \n> Second, it allows a compact way of updating mutable state from a comprehension, for example:\n> \n> ```py\n> # Compute partial sums in a list comprehension\n> total = 0\n> partial_sums = [total := total + v for v in values]\n> print(\"Total:\", total)\n> ```\n\nUse of this feature is reasonably common for generator expressions in `any()` and `all()` (both mentioned as motivations in the PEP), so it's important for red-knot to model this accurately. We currently don't -- this test fails on `main` when it should pass:\n\n```py\nclass Iterator:\n    def __next__(self) -> int:\n        return 42\n\nclass Iterable:\n    def __iter__(self) -> Iterator:\n        return Iterator()\n\n[(a := b * 2) for b in Iterable()]\n[c for d in Iterable() if (c := d - 10) > 0]\n{(e := f * 2): (g := f * 3) for f in Iterable()}\nlist(((h := i * 2) for i in Iterable()))\n\nreveal_type(a)  # revealed: int\nreveal_type(c)  # revealed: int\nreveal_type(e)  # revealed: int\nreveal_type(g)  # revealed: int\nreveal_type(h)  # revealed: int\n```\n\nhttps://playknot.ruff.rs/5be255af-1c62-44b1-b843-eaba65293980\n\n### Version\n\n_No response_",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/162/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/163",
      "id": 3046359306,
      "node_id": "I_kwDOOje-Bs61k8EK",
      "number": 163,
      "title": "Provide context on why an assignment failed",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 13,
      "created_at": "2025-03-22T21:08:14Z",
      "updated_at": "2025-12-19T23:38:43Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 2,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 2,
        "total_blocking": 2
      },
      "body": "It will be useful to provide why an assignment between two types failed. Pyright does this but for ty it will require updating the APIs because currently the returned type is boolean for `is_assignable_to`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/163/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/165",
      "id": 3046359446,
      "node_id": "I_kwDOOje-Bs61k8GW",
      "number": 165,
      "title": "Explore alternate implementation for callable type equivalence",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-03-21T03:35:01Z",
      "updated_at": "2025-11-18T16:10:20Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently, the general callable type uses a manual implementation to check whether the two types are equivalent (`is_equivalent_to`). This is required for two reasons:\n1. The type of the default values don't participate in checking for equivalence, it's only the optionality that participates i.e., is the parameter required for both callable types or not?\n2. The name of positional-only, variadic and keyword-variadic parameters don't participate in checking for equivalence\n\nRefer to https://github.com/astral-sh/ruff/pull/16698#discussion_r2003121350 for previous discussion.\n\nA possible option that's discussed in the above thread is to erase the information that doesn't participate in equivalence relation (above two points) when [constructing a `GeneralCallableType` from a function literal](https://github.com/astral-sh/ruff/blob/3b1e030fbbe586a2b8918d4f1c33cea710faa446/crates/red_knot_python_semantic/src/types.rs#L4375-L4383). This will mean that we can remove the manual implementation and it will then use the catch-all branch:\n\nhttps://github.com/astral-sh/ruff/blob/3b1e030fbbe586a2b8918d4f1c33cea710faa446/crates/red_knot_python_semantic/src/types.rs#L913-L913\n\nThis has the benefit that the equivalence is maintained at the type level. But, this does mean that (a) we'll need to make `name: Name` into `name: Option<Name>` to erase it or replace it with `Name(\"\")` (empty name seems error prone) and (b) use something else for the default type as `Type::Unknown` is not a static type, maybe just replace it with `None`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/165/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/166",
      "id": 3046359516,
      "node_id": "I_kwDOOje-Bs61k8Hc",
      "number": 166,
      "title": "Tracking issue for override-related checks (including the Liskov Substitution Principle)",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 15,
      "created_at": "2025-03-20T23:03:06Z",
      "updated_at": "2025-12-22T13:02:31Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 22,
        "completed": 4,
        "percent_completed": 18
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This means checking that subclass methods are subtypes of the superclass method they override, if any.\n\nSubclass property getters must return a subtype of the corresponding superclass property getters, and subclass property setters must accept a supertype of the corresponding superclass property setter.\n\nIf we model any mutable attribute as conceptually a property with getter and setter, where the setter accepts the same type that the getter returns, this implies that the type of mutable attributes must be invariant; that is, subclasses may neither widen nor narrow the type of the attribute. Pyright [models this correctly](https://pyright-play.net/?code=MYGwhgzhAEBCkFMBc0B06BQpIwMoFcAjACnggQEoV1UMtwpoBhJDad6ADxTITu0YARYkypsO3aAUIYgA); mypy [does not](https://mypy-play.net/?mypy=latest&python=3.12&gist=7aa8cc84b99db33bc8bf58e083aee2bf).\n\nSee https://github.com/astral-sh/ty/issues/167 for a demonstration of a particular case involving ClassVar.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/166/reactions",
        "total_count": 4,
        "+1": 4,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/169",
      "id": 3046359719,
      "node_id": "I_kwDOOje-Bs61k8Kn",
      "number": 169,
      "title": "Change range for `unresolved-attribute` error to attribute",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "1": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 3,
      "created_at": "2025-03-18T10:13:48Z",
      "updated_at": "2025-11-13T16:08:50Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The `unresolved-attribute` diagnostic currently highlights the entire attribute expression. I find this very noisy and the error, most of the time is with the attribute and not with the object. We could also use a secondary range to highlight the object's definition. \n\nWe should revisit the range of our unresolved-attribute diagnostics. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/169/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/86",
      "id": 3046314077,
      "node_id": "I_kwDOOje-Bs61kxBd",
      "number": 86,
      "title": "Code completion",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 9378884140,
          "node_id": "LA_kwDOOje-Bs8AAAACLwZqLA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/completions",
          "name": "completions",
          "color": "b3c77b",
          "default": false,
          "description": "Bugs or features relating to autocomplete suggestions"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {
        "0": {
          "login": "BurntSushi",
          "id": 456674,
          "node_id": "MDQ6VXNlcjQ1NjY3NA==",
          "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/BurntSushi",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 10,
      "created_at": "2025-03-14T10:18:02Z",
      "updated_at": "2025-12-31T15:21:15Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 2,
        "completed": 2,
        "percent_completed": 100
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Implement auto-completion support\n\n# Plan\n\nAt time of writing (2025-05-02), the plan below represents my best effort guess as to how we want to proceed here. The first few items are meant to correspond to lower hanging fruit.\n\nOne thing that is not really captured by the plan here, but I think may require some effort, is figuring out how best to identify what the current context is. I suspect there may be an easy way to start for specific cases, but the extent to which that works more generally is not totally clear to me yet.\n\n* [x] Add built-ins to code completions.\n* [x] Return all names from scopes in current module. [ref](https://github.com/astral-sh/ruff/pull/17744#discussion_r2069886060)\n* [x] Identify current scope and return names from just that scope.\n* [x] Identify a `Object.<typing>` context and return attributes on `Object`.\n* [x] Identify a `from module import <typing>` context and return items from `module`.\n* [x] Identify `import <typing>` and `import module.<typing>` contexts and return available modules.\n* [x] #1550\n* [x] [BETA] Add type signatures to completion suggestions\n* [x] [BETA] [For scope based completions, offer unimported symbols as suggestions. (And upon selection, add the required import.)](https://github.com/astral-sh/ty/issues/535)\n* [ ] Offer string literals based on type context.\n* [ ] Offer string literals based on `TypedDict` context.\n* [ ] Offer contextual language keywords in completions (e.g., `def` and `match`).\n* [ ] Offer completions for cases in `match` statements.\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/86/reactions",
        "total_count": 43,
        "+1": 34,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 2,
        "eyes": 7
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/174",
      "id": 3046360070,
      "node_id": "I_kwDOOje-Bs61k8QG",
      "number": 174,
      "title": "`ALL` rule selector",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-03-14T10:08:31Z",
      "updated_at": "2025-12-31T16:45:49Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Add support for an `all` rule group that allows selecting (enabling, ignoring) all rules",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/174/reactions",
        "total_count": 21,
        "+1": 21,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/175",
      "id": 3046360141,
      "node_id": "I_kwDOOje-Bs61k8RN",
      "number": 175,
      "title": "Hierarchical configuration",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-03-14T10:06:50Z",
      "updated_at": "2025-12-31T15:25:59Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "To be decided\n\nHierarchical configuration (knot.toml in any ancestor directory)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/175/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/181",
      "id": 3046360526,
      "node_id": "I_kwDOOje-Bs61k8XO",
      "number": 181,
      "title": "Infer `lambda` expression based on the surrounding context",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8595035111,
          "node_id": "LA_kwDOOje-Bs8AAAACAE3T5w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bidirectional%20inference",
          "name": "bidirectional inference",
          "color": "fbca04",
          "default": false,
          "description": "Inference of types that takes into account the context of a declared type or expected type"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-03-13T03:31:46Z",
      "updated_at": "2025-12-27T19:11:27Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 2,
        "completed": 1,
        "percent_completed": 50
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently, the inference of `lambda` expression is done in isolation which isn't very useful because parameters in a `lambda` expression cannot be annotated. For example,\n\n```py\nreveal_type(lambda x: x)  # revealed: (x) -> Unknown\n```\n\nHere, we infer the type of `x` parameter as `Unknown` and we also infer the return type as `Unknown` by default for now. But, consider the following example:\n\n```py\ndef foo(c: Callable[[int], str]):\n    return\n\nfoo(lambda x: x)\n```\n\nIn this case, as the `lambda` expression is used in the context of a `Callable` annotation, we can infer the argument type as `int` and thus the return type would be `int` as well but that is not assignable to the return type `str` as mentioned in the `Callable` annotation which should then raise an error.\n\nAnother example would be:\n```py\nf = lambda x: x\nreveal_type(f(1))\n```\n\nHere, as the lambda expression is being called with a `Literal[1]` parameter, the return type would be inferred as `Literal[1]` as well.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/181/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/187",
      "id": 3046360910,
      "node_id": "I_kwDOOje-Bs61k8dO",
      "number": 187,
      "title": "Verify file watching with windows UNC paths",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568542955,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmW6w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/windows",
          "name": "windows",
          "color": "0078d4",
          "default": false,
          "description": "Specific to the Windows platform"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-03-03T14:42:08Z",
      "updated_at": "2025-05-19T07:10:42Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Windows knows two representations for file paths: \n\n* DOS\n* UNC \n\nWe should test our file watcher to see if it returns UNC or regular paths if the input path is a DOS or UNC path. ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/187/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/189",
      "id": 3046361037,
      "node_id": "I_kwDOOje-Bs61k8fN",
      "number": 189,
      "title": "Path handling on non-case sensitive systems",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568515304,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkq6A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/cli",
          "name": "cli",
          "color": "EF2BB2",
          "default": false,
          "description": "Related to the command-line interface"
        },
        "1": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-02-26T15:12:14Z",
      "updated_at": "2025-11-18T16:10:21Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The project file discovery and the `Files` interner assume that two paths that only different in casing are two unique paths. However, this is not true on all file systems and it could result in Red Knot considering two files as being different even though they're the same on disk. \n\nWe should test how Red Knot handles paths with different casing on case-insensitive file systems (looking at you Windows). That also includes project file discovery.\n\nRelated to https://github.com/astral-sh/ruff/issues/13691",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/189/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/190",
      "id": 3046361113,
      "node_id": "I_kwDOOje-Bs61k8gZ",
      "number": 190,
      "title": "Use `try_call_dunder` infrastructure consistently",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-02-25T13:32:43Z",
      "updated_at": "2025-11-13T16:09:31Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Summary\r\n\r\n`__enter__` and `__exit__` should be treated like all other dunder methods. However, while working on astral-sh/ruff#16368, I noticed that we look them up manually (and potentially incorrectly) here …\r\n\r\nhttps://github.com/astral-sh/ruff/blob/1be0dc6885317340acdd3427aa43acc05e7a43d3/crates/red_knot_python_semantic/src/types/infer.rs#L1621-L1622\r\n\r\n… and call them manually (and potentially incorrectly) here:\r\n\r\nhttps://github.com/astral-sh/ruff/blob/1be0dc6885317340acdd3427aa43acc05e7a43d3/crates/red_knot_python_semantic/src/types/infer.rs#L1660-L1661\r\n\r\nThis only leads to incorrect behavior in very exotic situations like the following, where we incorrectly raise a *\"Object of type `Manager` cannot be used with `with` because it does not correctly implement `__enter__`\"* diagnostic:\r\n\r\n```py\r\nfrom __future__ import annotations\r\n\r\nclass Target: ...\r\n\r\nclass SomeCallable:\r\n    def __call__(self) -> Target:\r\n        return Target()\r\n\r\nclass Descriptor:\r\n    def __get__(self, instance, owner) -> SomeCallable:\r\n        return SomeCallable()\r\n\r\nclass Manager:\r\n    __enter__: Descriptor = Descriptor()\r\n\r\n    def __exit__(self, exc_type, exc_value, traceback): ...\r\n\r\nwith Manager() as f:\r\n    reveal_type(f)  # revealed: Target\r\n```\r\n\r\nFixing this would involve using `try_call_dunder` after astral-sh/ruff#16368 is merged, or using `static_member` + a manual descriptor call, if that is not possible.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/190/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/192",
      "id": 3046361225,
      "node_id": "I_kwDOOje-Bs61k8iJ",
      "number": 192,
      "title": "mdtest: implement auto-update for inline `# error: ` message assertions",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        },
        "1": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-02-24T19:44:54Z",
      "updated_at": "2025-11-18T16:10:21Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Description\n\nIt can be painful to manually update all the asserted error messages if the diagnostic message changes.\n\nOne way to mitigate this pain is by using full diagnostic snapshotting, but this currently puts the assertion in a separate file from the test (#16255) and even if it were inline, may be \"overkill\" for many tests, that hurts readability of the test.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/192/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/194",
      "id": 3046361367,
      "node_id": "I_kwDOOje-Bs61k8kX",
      "number": 194,
      "title": "Change `Type::member` to return a `Result` and rename it to `try_member`",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-02-21T09:31:05Z",
      "updated_at": "2025-11-13T06:27:30Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961576,
        "node_id": "IT_kwDOBulz184BEhJo",
        "name": "Task",
        "description": "A specific piece of work",
        "color": "yellow",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-07-26T14:46:11Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 1,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Description\n\nSimilar to `Type::try_call`, `try_iterate`, `try_bool`, ..., `member` should be renamed to `try_member` and return `Result`. \n\n* I don't think it should be `LookupResult`: Instead, it should be a result specific to `Type::member` because we may want to preserve additional error information for better diagnostics that isn't relevant when doing other symbol lookups. But I might be wrong here\n* I don't think `try_member` should return a `Symbol` because it behaves slightly different from all other type methods in that it doesn't necessarily consider a possibly unbound symbol as an error (but it probably is one for most type checking code). \n\nWe could offer helper methods to easily convert a `Result<Type, MemberError>` to a `Result<Type, LookupError>` or `Symbol` (e.g. implement `From` for `Result<Type, LookupError>` so that the `try` operator \"just works\").\n\n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/194/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/195",
      "id": 3046361432,
      "node_id": "I_kwDOOje-Bs61k8lY",
      "number": 195,
      "title": "add support for inline diagnostic snapshotting for `mdtest`",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        },
        "2": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        },
        "3": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 6,
      "created_at": "2025-02-19T14:57:16Z",
      "updated_at": "2025-11-18T16:10:21Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "## Summary\n\nAdd support for managing inline snapshots of Red Knot diagnostics to mdtests.\n\n## Background\n\nIn astral-sh/ruff#15945, we added support for diagnostic snapshotting to [Red Knot's Markdown test framework](https://github.com/astral-sh/ruff/blob/main/crates/red_knot_test/README.md). Basically, the snapshotting support lets you write something like this:\n\n``````\n## Unresolvable module import\n\n<!-- snapshot-diagnostics -->\n\n```py\nimport zqzqzqzqzqzqzq  # error: [unresolved-import] \"Cannot resolve import `zqzqzqzqzqzqzq`\"\n```\n``````\n\nAnd then if you run:\n\n```\n$ cargo insta test -p red_knot_python_semantic -- mdtest__\n```\n\nthe test runner will produce a snapshot of any diagnostics emitted by Red Knot on the Python code. This snapshot is then managed as an _external_ file by [`insta`](https://docs.rs/insta).\n\nThis works decently well, and it's better than _not_ having something like this, but it kinda inhibits the locality that is otherwise a huge benefit to mdtests. Instead of the diagnostic output being right there in the Markdown file, it's actually in a different snapshot file.\n\nNow, `insta` does support inline snapshots. For example, in _Rust code_, you can do this:\n\n```rust\ninsta::assert_snapshot!(\n    some_op_that_returns_a_string(),\n    @\"\",\n);\n```\n\nAnd when you run `cargo insta test`, it will automatically manage the string on the right side of the assertion, _in your source file_, just like it does for external snapshots.\n\nHowever, we want inline snapshots inside of Markdown files, which, AFAIK, `insta` does not support.\n\n## Proposed design\n\n### `mdtest` interaction\n\nI don't think [this design](https://github.com/astral-sh/ruff/blob/main/crates/red_knot_test/README.md#asserting-on-full-diagnostic-output) (originally @carljm AIUI) has explicit consensus from everyone on the Red Knot team (although I'm not aware of any specific objections to it), so it might require some iteration.\n\nThe idea here is that each mdtest would support an optional `output` code fence block (at most 1). And when present, the contents of that `output` block would be treated as an inline diagnostic snapshot. So the above example might look like this:\n\n``````\n## Unresolvable module import\n\n```py\nimport zqzqzqzqzqzqzq  # error: [unresolved-import] \"Cannot resolve import `zqzqzqzqzqzqzq`\"\n```\n\n```output\nerror: lint:unresolved-import\n --> /home/andrew/astral/ruff/play/diags/play/test.py:1:8\n  |\n1 | import zqzqzqzqzqzqzq  # error: [unresolved-import] \"Cannot resolve import `zqzqzqzqzqzqzq`\"\n  |        ^^^^^^^^^^^^^^ Cannot resolve import `zqzqzqzqzqzqzq`\n  |\n```\n``````\n\nIn contrast to the mdtest README, I propose starting with just one `output` code fence block that captures the full diagnostic output of _all_ preceding _and_ following Python files. This is how the existing external snapshotting mechanism works. We can consider adding more granular testing in the future, but I think starting with something that just always captures the full diagnostic output is simplest and most useful for now.\n\n## Snapshot management\n\nI think this is probably the hardest part of this task and has the least thought put into it. So this section is pretty vague. But a critical part of snapshot testing is the tooling that surrounds the management of the snapshots. `cargo insta` is a decent model to follow. Everyone here at Astral uses it, and AFAIK, folks generally like it.\n\nInline snapshots do have a bit of a conceptually simpler model than external snapshots. For example, you don't need to worry about \"unreferenced\" snapshots (snapshot files that exist but which aren't connected to any actual test). But I believe these are the minimal operations that need to be supported:\n\n* An actual assertion needs to be made to check whether the expected output matches the generated output. Bonus points for making an assertion failure look nice with a pleasant diff.\n* When an assertion fails, the snapshot tooling provides a convenient way to update the _expected output_ inside the mdtest file with the output that was generated.\n\nWith that said, having to use two different snapshot test tools is undeniably annoying. So I think the gold standard implementation here would be to find a way to make this use case work with `cargo insta` itself. Possibly by working with upstream. (cc @mitsuhiko) I wouldn't be surprised if this wasn't feasible though. My guess is that `cargo insta`'s inline snapshot mechanism is probably tightly coupled with Rust source code (which makes sense).\n\nIf we can't make integration with `cargo insta` work, then here is what I propose as a starting point:\n\n* Assertions use the [`similar`](https://docs.rs/similar/) crate (or something like it) to produce nice output when a snapshot test fails.\n* An environment variable (e.g., `MDTEST_SNAPSHOT_UPDATE`) specifies how to deal with snapshot test failures. It has two values: `no` and `always`. The default is `no`, which results in a test failure when the expected and generated outputs do not match. When set to `always`, the snapshot in the file is rewritten with whatever the generated output is and the test always passes.\n\nNotably absent from this proposal is any sort of review mechanism. I think this is a _nice to have_. Instead, since these are inline snapshots only, we can treat the output of `cargo insta test -p red_knot_python_semantic -- mdtest_` as our review mechanism. And if we only want to accept a single snapshot, we can do something like, `MDTEST_SNAPSHOT_UPDATE=always cargo insta test -p red_knot_python_semantic -- mdtest__diagnostics_invalid_argument_type`. This workflow is _not_ as nice as `cargo insta` because it doesn't de-couple test execution from snapshot updating. And it also doesn't permit updating individual `output` blocks, since I believe all mdtests in a single file get grouped together into a single Rust `#[test]` execution. So... there are definitely some shortcomings, but I think this might be a good state for an MVP that we can iterate on.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/195/reactions",
        "total_count": 3,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 3,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/196",
      "id": 3046361513,
      "node_id": "I_kwDOOje-Bs61k8mp",
      "number": 196,
      "title": "Check the return type of dunder methods",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2025-02-19T10:13:21Z",
      "updated_at": "2025-05-11T07:25:17Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Description\n\nDunder methods like `__bool__`, `__len__` (and binary/compare?) should return a value that is assignable to what's expected by their \"convention\". We currently don't check this. \n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/196/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/200",
      "id": 3046361779,
      "node_id": "I_kwDOOje-Bs61k8qz",
      "number": 200,
      "title": "Add `implicit-reexport` rule for runtime files",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8580601995,
          "node_id": "LA_kwDOOje-Bs8AAAAB_3GYiw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/imports",
          "name": "imports",
          "color": "aaaaaa",
          "default": false,
          "description": "Module resolution, site-packages discovery, import-related diagnostics"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-02-14T09:50:36Z",
      "updated_at": "2025-11-18T16:10:21Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Description\n\nFollow-up from https://github.com/astral-sh/ruff/issues/14099 which was closed by astral-sh/ruff#16073 which adds support for re-export conventions in stub files unconditionally.\n\nWe should add a new lint rule `implicit-reexport` which is:\n* Disabled by default\n* When enabled, performs the check for runtime files\n\nFor stub files, the implementation is such that it will ignore the symbol if it's not being re-exported which means that the symbol could be unbound as seen in [these tests](https://github.com/astral-sh/ruff/blob/60b3ef2c985dba405db58a72bc6f22ff64c249fa/crates/red_knot_python_semantic/resources/mdtest/import/conventions.md). But, for runtime files, we should be inferring the types correctly.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/200/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/201",
      "id": 3046361847,
      "node_id": "I_kwDOOje-Bs61k8r3",
      "number": 201,
      "title": "Warn about too old python-version",
      "user": {
        "login": "MichaReiser",
        "id": 1203881,
        "node_id": "MDQ6VXNlcjEyMDM4ODE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/MichaReiser",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568516490,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkvig",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/configuration",
          "name": "configuration",
          "color": "D4C5F9",
          "default": false,
          "description": "Related to settings and configuration"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 0,
      "created_at": "2025-02-11T10:57:26Z",
      "updated_at": "2025-11-13T17:34:28Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "It might be good to print a warning to the terminal if we resolve the user's configuration settings to a `requires-python` version less than typeshed's oldest supported version. Typeshed exposes this information in [this field here](https://github.com/python/typeshed/blob/24c78b9e0dff457275092025a14387dac206f5d6/pyproject.toml#L173-L174) in its pyproject.toml file (the intention is that it could be used by tools vendoring typeshed as well as by typeshed's internal tools). It doesn't look like we currently vendor typeshed's pyproject.toml file as part of our typeshed syncs, but we could easily start doing so. The reason why I think we should print a warning is that people might think that we'll accurately understand the Python 3.7 stdlib if they put `requires-python = \">= 3.7\"` in their pyproject.toml file -- but we won't, because typeshed deleted the pre-Python-3.8 branches when it dropped support for Python 3.7. The reason why it should be a suppressible warning rather than an error is that the user might have Python <3.8 branches in their own code.\r\n\r\n_Originally posted by @AlexWaygood in https://github.com/astral-sh/ruff/pull/16028#discussion_r1950623156_\r\n            ",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/201/reactions",
        "total_count": 3,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 2,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/202",
      "id": 3046361920,
      "node_id": "I_kwDOOje-Bs61k8tA",
      "number": 202,
      "title": "Disjointness of complements",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        },
        "1": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2025-02-10T20:13:32Z",
      "updated_at": "2025-11-18T16:10:22Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Description\n\nThe complement `~T` of a type is disjoint from the type `T` itself. In fact, it is disjoint from all subtypes of `S <: T`.\r\n\r\nIt is rather straightforward to implement this. The problem I am facing is that this leads to new property test failures, because it breaks the symmetry of the is-disjoint-from relation when done naively.\r\n\r\nThe reason for that are pairs like `T & Any` and `~T`. In one direction, if we check if `T & Any` is disjoint from `~T`, we start by checking if any positive element of the intersection `T & Any` is disjoint from `~T`. And since `T` is disjoint from `~T` according to this new check, we return `true`, as we should.\r\n\r\nBut when we check if `~T` is disjoint from `T & Any`, we have no positive elements in the left-hand side intersection. The only remaining check is therefore the new check which tries if `T & Any` is a subtype of `T`. This is not the case, because `T & Any` is not fully-static. But if feels like this \"is-subtype-of\" relation in the check could be replaced by a subtyping-relation on gradual types that would check if *all* materializations of `S` are subtypes of all materializations of `T` (which is different from the consistent-subtype relation on gradual types).\r\n\r\n---\r\n\r\nFor context, this came up when trying to write the following test that intends to demonstrate that `AlwaysTruthy`/`AlwaysFalys` are disjoint from `AmbiguousTruthiness`\r\n```py\r\ntype Truthy = Not[AlwaysFalsy]\r\ntype Falsy = Not[AlwaysTruthy]\r\n\r\ntype AmbiguousTruthiness = Intersection[Truthy, Falsy]\r\n\r\nstatic_assert(is_disjoint_from(AlwaysTruthy, AmbiguousTruthiness))\r\nstatic_assert(is_disjoint_from(AlwaysFalsy, AmbiguousTruthiness))\r\n```\r\n\r\n![image](https://github.com/user-attachments/assets/55f4c7b2-86d3-4aac-847d-65ac009ebafe)",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/202/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/204",
      "id": 3046362095,
      "node_id": "I_kwDOOje-Bs61k8vv",
      "number": 204,
      "title": "consider fixing spans related to relative imports",
      "user": {
        "login": "BurntSushi",
        "id": 456674,
        "node_id": "MDQ6VXNlcjQ1NjY3NA==",
        "avatar_url": "https://avatars.githubusercontent.com/u/456674?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/BurntSushi",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8568519483,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rk7Ow",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/diagnostics",
          "name": "diagnostics",
          "color": "ffa500",
          "default": false,
          "description": "Related to reporting of diagnostics."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-02-05T18:45:30Z",
      "updated_at": "2025-11-18T16:10:22Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Description\n\nThis issue originally sprouted from here: https://github.com/astral-sh/ruff/pull/15976#discussion_r1943452993\n\nConsider this Python program:\n\n```py\nfrom ...zqzqzqzq import hi\n```\n\nRunning red-knot at present gives you this:\n\n```\n$ run-red-knot -q pr1 -- check\nerror: lint:unresolved-import\n --> /home/andrew/astral/ruff/play/diags/play/test.py:1:9\n  |\n1 | from ...zqzqzqzq import hi\n  |         ^^^^^^^^ Cannot resolve import `...zqzqzqzq`\n  |\n```\n\nThe range here is a little inconsistent with the actual message. The range is only on the module name, but the message includes the preceding `...`. Indeed, if we futz with the Python program a bit more, we can somewhat observe what's going wrong:\n\n```py\nfrom . . . zqzqzqzq import hi\n```\n\nGives this:\n\n```\n$ run-red-knot -q pr1 -- check\nerror: lint:unresolved-import\n --> /home/andrew/astral/ruff/play/diags/play/test.py:1:12\n  |\n1 | from . . . zqzqzqzq import hi\n  |            ^^^^^^^^ Cannot resolve import `...zqzqzqzq`\n  |\n```\n\nHere, the diagnostic message is showing something that does not match the actual source code.\n\nI believe the underlying problem is the AST definition of a `from import`:\n\nhttps://github.com/astral-sh/ruff/blob/a84b27e679137697bdb994e9c5f79d366fb4a945/crates/ruff_python_ast/src/nodes.rs#L291-L298\n\nNamely, it normalizes the level based on the preceding dots. But in doing so, this drops the range associated with the dots.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/204/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/206",
      "id": 3046362262,
      "node_id": "I_kwDOOje-Bs61k8yW",
      "number": 206,
      "title": "Diagnostic for conflicting declared attribute types",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239607,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPtw",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/help%20wanted",
          "name": "help wanted",
          "color": "64215A",
          "default": true,
          "description": "Contributions especially welcome"
        },
        "1": {
          "id": 8594481077,
          "node_id": "LA_kwDOOje-Bs8AAAACAEVftQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/typing%20semantics",
          "name": "typing semantics",
          "color": "fef2c0",
          "default": false,
          "description": "typing-module features, spec compliance, etc"
        },
        "2": {
          "id": 8594530146,
          "node_id": "LA_kwDOOje-Bs8AAAACAEYfYg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/attribute%20access",
          "name": "attribute access",
          "color": "fbca04",
          "default": false,
          "description": "Instance attributes, class attributes, etc."
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 8,
      "created_at": "2025-02-05T11:58:19Z",
      "updated_at": "2025-06-04T16:05:44Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We should emit a diagnostic when we see conflicting declared types of attributes, either between the declaration in the class body and declarations in a method, or between annotated assignments in different methods. We have existing tests for this scenario (see `TODO` comments):\r\n\r\nhttps://github.com/astral-sh/ruff/blob/eb08345fd5434ed3db243233df6dd91757a6af3b/crates/red_knot_python_semantic/resources/mdtest/attributes.md?plain=1#L212-L226\r\n\r\npart of: https://github.com/astral-sh/ruff/issues/14164",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/206/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/208",
      "id": 3046362422,
      "node_id": "I_kwDOOje-Bs61k802",
      "number": 208,
      "title": "make it easier to avoid accidental cross-module direct AST usage",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        },
        "1": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 2,
      "created_at": "2025-02-04T20:55:02Z",
      "updated_at": "2025-05-19T07:10:14Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Description\n\nAs a general principle, we should never have type inference in one module depend directly on the AST of another module, without going through a cached Salsa query that abstracts the contents of the other module to the `Type` level. Otherwise, a changed AST in one module will have too much blast radius invalidating types in other modules.\n\nToday, we have to enforce this manually (mostly via @MichaReiser code review). It would be ideal if we could use types/visibility/modules to provide better enforcement of this rule, or failing that, at least easier human review, assisted by some clear guidelines about what kind of code should be expected where.\n\nThis is an open-ended issue to explore how we could do that, and implement something in this direction.\n\nA related existing guideline we have is that methods on `Type` should operate on types, and not on ASTs, and methods on `TypeInferenceBuilder` should operate on the AST (but always of only one module). Types can cross module boundaries; ASTs should not.\n\nSome types (e.g. class and function literals) maintain internal reference to ASTs, so that information (e.g. attributes) can be resolved lazily. In this case, we need to ensure that that lazy resolution is fully protected by Salsa queries, so users of the type in another module don't adopt a direct cross-module AST dependency.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/208/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/213",
      "id": 3046362806,
      "node_id": "I_kwDOOje-Bs61k862",
      "number": 213,
      "title": "expression-level type coverage measurement",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {},
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2025-01-23T17:17:14Z",
      "updated_at": "2025-11-18T16:10:22Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "### Description\n\nReal-world type-checker users often want to get a sense of how well-covered their code is with static types. One granular way to measure this is \"percentage of expressions typed with a dynamic type\".\n\nWe would also have an internal use case for measuring \"percentage of expressions typed with a Todo type\" as a measure of red-knot progress.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/213/reactions",
        "total_count": 8,
        "+1": 8,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/215",
      "id": 3046363007,
      "node_id": "I_kwDOOje-Bs61k89_",
      "number": 215,
      "title": "`tuple & AlwaysFalsy` should simplify to `tuple[()]`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        },
        "2": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 5,
      "created_at": "2025-01-16T10:28:50Z",
      "updated_at": "2025-08-22T13:11:42Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Here's what these types represent:\n- `tuple`: the set of all possible runtime instances of the class `tuple` (including instances of tuple subclasses)\n- `AlwaysFalsy`: the set of all possible runtime objects whose truthiness can be statically determined to always be false\n- `tuple[()]`: the set of all possible zero-length tuples (including zero-length instances of tuple subclasses)\n- `tuple & AlwaysFalsy`: the set of all possible runtime instances of the class `tuple` (including instances of tuple subclasses) whose truthiness can be statically determined to always be false\n\nTuple instances (and instances of any tuple subclass, assuming the subclass conforms to the Liskov principle) are only ever falsy if they are 0-length, so the set of possible objects represented by `tuple & AlwaysFalsy` is exactly the same as the set of possible objects represented by `tuple[()]`. ~~By the same token, `tuple & ~AlwaysTruthy` should also simplify to `tuple[()]`~~.\n\nThe same can _not_ be said for things like `bytes & AlwaysFalsy` (this does _not_ simplify to `Literal[b\"\"]`), because `bytes` can be subclassed, and instances of `bytes` subclasses can also be falsy if they are empty bytestrings, but for a type to inhabit a literal `bytes` type its `__class__` must be exactly `bytes`, not a subclass of `bytes`. Heterogeneous tuple types are different from `Literal` types in this way, in that they can be inhabited by subclasses of `tuple` as well as literal tuples.\n\nWe should adapt the logic in `InnerIntersectionBuilder` to eagerly perform this simplification when we see the intersection `tuple & AlwaysFalsy`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/215/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/216",
      "id": 3046363165,
      "node_id": "I_kwDOOje-Bs61k9Ad",
      "number": 216,
      "title": "`AlwaysTruthy | bool` is equivalent to `AlwaysTruthy | Literal[False]`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPpA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/bug",
          "name": "bug",
          "color": "d73a4a",
          "default": true,
          "description": "Something isn't working"
        },
        "1": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {
        "0": {
          "login": "AlexWaygood",
          "id": 66076021,
          "node_id": "MDQ6VXNlcjY2MDc2MDIx",
          "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/AlexWaygood",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 11,
      "created_at": "2025-01-15T20:17:50Z",
      "updated_at": "2025-11-13T00:40:47Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "This equivalence follows from the fact that `bool` is equivalent to `Literal[True] | Literal[False]` and from the fact that `Literal[True]` is a subtype of `AlwaysTruthy`. A proof of the fact that these are equivalent can be found in the fact that there are two ways that the union `Literal[False] | Literal[True] | AlwaysTruthy` could be validly simplified:\n\n- `(Literal[False] | Literal[True]) | AlwaysTruthy` -> `bool | AlwaysTruthy`\n- `Literal[False] | (Literal[True] | AlwaysTruthy)` -> `Literal[False] | AlwaysTruthy`\n\nWe don't currently recognise that `AlwaysTruthy | bool` and `AlwaysTruthy | Literal[False]` are equivalent types; this should be fixed.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/216/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/222",
      "id": 3046363609,
      "node_id": "I_kwDOOje-Bs61k9HZ",
      "number": 222,
      "title": "`type[Any]` is equivalent to `type & Any`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        },
        "1": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2025-01-09T18:29:51Z",
      "updated_at": "2025-11-18T16:10:22Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "The type `type[Any]` is exactly equivalent to `type & Any` (or `type[object] & Any`). Conceptually, these are all equivalent spellings of \"a type of unknown size and bounds, but which is known to be no larger than the type `type`[^1]\". By the same token, `type[Unknown]` is equivalent to `type & Unknown`; `type[@Todo(\"do the thing\")]` is equivalent to `type & @Todo(\"do the thing\")`.\n\nWe currently represent `type[Any]` and `type & Any` using different internal representations in red-knot. We should fix this: equivalent types should have the same internal representation in our model. This helps avoid unnecessary overhead, and also reduces the internal complexity in our model.\n\nOf the two representations, the `type & Any` representation is the better one for us internally, because it's a more general way of representing the type and will allow us to get rid of more complexity in our internal model. However, when _displaying_ the type to users (for example, in the output of `reveal_type`), we should continue to use the notation `type[Any]`, or we'll end up with highly confusing outcomes like this:\n\n```py\nfrom typing import Any\n\ndef f(x: type[Any]):\n    reveal_type(x)  # type & Any. User is now very confused.\n```\n\nImplementing this will require some special-casing in `Type::display()`. We'll want to make sure that the special-casing is also able to understand that `type & Any & T` should be represented as `type[Any] & T` when displayed to the user.\n\n[^1]: The type `type`, of course, describes \"All possible instances of the class `type`\". It is exactly equivalent to the type `type[object]`, which describes \"All possible subclasses of the class `object`\".",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/222/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/223",
      "id": 3046363683,
      "node_id": "I_kwDOOje-Bs61k9Ij",
      "number": 223,
      "title": "Document public parts of ty_extensions API",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8551239594,
          "node_id": "LA_kwDOOje-Bs8AAAAB_bGPqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/documentation",
          "name": "documentation",
          "color": "0075ca",
          "default": true,
          "description": "Improvements or additions to documentation"
        },
        "1": {
          "id": 8568526506,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlWqg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/needs-design",
          "name": "needs-design",
          "color": "F9D0C4",
          "default": false,
          "description": "Needs further design before implementation"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/4",
        "id": 12854893,
        "node_id": "MI_kwDOOje-Bs4AxCZt",
        "number": 4,
        "title": "Stable",
        "description": "",
        "creator": {
          "login": "MichaReiser",
          "id": 1203881,
          "node_id": "MDQ6VXNlcjEyMDM4ODE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1203881?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/MichaReiser",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 345,
        "closed_issues": 166,
        "state": "open",
        "created_at": "2025-05-07T15:03:56Z",
        "updated_at": "2026-01-10T19:36:00Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 9,
      "created_at": "2025-01-08T14:09:25Z",
      "updated_at": "2026-01-09T22:41:50Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Quoting some comments that were spread over multiple threads in [this PR](https://github.com/astral-sh/ruff/pull/15103):\n\n@MichaReiser \n\n> What are your thoughts on whether we should gate this behind a feature or make it testing only?\n\n@sharkdp \n\n> Seeing that mypy and pyre have similar public APIs, I could imagine (part of) this becoming a public API for red knot that isn't feature-gated? The `Intersection`/`Not` constructors and `static_assert` are potentially interesting for users which don't care too much about compatibility with other type checkers (cf https://github.com/python/typing/issues/213). Some less-interesting parts like `is_singleton` could also be moved to `knot_extensions.internal` maybe?\n\n> Do we need to decide this right away? If not, can this stay public for now, or should we approach it very carefully and hide everything (by default)?\n\n@MichaReiser \n\n> I'm generally leaning toward keeping the API intentionally limited and only expose features that we want to support long term (and consider part of the public API) because users will using them and it's very easy that we forget to revisit this decision before the release (unless we note it down somewhere?)\n\n@carljm \n\n> For what it's worth, there's nothing in the API added in this PR that I have reservations about supporting long-term as public API, in principle. Of course it's always possible that we realize we made mistakes in details of how we defined or named the API, and we want to change these things in future and potentially have to take backward-compatibility into account with those changes. But this is inevitable.\n\nAnd another comment by @carljm regarding how this could be implemented technically:\n\n> I think whatever feature gating we do should probably not happen at the Rust implementation level (that is, trying to turn off or on certain Rust code paths in type inference), but rather at the Python level; that is, in the type stub for the knot_extensions module. This could mean only conditionally including the type stub for knot_extensions at all, or having some conditional definitions of things in the type stub. If you can't import the known-function and known-instance types that make up the type API, then it doesn't matter whether the code paths exist for those; you won't be able to enter those code paths anyway.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/223/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/224",
      "id": 3046363762,
      "node_id": "I_kwDOOje-Bs61k9Jy",
      "number": 224,
      "title": "simplify across intersections in a union",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8594402784,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQt4A",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/set-theoretic%20types",
          "name": "set-theoretic types",
          "color": "34ABE8",
          "default": false,
          "description": "unions, intersections and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 11,
      "created_at": "2024-12-16T18:55:18Z",
      "updated_at": "2025-11-18T16:10:23Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "When we add multiple intersection types to a union, we miss some opportunities to simplify across those intersections.\n\nIf two intersections in a union share the same `positive` elements, and they have negative elements that are disjoint from each other, the disjoint negative elements can be removed entirely.\n\nAssume that `X` and `Y` are disjoint types:\n\nWe can transform `(A & ~X) | (A & ~Y)` to `A`.\n\nSimilarly we can transform `(A & B & ~X) | (A & B & ~Y)` to `A & B`.\n\nAnd if we have `(A & ~X & ~Z) | (A & ~Y & ~Z)`, this can become `A & ~Z`.\n\nIn some cases we can eliminate them and it doesn't result in simplifying the union away. For example (assuming `T` and `U` are not disjoint from each other) `(A & ~X & ~T) | (A & ~Y & ~U)` can become `(A & ~T) | (A & ~U)`.\n\nHere's a test:\n\n```py\ndef f(x: int, y: int, flag: bool):\n    if x != 1 and y != 2:\n        reveal_type(x)  # revealed: int & ~Literal[1]\n        reveal_type(y)  # revealed: int & ~Literal[2]\n        z = x if flag else y\n        reveal_type(z)  # revealed: int\n```\n\nCurrently on the last line we reveal `int & ~Literal[1] | int & ~Literal[2]`, when it should just be `int`.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/224/reactions",
        "total_count": 2,
        "+1": 2,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/225",
      "id": 3046363837,
      "node_id": "I_kwDOOje-Bs61k9K9",
      "number": 225,
      "title": "Control flow modelling error in `try` ... `else`",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 4,
      "created_at": "2024-12-11T11:06:23Z",
      "updated_at": "2025-11-25T12:20:34Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://github.com/astral-sh/ty/issues/233 mentions a problem with `finally` suites, but it looks like we also don't model `try` … `else` control flow correctly in all cases.\n\nWe currently infer `Literal[1, 2, 3]` here, but it should be `Literal[1, 3]`?\n\n```py\ndef may_raise() -> None: ...\ndef flag() -> bool: ...\n\nx = 1\n\ntry:\n    may_raise()\n    x = 2\nexcept KeyError:\n    pass\nelse:\n    x = 3\n\nreveal_type(x)  # revealed: Literal[1, 2, 3]\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/225/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/227",
      "id": 3046363983,
      "node_id": "I_kwDOOje-Bs61k9NP",
      "number": 227,
      "title": "Do not treat nominal types inheriting from `Any` as fully static",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8592562866,
          "node_id": "LA_kwDOOje-Bs8AAAACACgasg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/type%20properties",
          "name": "type properties",
          "color": "E5A2EC",
          "default": false,
          "description": "subtyping, assignability, equivalence, and more"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2024-12-04T16:15:41Z",
      "updated_at": "2025-11-18T16:10:23Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "We currently don't understand that classes like `class C(Any): ...` represent non-fully-static types. This is captured in the following TODO comment:\n\nhttps://github.com/astral-sh/ruff/blob/af43bd4b0fa5fdf016252085771cfb75846a0b0c/crates/red_knot_python_semantic/src/types.rs#L1031-L1044\n\nSee also the discussion [here](https://github.com/astral-sh/ruff/pull/14758#discussion_r1868436510) and a prior attempt at solving this (including a test) in this commit: https://github.com/astral-sh/ruff/commit/ec64bd840393aa908445720df9236b9cc11f0fb2\n\nThis is currently blocked on astral-sh/ty#230 \n\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/227/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/229",
      "id": 3046364123,
      "node_id": "I_kwDOOje-Bs61k9Pb",
      "number": 229,
      "title": "Inconsistency between unbound and undeclared symbols",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 1,
      "created_at": "2024-11-12T12:57:19Z",
      "updated_at": "2025-11-18T16:10:24Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Pretty much what @carljm wrote in a comment [here](https://github.com/astral-sh/ruff/pull/13980#discussion_r1824747585), and what is now described in this TODO comment:\r\n\r\nhttps://github.com/astral-sh/ruff/blob/13a1483f1e51087d7c95922a6b3d2914ac2b68c3/crates/red_knot_python_semantic/src/types.rs#L80-L93\r\n\r\nI'm opening this as a ticket as there seems to be an open discussion point regarding the desired behavior:\r\n\r\n> Possibly the behavior here should differ depending on whether we are importing from a stub or a regular Python module? But an argument could be made that even in a regular Python module, if it declares x: int at module level, we should just trust that and not require that we can see the binding of it.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/229/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/232",
      "id": 3046364321,
      "node_id": "I_kwDOOje-Bs61k9Sh",
      "number": 232,
      "title": "cyclic control flow for loops",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "oconnor663",
        "id": 860932,
        "node_id": "MDQ6VXNlcjg2MDkzMg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/860932?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/oconnor663",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "oconnor663",
          "id": 860932,
          "node_id": "MDQ6VXNlcjg2MDkzMg==",
          "avatar_url": "https://avatars.githubusercontent.com/u/860932?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/oconnor663",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 4,
      "created_at": "2024-11-07T15:27:26Z",
      "updated_at": "2025-12-23T15:15:12Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently we don't even model control flow back edges in loops (because they will often lead to inference cycles). Once we have fixpoint iteration support in Salsa, we need to add these back edges and tests for them, including cases where we have to fallback to avoid runaway fixpoint iteration, e.g.:\r\n\r\n```py\r\nx = 0\r\nfor _ in range(y):\r\n    x += 1\r\n```",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/232/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/233",
      "id": 3046364392,
      "node_id": "I_kwDOOje-Bs61k9To",
      "number": 233,
      "title": "Properly model control flow through `finally` suites",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8593153874,
          "node_id": "LA_kwDOOje-Bs8AAAACADEfUg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/control%20flow",
          "name": "control flow",
          "color": "bfdadc",
          "default": false,
          "description": ""
        },
        "1": {
          "id": 8594400507,
          "node_id": "LA_kwDOOje-Bs8AAAACAEQk-w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/runtime%20semantics",
          "name": "runtime semantics",
          "color": "fef2c0",
          "default": false,
          "description": "Accurate modeling of how Python's semantics work at runtime"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-10-31T12:09:49Z",
      "updated_at": "2025-11-18T16:10:24Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "`finally` suites in `try`/`except` blocks have very complex control flow, which we don't yet model, and need to.\r\n\r\nI've already written extensively about the complexities of `finally` blocks, so I won't try to summarise them again here. Instead, I'll point to:\r\n- This TODO comment here: https://github.com/astral-sh/ruff/blob/76e4277696e8b34b771d554f8f0d07054d413289/crates/red_knot_python_semantic/src/semantic_index/builder.rs#L929-L939\r\n- The various `finally`-related TODO comments in our exception-handler control-flow test suite, from this point onwards: https://github.com/astral-sh/ruff/blob/main/crates/red_knot_python_semantic/resources/mdtest/exception/control_flow.md#exception-handlers-with-finally-branches-but-no-except-branches\r\n- The full writeup of exception-handler control flow I put together here: https://astral-sh.notion.site/Exception-handler-control-flow-11348797e1ca80bb8ce1e9aedbbe439d\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/233/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/234",
      "id": 3046364474,
      "node_id": "I_kwDOOje-Bs61k9U6",
      "number": 234,
      "title": "Improve test coverage for edge cases involving `--typeshed`",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-10-31T11:34:12Z",
      "updated_at": "2025-11-18T16:10:24Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "red-knot allows users to specify a custom typeshed using `--typeshed`, but we currently have poor test coverage for cases where a custom typeshed means that builtin or stdlib symbols aren't available to us as a result of this. We should improve our coverage here -- for example, what happens to our binary arithmetic logic if we're in a world where there's no `builtins.int` symbol available to us? (I have no idea.)\n\nWe have _some_ test cases for this scenario here, but we need more:\n\nhttps://github.com/astral-sh/ruff/blob/76e4277696e8b34b771d554f8f0d07054d413289/crates/red_knot_python_semantic/src/types/infer.rs#L4570-L4603\n\nIt will be easier to add tests for this scenario once we've implemented support for custom typeshed directories in mdtest.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/234/reactions",
        "total_count": 1,
        "+1": 1,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/235",
      "id": 3046364548,
      "node_id": "I_kwDOOje-Bs61k9WE",
      "number": 235,
      "title": "mdtest output in CI isn't colourised",
      "user": {
        "login": "AlexWaygood",
        "id": 66076021,
        "node_id": "MDQ6VXNlcjY2MDc2MDIx",
        "avatar_url": "https://avatars.githubusercontent.com/u/66076021?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/AlexWaygood",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568541133,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmPzQ",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/testing",
          "name": "testing",
          "color": "BFD4F2",
          "default": false,
          "description": "Related to testing ty itself"
        },
        "1": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-10-26T18:56:12Z",
      "updated_at": "2025-11-18T16:10:24Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "If you run `cargo test -p red_knot_python_semantic` locally and an mdtest fails, you get nice pretty colours that make the test output much more readable, eg.:\r\n\r\n![image](https://github.com/user-attachments/assets/079398d6-93e9-4957-8b1a-c39b2f1ab7e7)\r\n\r\nBut if you run `cargo test` (rather than `cargo test -p red_knot_python_semantic`) or `cargo nextest` (which is what we do in CI), the output isn't colourised, which makes the output much harder to read: https://github.com/astral-sh/ruff/actions/runs/11530541010/job/32100248614?pr=13918\r\n\r\nThis is because some of the other crates enable the `\"no_color\"` feature of the `colored` dependency, which is how we add colours to the output of mdtest: https://github.com/astral-sh/ruff/blob/b6ffa51c164e3898862c565ec860bbca928ddee9/crates/ruff_linter/Cargo.toml#L77-L78\r\n\r\nWhen you run all the tests together, that feature ends up being enabled, meaning no mdtest colours. It would be great if we could see if there was a way of having coloured output for mdtest in CI without breaking the tests for those other crates.\r\n\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/235/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/242",
      "id": 3046366620,
      "node_id": "I_kwDOOje-Bs61k92c",
      "number": 242,
      "title": "ensure that type inference on a high-durability file is also high durability",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 3,
      "created_at": "2024-08-30T19:50:15Z",
      "updated_at": "2025-05-07T15:27:38Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "If we can ensure this is the case, it should help our incremental inference perform better.\r\n\r\nOne issue here is that low-durability files (in your workspace) can shadow high-durability files (in the stdlib), and in principle this could impact the type inference in the stdlib. This means that any `resolve_module` is (I think) currently a low-durability query, because it will always access some low-durability import search paths.\r\n\r\nIf it helps performance enough, we could decide that we never want type inference within the stdlib to respect shadowed stdlib modules, so that we can keep type inference of the stdlib all high-durability, and not need to revalidate it in depth on incremental changes to user code.\r\n\r\nThis maybe should go hand-in-hand with always warning or erroring if a user module _does_ shadow a stdlib module.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/242/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/89",
      "id": 3046314526,
      "node_id": "I_kwDOOje-Bs61kxIe",
      "number": 89,
      "title": "LSP: Support Workspace folders",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "Gankra",
          "id": 1136864,
          "node_id": "MDQ6VXNlcjExMzY4NjQ=",
          "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/Gankra",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "milestone": {
        "url": "https://api.github.com/repos/astral-sh/ty/milestones/6",
        "id": 14395342,
        "node_id": "MI_kwDOOje-Bs4A26fO",
        "number": 6,
        "title": "Pre-stable 1",
        "description": "",
        "creator": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "open_issues": 69,
        "closed_issues": 24,
        "state": "open",
        "created_at": "2025-12-19T23:37:16Z",
        "updated_at": "2026-01-10T08:51:56Z",
        "due_on": null,
        "closed_at": null
      },
      "comments": 2,
      "created_at": "2024-08-22T10:54:15Z",
      "updated_at": "2026-01-09T03:46:33Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": {
        "id": 17961582,
        "node_id": "IT_kwDOBulz184BEhJu",
        "name": "Feature",
        "description": "A request, idea, or new functionality",
        "color": "blue",
        "created_at": "2024-02-14T14:00:35Z",
        "updated_at": "2024-10-08T20:33:18Z",
        "is_enabled": true
      },
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "https://github.com/astral-sh/ruff/pull/13041 restricts the red knot server to only work when there's only one workspace opened in the editor. We should add support for multi-root workspaces.\r\n\r\nThe challenge here is that which workspace should the untitled / non-workspace files belong to.\r\n\r\nCurrently, we've made an assumption that any untitled files or non-workspace files are part of the only available workspace. When multi-root workspaces are supported, we need to make sure the user experience is still good and find a way to provide intellisense for non-workspace / untitled files when there are multiple workspaces.\r\n\r\nOne solution is to implement an ad-hoc database where these files would go but this limits the user experience because we won't be able to resolve the virtual environment for a workspace thus not able to provide any intellisense features for third-party libraries.\r\n\r\nThe implementation should also consider the fact that workspaces can be added / removed while the server is active. This is supported currently in the Ruff native server and is done via the [`didChangeWorkspaceFolders`](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_didChangeWorkspaceFolders) notification.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/89/reactions",
        "total_count": 31,
        "+1": 31,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/90",
      "id": 3046314664,
      "node_id": "I_kwDOOje-Bs61kxKo",
      "number": 90,
      "title": "merge tracing setup for CLI and LSP",
      "user": {
        "login": "dhruvmanila",
        "id": 67177269,
        "node_id": "MDQ6VXNlcjY3MTc3MjY5",
        "avatar_url": "https://avatars.githubusercontent.com/u/67177269?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/dhruvmanila",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568537658,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rmCOg",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/server",
          "name": "server",
          "color": "21218F",
          "default": false,
          "description": "Related to the LSP server"
        },
        "1": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-08-08T07:51:59Z",
      "updated_at": "2025-12-31T16:33:45Z",
      "closed_at": null,
      "author_association": "MEMBER",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "With https://github.com/astral-sh/ruff/pull/12730, I think we should merge the tracing setup which exists in `ty_server` into the main setup.\n\nWe should also add tracing span to the requests that have been sent by the server.",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/90/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/issues/246",
      "id": 3046366933,
      "node_id": "I_kwDOOje-Bs61k97V",
      "number": 246,
      "title": "consider building use-def map per-scope instead of per-module",
      "user": {
        "login": "carljm",
        "id": 61586,
        "node_id": "MDQ6VXNlcjYxNTg2",
        "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/carljm",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "labels": {
        "0": {
          "id": 8568531588,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rlqhA",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/performance",
          "name": "performance",
          "color": "43D159",
          "default": false,
          "description": "Potential performance improvement"
        }
      },
      "state": "open",
      "locked": false,
      "assignee": null,
      "assignees": {},
      "milestone": null,
      "comments": 0,
      "created_at": "2024-05-31T22:03:02Z",
      "updated_at": "2025-05-07T15:27:43Z",
      "closed_at": null,
      "author_association": "CONTRIBUTOR",
      "type": null,
      "active_lock_reason": null,
      "sub_issues_summary": {
        "total": 0,
        "completed": 0,
        "percent_completed": 0
      },
      "issue_dependencies_summary": {
        "blocked_by": 0,
        "total_blocked_by": 0,
        "blocking": 0,
        "total_blocking": 0
      },
      "body": "Currently we always build symbol tables and definitions for an entire module at once.\r\n\r\nWe could consider deferring building these for functions until we actually need to check them.\r\n",
      "closed_by": null,
      "reactions": {
        "url": "https://api.github.com/repos/astral-sh/ty/issues/246/reactions",
        "total_count": 0,
        "+1": 0,
        "-1": 0,
        "laugh": 0,
        "hooray": 0,
        "confused": 0,
        "heart": 0,
        "rocket": 0,
        "eyes": 0
      },
      "performed_via_github_app": null,
      "state_reason": null,
      "linked_prs": []
    }
  ],
  "pulls": [
    {
      "url": "https://api.github.com/repos/astral-sh/ty/pulls/2393",
      "id": 3155340326,
      "node_id": "PR_kwDOOje-Bs68Eqwm",
      "number": 2393,
      "state": "open",
      "locked": false,
      "title": "Always target manylinux 2_17 and better pre-upload checks",
      "user": {
        "login": "konstin",
        "id": 6826232,
        "node_id": "MDQ6VXNlcjY4MjYyMzI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6826232?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/konstin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "We currently build for manylinux_2_17, and if this target changes, it should be an intentional, explicit change.\r\n\r\nCloses #2389\r\nCloses https://github.com/astral-sh/ty/issues/2396",
      "created_at": "2026-01-08T08:40:07Z",
      "updated_at": "2026-01-09T12:05:12Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "0e7b8da938d5013f583cd75c9347bc78f1389820",
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {
        "0": {
          "id": 8581760498,
          "node_id": "LA_kwDOOje-Bs8AAAAB_4NF8g",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/internal",
          "name": "internal",
          "color": "153FC0",
          "default": false,
          "description": "An internal refactor or improvement"
        }
      },
      "milestone": null,
      "draft": true,
      "head": {
        "label": "astral-sh:konsti/manylinux_2_17",
        "ref": "konsti/manylinux_2_17",
        "sha": "2b5d3de53318ae693cdec316da5520351d56d8b5",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "astral-sh:main",
        "ref": "main",
        "sha": "4f5197a4c0f5767a5fb133902d1fa6943d37c3f1",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2393"
        },
        "html": {
          "href": "https://github.com/astral-sh/ty/pull/2393"
        },
        "issue": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/2393"
        },
        "comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/2393/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2393/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2393/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/astral-sh/ty/statuses/2b5d3de53318ae693cdec316da5520351d56d8b5"
        }
      },
      "author_association": "MEMBER",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": [
        2,
        2389
      ]
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/pulls/2389",
      "id": 3154265350,
      "node_id": "PR_kwDOOje-Bs68AkUG",
      "number": 2389,
      "state": "open",
      "locked": false,
      "title": "Set the manylinux tag explicitly for ppc64 builds",
      "user": {
        "login": "zanieb",
        "id": 2586601,
        "node_id": "MDQ6VXNlcjI1ODY2MDE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2586601?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zanieb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "As of the latest version of maturin, this actually may not be compatible with the manylinux tag, but I think we should continue publishing it until we've made the actual choice to drop support. This is redundant with #2387 which downgrades maturin, but relevant for future upgrades.",
      "created_at": "2026-01-07T23:32:03Z",
      "updated_at": "2026-01-08T13:05:11Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "fafc16d049e62d63ba4d98ddb8d36a1899e9e634",
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "astral-sh:zb/ppc-force",
        "ref": "zb/ppc-force",
        "sha": "c1a3068e4ead0594160368635bbf72bea8715ef3",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "astral-sh:main",
        "ref": "main",
        "sha": "4f5197a4c0f5767a5fb133902d1fa6943d37c3f1",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2389"
        },
        "html": {
          "href": "https://github.com/astral-sh/ty/pull/2389"
        },
        "issue": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/2389"
        },
        "comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/2389/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2389/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2389/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/astral-sh/ty/statuses/c1a3068e4ead0594160368635bbf72bea8715ef3"
        }
      },
      "author_association": "MEMBER",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": [
        2
      ]
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/pulls/2388",
      "id": 3154242201,
      "node_id": "PR_kwDOOje-Bs68AeqZ",
      "number": 2388,
      "state": "open",
      "locked": false,
      "title": "Fail if maturin produces a PyPI incompatible wheel",
      "user": {
        "login": "zanieb",
        "id": 2586601,
        "node_id": "MDQ6VXNlcjI1ODY2MDE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2586601?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zanieb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "When we use automatic manylinux tag determination, we need to ensure that the wheel is uploadable to PyPI or the job will fail downstream and cause a partial release. ",
      "created_at": "2026-01-07T23:17:16Z",
      "updated_at": "2026-01-08T19:17:16Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "c65685f130f0c457c17433d3474ae99438846cee",
      "assignee": {
        "login": "konstin",
        "id": 6826232,
        "node_id": "MDQ6VXNlcjY4MjYyMzI=",
        "avatar_url": "https://avatars.githubusercontent.com/u/6826232?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/konstin",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "assignees": {
        "0": {
          "login": "konstin",
          "id": 6826232,
          "node_id": "MDQ6VXNlcjY4MjYyMzI=",
          "avatar_url": "https://avatars.githubusercontent.com/u/6826232?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/konstin",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {
        "0": {
          "id": 8568513779,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rkk8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/ci",
          "name": "ci",
          "color": "905251",
          "default": false,
          "description": "Related to internal CI tooling"
        }
      },
      "milestone": null,
      "draft": true,
      "head": {
        "label": "astral-sh:zb/compat-validate",
        "ref": "zb/compat-validate",
        "sha": "50073dd13cb2e6151898729c74fa7bff513452bb",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "astral-sh:main",
        "ref": "main",
        "sha": "4f5197a4c0f5767a5fb133902d1fa6943d37c3f1",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2388"
        },
        "html": {
          "href": "https://github.com/astral-sh/ty/pull/2388"
        },
        "issue": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/2388"
        },
        "comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/2388/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2388/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2388/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/astral-sh/ty/statuses/50073dd13cb2e6151898729c74fa7bff513452bb"
        }
      },
      "author_association": "MEMBER",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/pulls/2385",
      "id": 3154207260,
      "node_id": "PR_kwDOOje-Bs68AWIc",
      "number": 2385,
      "state": "open",
      "locked": false,
      "title": "add emergency manual release script",
      "user": {
        "login": "Gankra",
        "id": 1136864,
        "node_id": "MDQ6VXNlcjExMzY4NjQ=",
        "avatar_url": "https://avatars.githubusercontent.com/u/1136864?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/Gankra",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "Same one in uv but with the prerelease line delete because @zanieb noted it was broken",
      "created_at": "2026-01-07T22:58:22Z",
      "updated_at": "2026-01-08T08:56:41Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "f87de00bba468771fe480ff01c4d56cca473eda7",
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {
        "0": {
          "id": 8568534265,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rl0-Q",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/release",
          "name": "release",
          "color": "c5def5",
          "default": false,
          "description": "Related to the release process"
        }
      },
      "milestone": null,
      "draft": false,
      "head": {
        "label": "astral-sh:gankra/man-rel",
        "ref": "gankra/man-rel",
        "sha": "f40f3169109d7564e0a508d6de377735381fd8e0",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "astral-sh:main",
        "ref": "main",
        "sha": "d18902cdcc4d39badfad86c88e89b866a809c881",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2385"
        },
        "html": {
          "href": "https://github.com/astral-sh/ty/pull/2385"
        },
        "issue": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/2385"
        },
        "comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/2385/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2385/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/2385/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/astral-sh/ty/statuses/f40f3169109d7564e0a508d6de377735381fd8e0"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/pulls/1766",
      "id": 3074226992,
      "node_id": "PR_kwDOOje-Bs63PPsw",
      "number": 1766,
      "state": "open",
      "locked": false,
      "title": "[ty] Docs with embedded playground",
      "user": {
        "login": "sharkdp",
        "id": 4209276,
        "node_id": "MDQ6VXNlcjQyMDkyNzY=",
        "avatar_url": "https://avatars.githubusercontent.com/u/4209276?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/sharkdp",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## Summary\r\n\r\nNo need to look. Just saving this in case we want to come back to it later.",
      "created_at": "2025-12-05T07:54:15Z",
      "updated_at": "2025-12-10T19:16:49Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": null,
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {
        "0": {
          "id": 8568562675,
          "node_id": "LA_kwDOOje-Bs8AAAAB_rnj8w",
          "url": "https://api.github.com/repos/astral-sh/ty/labels/playground",
          "name": "playground",
          "color": "1C71A4",
          "default": false,
          "description": "A playground-specific issue"
        }
      },
      "milestone": null,
      "draft": true,
      "head": {
        "label": "astral-sh:david/embeddable-ty-playground",
        "ref": "david/embeddable-ty-playground",
        "sha": "cb7a0c03df52ca7003c9527b6146fd3054b779de",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "astral-sh:main",
        "ref": "main",
        "sha": "51c73d687778144c030324ef36cbba6303a28475",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/1766"
        },
        "html": {
          "href": "https://github.com/astral-sh/ty/pull/1766"
        },
        "issue": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/1766"
        },
        "comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/1766/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/1766/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/1766/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/astral-sh/ty/statuses/cb7a0c03df52ca7003c9527b6146fd3054b779de"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/pulls/1710",
      "id": 3060389683,
      "node_id": "PR_kwDOOje-Bs62adcz",
      "number": 1710,
      "state": "open",
      "locked": false,
      "title": "Enable PEP 740 attestations when publishing to PyPI",
      "user": {
        "login": "woodruffw",
        "id": 3059210,
        "node_id": "MDQ6VXNlcjMwNTkyMTA=",
        "avatar_url": "https://avatars.githubusercontent.com/u/3059210?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/woodruffw",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "## Summary\r\n\r\nThis enables PEP 740 attestations on the distributions we publish to PyPI.\r\n\r\nSee https://github.com/astral-sh/uv/pull/16910 and https://github.com/astral-sh/ruff/pull/21735 for reference 🙂 \r\n\r\n## Test Plan\r\n\r\nNot easy to test, since it's in the release pipeline. The action itself has integration tests and has been confirmed to work on other project releases, however, so hopefully things will go smoothly here...",
      "created_at": "2025-12-01T18:14:24Z",
      "updated_at": "2025-12-01T18:19:51Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "38c385d082f856d6565cae38cad1f5b5bc1a0ef2",
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "astral-sh:ww/pep740",
        "ref": "ww/pep740",
        "sha": "29f8ef3f28f4b506ca15cb6e397b52f75ea23e20",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "astral-sh:main",
        "ref": "main",
        "sha": "90e2851ec1bb00fa1f6ac2097a737975bf1f521a",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/1710"
        },
        "html": {
          "href": "https://github.com/astral-sh/ty/pull/1710"
        },
        "issue": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/1710"
        },
        "comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/1710/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/1710/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/1710/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/astral-sh/ty/statuses/29f8ef3f28f4b506ca15cb6e397b52f75ea23e20"
        }
      },
      "author_association": "MEMBER",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/pulls/1636",
      "id": 3045058071,
      "node_id": "PR_kwDOOje-Bs61f-YX",
      "number": 1636,
      "state": "open",
      "locked": false,
      "title": "pin ruff commit hashes when copying docs",
      "user": {
        "login": "oconnor663",
        "id": 860932,
        "node_id": "MDQ6VXNlcjg2MDkzMg==",
        "avatar_url": "https://avatars.githubusercontent.com/u/860932?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/oconnor663",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "This is a drive-by fix/idea. I noticed that we're publishing links with line numbers that tend to go stale as the upstream Rust code is edited over time (like most of the \"View source\" links on [this page](https://docs.astral.sh/ty/reference/rules)). Might be nice to snapshot these when we vendor the `.md` files?",
      "created_at": "2025-11-25T21:18:16Z",
      "updated_at": "2025-11-26T09:32:07Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "d8a12e7ee37b065fb9de0a9d8191a22f37a62911",
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {
        "0": {
          "login": "carljm",
          "id": 61586,
          "node_id": "MDQ6VXNlcjYxNTg2",
          "avatar_url": "https://avatars.githubusercontent.com/u/61586?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/carljm",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        },
        "1": {
          "login": "zanieb",
          "id": 2586601,
          "node_id": "MDQ6VXNlcjI1ODY2MDE=",
          "avatar_url": "https://avatars.githubusercontent.com/u/2586601?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/zanieb",
          "type": "User",
          "user_view_type": "public",
          "site_admin": false
        }
      },
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": false,
      "head": {
        "label": "astral-sh:ruff_commit_in_links",
        "ref": "ruff_commit_in_links",
        "sha": "ad82b625e1a359ebeb2e25d1596abe3f95f4143d",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "astral-sh:main",
        "ref": "main",
        "sha": "b6c5a4746c4e19f7349857e89c65dce5c01e6454",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/1636"
        },
        "html": {
          "href": "https://github.com/astral-sh/ty/pull/1636"
        },
        "issue": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/1636"
        },
        "comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/1636/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/1636/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/1636/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/astral-sh/ty/statuses/ad82b625e1a359ebeb2e25d1596abe3f95f4143d"
        }
      },
      "author_association": "CONTRIBUTOR",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    },
    {
      "url": "https://api.github.com/repos/astral-sh/ty/pulls/993",
      "id": 2747051669,
      "node_id": "PR_kwDOOje-Bs6jvK6V",
      "number": 993,
      "state": "open",
      "locked": false,
      "title": "Port `__main__.py` functionality from uv",
      "user": {
        "login": "zanieb",
        "id": 2586601,
        "node_id": "MDQ6VXNlcjI1ODY2MDE=",
        "avatar_url": "https://avatars.githubusercontent.com/u/2586601?v=4",
        "gravatar_id": "",
        "url": "https://api.github.com/users/zanieb",
        "type": "User",
        "user_view_type": "public",
        "site_admin": false
      },
      "body": "As part of https://github.com/astral-sh/ty/issues/989, but includes some other changes:\r\n\r\n- Sets `VIRTUAL_ENV` if `pyvenv.cfg` can be found next to `sys.prefix`\r\n- Sets `TY__PARENT_INTERPRETER` to `sys.executable`\r\n- Elides tracebacks on interrupt on Windows",
      "created_at": "2025-08-14T18:47:55Z",
      "updated_at": "2025-08-14T18:49:51Z",
      "closed_at": null,
      "merged_at": null,
      "merge_commit_sha": "4241f8fb5409a679b62746b7374d386d17045601",
      "assignee": null,
      "assignees": {},
      "requested_reviewers": {},
      "requested_teams": {},
      "labels": {},
      "milestone": null,
      "draft": true,
      "head": {
        "label": "astral-sh:zb/port-uv-py",
        "ref": "zb/port-uv-py",
        "sha": "f00fb64de29abb0f5273d48c82f6dcfe375d218a",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "base": {
        "label": "astral-sh:main",
        "ref": "main",
        "sha": "d697cc09232eaf226b0888124a812264d3e84eec",
        "user": {
          "login": "astral-sh",
          "id": 115962839,
          "node_id": "O_kgDOBulz1w",
          "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
          "gravatar_id": "",
          "url": "https://api.github.com/users/astral-sh",
          "type": "Organization",
          "user_view_type": "public",
          "site_admin": false
        },
        "repo": {
          "id": 976731654,
          "node_id": "R_kgDOOje-Bg",
          "name": "ty",
          "full_name": "astral-sh/ty",
          "private": false,
          "owner": {
            "login": "astral-sh",
            "id": 115962839,
            "node_id": "O_kgDOBulz1w",
            "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
            "gravatar_id": "",
            "url": "https://api.github.com/users/astral-sh",
            "type": "Organization",
            "user_view_type": "public",
            "site_admin": false
          },
          "description": "An extremely fast Python type checker and language server, written in Rust.",
          "fork": false,
          "url": "https://api.github.com/repos/astral-sh/ty",
          "created_at": "2025-05-02T16:37:51Z",
          "updated_at": "2026-01-11T03:05:45Z",
          "pushed_at": "2026-01-10T00:04:30Z",
          "homepage": "https://docs.astral.sh/ty/",
          "size": 3982,
          "stargazers_count": 16317,
          "watchers_count": 16317,
          "language": "Python",
          "has_issues": true,
          "has_projects": true,
          "has_downloads": true,
          "has_wiki": false,
          "has_pages": false,
          "has_discussions": false,
          "forks_count": 185,
          "archived": false,
          "disabled": false,
          "open_issues_count": 693,
          "license": {
            "key": "mit",
            "name": "MIT License",
            "spdx_id": "MIT",
            "url": "https://api.github.com/licenses/mit",
            "node_id": "MDc6TGljZW5zZTEz"
          },
          "allow_forking": true,
          "is_template": false,
          "web_commit_signoff_required": false,
          "topics": {},
          "visibility": "public",
          "forks": 185,
          "open_issues": 693,
          "watchers": 16317,
          "default_branch": "main"
        }
      },
      "_links": {
        "self": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/993"
        },
        "html": {
          "href": "https://github.com/astral-sh/ty/pull/993"
        },
        "issue": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/993"
        },
        "comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/issues/993/comments"
        },
        "review_comments": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/993/comments"
        },
        "review_comment": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/comments{/number}"
        },
        "commits": {
          "href": "https://api.github.com/repos/astral-sh/ty/pulls/993/commits"
        },
        "statuses": {
          "href": "https://api.github.com/repos/astral-sh/ty/statuses/f00fb64de29abb0f5273d48c82f6dcfe375d218a"
        }
      },
      "author_association": "MEMBER",
      "auto_merge": null,
      "active_lock_reason": null,
      "linked_issues": []
    }
  ],
  "discussions": [],
  "details": {
    "id": 976731654,
    "node_id": "R_kgDOOje-Bg",
    "name": "ty",
    "full_name": "astral-sh/ty",
    "private": false,
    "owner": {
      "login": "astral-sh",
      "id": 115962839,
      "node_id": "O_kgDOBulz1w",
      "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/astral-sh",
      "type": "Organization",
      "user_view_type": "public",
      "site_admin": false
    },
    "description": "An extremely fast Python type checker and language server, written in Rust.",
    "fork": false,
    "url": "https://api.github.com/repos/astral-sh/ty",
    "created_at": "2025-05-02T16:37:51Z",
    "updated_at": "2026-01-11T03:05:45Z",
    "pushed_at": "2026-01-10T00:04:30Z",
    "homepage": "https://docs.astral.sh/ty/",
    "size": 3982,
    "stargazers_count": 16317,
    "watchers_count": 16317,
    "language": "Python",
    "has_issues": true,
    "has_projects": true,
    "has_downloads": true,
    "has_wiki": false,
    "has_pages": false,
    "has_discussions": false,
    "forks_count": 185,
    "archived": false,
    "disabled": false,
    "open_issues_count": 693,
    "license": {
      "key": "mit",
      "name": "MIT License",
      "spdx_id": "MIT",
      "url": "https://api.github.com/licenses/mit",
      "node_id": "MDc6TGljZW5zZTEz"
    },
    "allow_forking": true,
    "is_template": false,
    "web_commit_signoff_required": false,
    "topics": {},
    "visibility": "public",
    "forks": 185,
    "open_issues": 693,
    "watchers": 16317,
    "default_branch": "main",
    "permissions": {
      "admin": false,
      "maintain": false,
      "push": false,
      "triage": false,
      "pull": true
    },
    "temp_clone_token": "",
    "custom_properties": {},
    "organization": {
      "login": "astral-sh",
      "id": 115962839,
      "node_id": "O_kgDOBulz1w",
      "avatar_url": "https://avatars.githubusercontent.com/u/115962839?v=4",
      "gravatar_id": "",
      "url": "https://api.github.com/users/astral-sh",
      "type": "Organization",
      "user_view_type": "public",
      "site_admin": false
    },
    "network_count": 185,
    "subscribers_count": 54
  },
  "lastFetched": 1768101532212
}