)]}'
{
  "commit": "56fefc25ee42a18ea4103bf73670daf0487e24c7",
  "tree": "35de0edc14f005b65dda4bbdf0878f2a8970d5f9",
  "parents": [
    "1fc623a2d99d6c0420a21265e3c8777c3218277e"
  ],
  "author": {
    "name": "Shunsuke Shibayama",
    "email": "sbym1346@gmail.com",
    "time": "Wed Sep 16 15:53:36 2026 +0900"
  },
  "committer": {
    "name": "Shunsuke Shibayama",
    "email": "sbym1346@gmail.com",
    "time": "Wed Sep 16 17:12:36 2026 +0900"
  },
  "message": "[ty] Infer recursive types from constructive operations\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "2aedc3f29e38b4bd59214479e7359e12311f2489",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/attributes.md",
      "new_id": "cbdc12bd7cb235c0f9262f204446ec32ee65360e",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/attributes.md"
    },
    {
      "type": "modify",
      "old_id": "aa66b28372a6e0cbf0187942f603f412668c5baf",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/bidirectional.md",
      "new_id": "d1eed09903e90956bd48f5b1184e62717ed5d69b",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/bidirectional.md"
    },
    {
      "type": "modify",
      "old_id": "cfd1334c206552520846aee17a6863bae351fdfa",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/call/type.md",
      "new_id": "18d0be273e17d20612f27e86429522263dbfb381",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/call/type.md"
    },
    {
      "type": "modify",
      "old_id": "b224f70c718e353f2d437e4f6cd247266ebe3184",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/cycle/implicit_instance_attributes.md",
      "new_id": "ec25e836c5c6e77269e3b025a08b49e8754b0b50",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/cycle/implicit_instance_attributes.md"
    },
    {
      "type": "modify",
      "old_id": "d95a953e30290c0283b15c1c2842064498ba9b3f",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/decorators/total_ordering.md",
      "new_id": "75678df4aaf3e6e74dcfe14180282bce0bd6140d",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/decorators/total_ordering.md"
    },
    {
      "type": "modify",
      "old_id": "9f5775ec398f8cdfc3153b89aba324cdbc5bbee7",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/generics/legacy/classes.md",
      "new_id": "6df1b8eead12413d47d7db2ca67ebf0b25904aa2",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/generics/legacy/classes.md"
    },
    {
      "type": "modify",
      "old_id": "97fc4ea85c83cdf6e68c0f1199ba91ee7c87d074",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/generics/pep695/classes.md",
      "new_id": "238258af38fea73d38bfa3433a4797f114399285",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/generics/pep695/classes.md"
    },
    {
      "type": "modify",
      "old_id": "b0287dcf457c0a6e4fbad68b8c67c9936c988dd7",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/loops/for.md",
      "new_id": "ccf6fc5fe9bef3ae5d67350c9c6f1dc7b237010b",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/loops/for.md"
    },
    {
      "type": "modify",
      "old_id": "4ba71692587ad7a5f17b2633744ca468f9b6a729",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/scopes/global.md",
      "new_id": "a9995c2dca2236cb76cca6347cf66643a0e61fff",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/scopes/global.md"
    },
    {
      "type": "modify",
      "old_id": "205ac749992e703dc2ce7d400757cede72d90b42",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/scopes/nonlocal.md",
      "new_id": "a78ed03f07aa061c2f1e49978fef01f4e3ff5f90",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/scopes/nonlocal.md"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "d65c00e829be502783e49ca4f0804e089867e166",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/type_display/recursive.md"
    },
    {
      "type": "modify",
      "old_id": "add246c1ffe375eef3d398e1ca8f68272eadafb8",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/resources/mdtest/type_properties/materialization.md",
      "new_id": "ace824eaa173fb8e17cb358fdb930cce9106686e",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/resources/mdtest/type_properties/materialization.md"
    },
    {
      "type": "modify",
      "old_id": "62da3b943360a2562a5805da86b0d383b3193037",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/dunder_all.rs",
      "new_id": "5495f53701e2fc29d22c649f6fae099d5361fcf4",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/dunder_all.rs"
    },
    {
      "type": "modify",
      "old_id": "043eed36f94ed57a4926c09db67dcea8f21201f7",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/place.rs",
      "new_id": "e9643e54c7248cd4b73099cd6dd816063bce2273",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/place.rs"
    },
    {
      "type": "modify",
      "old_id": "30ed8f7e360e64a5af5cc70f09b1fdd3d5ab87ed",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/reachability.rs",
      "new_id": "4131c684c0029f0a2d80af224a7d1ded3466174b",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/reachability.rs"
    },
    {
      "type": "modify",
      "old_id": "140d39498d1d185f4004d88ab44c7dd1dcc4b351",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types.rs",
      "new_id": "c7e9f70e8f5cee2f99e0c001425cd8ffa956acc8",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types.rs"
    },
    {
      "type": "modify",
      "old_id": "db4c1d89b339e68d118cbb5af9343d3b1eca9b0f",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/abstract_methods.rs",
      "new_id": "e09218b8313865261364a91c4a16b394851caf00",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/abstract_methods.rs"
    },
    {
      "type": "modify",
      "old_id": "6f758e70b4876dbee61078d120dee1b219c12d37",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/call/arguments.rs",
      "new_id": "32c1258d2e04078891d189812ee81bce6cfb613f",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/call/arguments.rs"
    },
    {
      "type": "modify",
      "old_id": "3676b069d493a8def53f670ec85e427e9355da9d",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/call/bind.rs",
      "new_id": "da5ffe31302d761c02246029845ba1cd66d0a20d",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/call/bind.rs"
    },
    {
      "type": "modify",
      "old_id": "18032ec5c60368721a96507953d4c124f53f6e35",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/class.rs",
      "new_id": "3cf9fbf4978768d8b8cb59d173da2816f815c982",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/class.rs"
    },
    {
      "type": "modify",
      "old_id": "05d2f69c8e0910011178fc31531f58f220d11c78",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/class/dynamic_literal.rs",
      "new_id": "cf23c80ba602a3d382a84710d9173883f355edea",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/class/dynamic_literal.rs"
    },
    {
      "type": "modify",
      "old_id": "29ad70f738b6c0c5f05543f1f84146899363cbd7",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/class/implicit_attributes.rs",
      "new_id": "e19490165750aceab7354bfbe53947ee24ec9ed3",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/class/implicit_attributes.rs"
    },
    {
      "type": "modify",
      "old_id": "adef823e04e5f24955f1bc489296c10e0036ff2c",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/class/static_literal.rs",
      "new_id": "165c13acbf07270d42a2617fc2c4dcb2569f38e2",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/class/static_literal.rs"
    },
    {
      "type": "modify",
      "old_id": "175f93700727b6b59553c65875f7478eb745b5dc",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/class_base.rs",
      "new_id": "ff9840687f805d84a6a651e6595b836b073c7c1a",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/class_base.rs"
    },
    {
      "type": "modify",
      "old_id": "202089def3018cab9d3e662c93b73b65441c233b",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/constraints/solutions.rs",
      "new_id": "2ccca20044c07e2d0d8a064953db1957c8127440",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/constraints/solutions.rs"
    },
    {
      "type": "modify",
      "old_id": "51a946549e9572e5eb2a50bbba0bebdc49cc53f8",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/display.rs",
      "new_id": "2ddd3f53fb71de142dd390fbd01ee2f15176d2d3",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/display.rs"
    },
    {
      "type": "modify",
      "old_id": "d7d00a45212849c55b2bdaf649825530bef690bd",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/graph.rs",
      "new_id": "ca24486098eda17641acae69e2c6820dae6cee47",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/graph.rs"
    },
    {
      "type": "modify",
      "old_id": "365c8ee7f174b50c35d18e1ea408e599ce738cca",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/infer.rs",
      "new_id": "8ccf588e1d61388beddc460102af66017c101a83",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/infer.rs"
    },
    {
      "type": "modify",
      "old_id": "ff1a97118af0efa5f5e0690f876ff3163697fb20",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/infer/builder.rs",
      "new_id": "f2436cb3e18849a8fdf4060a8d7cc7e81409a287",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/infer/builder.rs"
    },
    {
      "type": "modify",
      "old_id": "48c6fcae35f3b33a49b2478d06cc2a7f2bbdc9f9",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/infer/builder/binary_expressions.rs",
      "new_id": "ff8a6ca1be8d3be8719f533999c83ce83ae35e98",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/infer/builder/binary_expressions.rs"
    },
    {
      "type": "modify",
      "old_id": "f3407d55ed3486ec4b707c2858d8c345e1122f2b",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/infer/builder/dynamic_class.rs",
      "new_id": "7c71b4f558bd973444c289a8119b2b7527be8fd8",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/infer/builder/dynamic_class.rs"
    },
    {
      "type": "modify",
      "old_id": "fe00dca09b9e5e90b01345f9af8ec6115f7cdc40",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/infer/builder/function.rs",
      "new_id": "36a3e01a7522186618c5ce59e56671d3b12a6e5b",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/infer/builder/function.rs"
    },
    {
      "type": "modify",
      "old_id": "25b03eb133bdb303723968c381047263bc8ec5e0",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/infer/builder/new_class.rs",
      "new_id": "51c681263c6542553bd89f229b2423406fa15e5c",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/infer/builder/new_class.rs"
    },
    {
      "type": "modify",
      "old_id": "4e61760ef1109ad7f7f39edbde7fc39d1096c73c",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/infer/builder/redundant_conditions/exemptions.rs",
      "new_id": "07e734f0c54a18de44869603478eeeb019702da6",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/infer/builder/redundant_conditions/exemptions.rs"
    },
    {
      "type": "modify",
      "old_id": "b0b70027fe55841507eb2302c8eb371180512c95",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/infer/builder/type_call.rs",
      "new_id": "0fd660966cf3e66f5a6b4ec70e0000890200757c",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/infer/builder/type_call.rs"
    },
    {
      "type": "modify",
      "old_id": "2adb0250c452400a2bfc3ec7990601181dbc6529",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/infer/tests.rs",
      "new_id": "aebb19aa1ada0c766a644726b649fd33e1e9c32d",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/infer/tests.rs"
    },
    {
      "type": "modify",
      "old_id": "8a2cf9f190d42ac1f20834aca77ee12b605f808f",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/narrow.rs",
      "new_id": "29ead4627067d94b8c5278cf6ca3fa94ee77e05c",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/narrow.rs"
    },
    {
      "type": "modify",
      "old_id": "f05ecf46253f5bf3d92eff5f0531ea42aecd732d",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/recursive.rs",
      "new_id": "8b1b3ae5dd1fa944e3ed1279c49217081f87db1d",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/recursive.rs"
    },
    {
      "type": "modify",
      "old_id": "8b63ac47ef406533357ee62a6ed3eb9d757c8e05",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/recursive/graph.rs",
      "new_id": "56d22ceb353e8d275f635472cde2fa0167604f62",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/recursive/graph.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "e3d2f4789bdb4856d955a3561764e5a60f4ae3f8",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/recursive/inference.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c2188c8fc186ed489470737972317931ead27d4d",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/recursive/operations.rs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "f9d37e860313de41430db9dab95b5faf93874d61",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/recursive/tuple_length.rs"
    },
    {
      "type": "modify",
      "old_id": "b947b8effa868c2aee488d20d72debcff3ef7018",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/set_theoretic.rs",
      "new_id": "7b1bb95056fe6770e241b1246690e5b1143db617",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/set_theoretic.rs"
    },
    {
      "type": "modify",
      "old_id": "faa538105c9b94bd24c59107da385bbe7a111cbb",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/set_theoretic/builder.rs",
      "new_id": "66ca168f1411ab78e835a77c6e9dea9c34bf6179",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/set_theoretic/builder.rs"
    },
    {
      "type": "modify",
      "old_id": "df3b4e165cb78c649049b766386526329e93f9eb",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/typevar.rs",
      "new_id": "ed2579c52d5a71fee5fe8c97b731011d70284c11",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/typevar.rs"
    },
    {
      "type": "modify",
      "old_id": "f20e9c14285038384866af42c6b76002d4c0c095",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/unpacker.rs",
      "new_id": "a3dbbe8b4e9cbe55c26d6bc5dabc5c75b6bf7a1b",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/unpacker.rs"
    },
    {
      "type": "modify",
      "old_id": "0ee1c7612d3bed38a86f1c505fb4e15eac701d03",
      "old_mode": 33188,
      "old_path": "crates/ty_python_semantic/src/types/visitor.rs",
      "new_id": "fe6d65b0022399be6153e0b9f2a027dd39905933",
      "new_mode": 33188,
      "new_path": "crates/ty_python_semantic/src/types/visitor.rs"
    }
  ]
}
