)]}'
{
  "commit": "c277924308530f76b20f2741ea9244373c0ba04b",
  "tree": "9e2d00ced92b64c12c7d1bcc3e54d02476dca4b2",
  "parents": [
    "eba9a4c39211b358437abd05be638f9996d236db"
  ],
  "author": {
    "name": "Michael J. Sullivan",
    "email": "sully@msully.net",
    "time": "Mon Feb 02 18:43:04 2026 -0800"
  },
  "committer": {
    "name": "Michael J. Sullivan",
    "email": "sully@msully.net",
    "time": "Tue Feb 03 11:55:38 2026 -0800"
  },
  "message": "Implement Unpack of TypeVars for **kwargs inference\n\nAllow `**kwargs: Unpack[K]` where K is a TypeVar bound to TypedDict.\nThis enables inferring TypedDict types from keyword arguments at call sites.\n\nExample:\n    def f[K: BaseTypedDict](**kwargs: Unpack[K]) -\u003e K: ...\n    result \u003d f(x\u003d1, y\u003d\"hello\")  # K inferred as TypedDict({\u0027x\u0027: int, \u0027y\u0027: str})\n\nChanges:\n- semanal.py: Accept TypeVar with TypedDict bound in remove_unpack_kwargs(),\n  keep UnpackType for constraint inference\n- semanal_typeargs.py: Allow TypeVar with TypedDict bound in visit_unpack_type()\n- constraints.py: Generate TypedDict constraints from actual kwargs\n- types.py: Handle TypeVar in with_unpacked_kwargs()\n- checkexpr.py: Re-expand kwargs after TypeVar inference\n\nCo-Authored-By: Claude Opus 4.5 \u003cnoreply@anthropic.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "8288b676b52ea1a6760f97f7b5a2b30d43ed062a",
      "old_mode": 33188,
      "old_path": "mypy/checkexpr.py",
      "new_id": "667b9d66f2153ee6d8e97e04f41f4b5dd5769761",
      "new_mode": 33188,
      "new_path": "mypy/checkexpr.py"
    },
    {
      "type": "modify",
      "old_id": "df79fdae5456cf679e70a8131d6b9c79560957e4",
      "old_mode": 33188,
      "old_path": "mypy/constraints.py",
      "new_id": "f95f140aeeac647b7c0d9dc1bdd1d1905782af6a",
      "new_mode": 33188,
      "new_path": "mypy/constraints.py"
    },
    {
      "type": "modify",
      "old_id": "f38a71cb16e30ee20395c32e75b0233a5f91f6e8",
      "old_mode": 33188,
      "old_path": "mypy/semanal.py",
      "new_id": "e5e4501c3fe5d461787c14fbcea3847bb0cec5ce",
      "new_mode": 33188,
      "new_path": "mypy/semanal.py"
    },
    {
      "type": "modify",
      "old_id": "0f62a4aa8b1a2ea8d71ef25988dc0c4d8b3d71df",
      "old_mode": 33188,
      "old_path": "mypy/semanal_typeargs.py",
      "new_id": "6e13c60244849594d92b9117f058f5726628552d",
      "new_mode": 33188,
      "new_path": "mypy/semanal_typeargs.py"
    },
    {
      "type": "modify",
      "old_id": "db8fd4605659c5c0b02ff4c18a290d251cbe97b1",
      "old_mode": 33188,
      "old_path": "mypy/types.py",
      "new_id": "27165fdd3651a26be0f3498748cff76a00e6efde",
      "new_mode": 33188,
      "new_path": "mypy/types.py"
    },
    {
      "type": "modify",
      "old_id": "3c1dcb427f29ab0a9dd0a206eed19dcb0b3bbc7c",
      "old_mode": 33188,
      "old_path": "mypy/types_utils.py",
      "new_id": "b07c31f4faab79838508fb0e605870067876d52a",
      "new_mode": 33188,
      "new_path": "mypy/types_utils.py"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f26803795bde04fb2c0bffddc5995942ac3456c3",
      "new_mode": 33188,
      "new_path": "test-data/unit/check-kwargs-unpack-typevar.test"
    },
    {
      "type": "modify",
      "old_id": "874c79df0e1937cdfd41cff7c82e8eecb8c8387a",
      "old_mode": 33188,
      "old_path": "test-data/unit/check-typevar-tuple.test",
      "new_id": "9bdaa7953f206489363fa417e6ec23556c91ce5d",
      "new_mode": 33188,
      "new_path": "test-data/unit/check-typevar-tuple.test"
    },
    {
      "type": "modify",
      "old_id": "4f45e61a6b6e205661b7150d07e08a3cb36f2358",
      "old_mode": 33188,
      "old_path": "test-data/unit/check-varargs.test",
      "new_id": "a827ed1f30f55957cfc42439cc117976cdd20daa",
      "new_mode": 33188,
      "new_path": "test-data/unit/check-varargs.test"
    },
    {
      "type": "modify",
      "old_id": "87b66c0cd857ea240cc7e5324253ddd17c71e592",
      "old_mode": 33188,
      "old_path": "test-data/unit/fixtures/typing-full.pyi",
      "new_id": "3d5a9cd70f57376dbd1dd10cef02c5bd3d120d46",
      "new_mode": 33188,
      "new_path": "test-data/unit/fixtures/typing-full.pyi"
    },
    {
      "type": "modify",
      "old_id": "b69d35ce030e7dcd98d588ec58c1bb6e3d9ab63d",
      "old_mode": 33188,
      "old_path": "test-data/unit/semanal-errors.test",
      "new_id": "f61b1ffdcfc0fa58d312d18a8b086592089447ff",
      "new_mode": 33188,
      "new_path": "test-data/unit/semanal-errors.test"
    }
  ]
}
