)]}'
{
  "commit": "a0e239f3cdaa777d5dbbda4cea099c06a4e08632",
  "tree": "04bec22aca12492361d6e0f54790f7195b11c408",
  "parents": [
    "bc3cb57c45d627d286fce0ba284e19b141e9362b"
  ],
  "author": {
    "name": "Ibraheem Ahmed",
    "email": "ibraheem@ibraheem.ca",
    "time": "Wed Sep 23 23:45:32 2026 -0400"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Wed Sep 23 23:45:32 2026 -0400"
  },
  "message": "[ty] Infer callable signatures from bounded type variables (#28599)\n\nA type variable with a callable upper bound should be inferred as its\nupper bound during callable inference:\n```py\nfrom typing import Callable\n\ndef apply[T](callback: Callable[[int], T]) -\u003e T:\n    return callback(1)\n\ndef _[F: Callable[[int], str]](callback: F):\n    reveal_type(apply(callback))  # main: Unknown, now: str\n```",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "be184e10ab2a49fb06b64d8cf181a754551b217e",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/annotations/self.md",
      "new_id": "d30c5634651edb34edd595c170a7d29f057f2df7",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/annotations/self.md"
    },
    {
      "type": "modify",
      "old_id": "a14d766ff05e4c59aac87fab1e7b12120f46327a",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/generics/legacy/callables.md",
      "new_id": "0ab762e11a0b86065d5b8697ef2cd0b2cffd9cd7",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/generics/legacy/callables.md"
    },
    {
      "type": "modify",
      "old_id": "71bba81d3b11b2b45d5d2c2dc0970b1d5a3dbe46",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/generics/pep695/callables.md",
      "new_id": "ba4130bebe78e6ddae7bd8a05f067ab659a48317",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/generics/pep695/callables.md"
    },
    {
      "type": "modify",
      "old_id": "47de2f00af76aa4c60dc75c91658ed35342838cf",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/callable.rs",
      "new_id": "c63cb351aa8b9dbdb32254717e4f5c044ed8ff0c",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/callable.rs"
    },
    {
      "type": "modify",
      "old_id": "396c470d451a812fb9cd1962eea16b965c7ad3c3",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/relation.rs",
      "new_id": "2ef0b94f25971d70d07ce2880e3dba5e9b06da47",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/relation.rs"
    }
  ]
}
