cognee/notebooks/tutorial.ipynb
2025-09-07 13:45:10 +02:00

580 lines
272 KiB
Text
Vendored
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": [
"# Using Cognee with Python Development Data\n",
"\n",
"Unite authoritative Python practice (Guido van Rossum's own contributions!), normative guidance (Zen/PEP8), and your lived context (rules + conversations) into one *AI memory* that produces answers that are relevant, explainable, and consistent."
],
"id": "6f22c8fe6d92cfcc"
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"## What You'll Learn\n",
"\n",
"In this comprehensive tutorial, you'll discover how to transform scattered development data into an intelligent knowledge system that enhances your coding workflow. By the end, you'll have:\n",
"\n",
"- **Connected disparate data sources** (Guido's CPython contributions, mypy development, PEP discussions, your Python projects) into a unified AI memory graph\n",
"- **Built an memory layer** that understands Python design philosophy and coding patterns\n",
"- **Learn how to use intelligent search capabilities** that surface Pythonic solutions when you need them most\n",
"- **Integrated everything with your coding environment** through MCP (Model Context Protocol)\n",
"\n",
"This tutorial demonstrates the power of **knowledge graphs** and **retrieval-augmented generation (RAG)** for software development, showing you how to build systems that learn from Python's creator and improve your own Python development."
],
"id": "fe69acbf9ab1a22b"
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"## Cognee and its core operations\n",
"\n",
"Before we dive in, let's understand the key components we'll be working with:\n",
"\n",
"### Core Cognee Functions\n",
"\n",
"- **`cognee.add()`** - Ingests raw data (files, text, APIs) into the system\n",
"- **`cognee.cognify()`** - Processes and structures data into a knowledge graph using AI\n",
"- **`cognee.search()`** - Queries the knowledge graph with natural language or Cypher\n",
"- **`cognee.visualize()`** - Creates interactive graph visualizations\n",
"- **`cognee.memify()`** - Cognee's \"secret sauce\" that infers implicit connections and rules from your data"
],
"id": "b03b59c064213dd4"
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"## Data used in this tutorial\n",
"\n",
"Cognee can ingest many types of sources. In this tutorial, we use a small, concrete set of files that cover different perspectives:\n",
"\n",
"- **`guido_contributions.json` — Authoritative exemplars.** Real PRs and commits from Guido van Rossum (mypy, CPython). These show how Pythons creator solved problems and provide concrete anchors for patterns.\n",
"- **`pep_style_guide.md` — Norms.** Encodes community style and typing conventions (PEP8 and related). Ensures that search results and inferred rules align with widely accepted standards.\n",
"- **`zen_principles.md` — Philosophy.** The Zen of Python. Grounds design tradeoffs (simplicity, explicitness, readability) beyond syntax or mechanics.\n",
"- **`my_developer_rules.md` — Local constraints.** Your house rules, conventions, and projectspecific requirements (scope, privacy, Spec.md). Keeps recommendations relevant to your actual workflow.\n",
"- **`copilot_conversations.json` — Personal history.** Transcripts of real assistant conversations, including your questions, code snippets, and discussion topics. Captures “how you code” and connects it to “how Guido codes.”"
],
"id": "6a7669fbb6a3e6c7"
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"# Prelinimiaries\n",
"\n",
"Cognee relies heavily on async functions.\n",
"We need `nest_asyncio` so `await` works in this notebook."
],
"id": "2a5dac2c6fdc7ca7"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T11:43:21.615213Z",
"start_time": "2025-09-07T11:43:21.600122Z"
}
},
"cell_type": "code",
"source": [
"import nest_asyncio\n",
"nest_asyncio.apply()"
],
"id": "20cb02b49e3c53e2",
"outputs": [],
"execution_count": 20
},
{
"metadata": {},
"cell_type": "markdown",
"source": "We will do a quick import check.",
"id": "45e1caaec20c9518"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T09:57:30.827241Z",
"start_time": "2025-09-07T09:57:27.209811Z"
}
},
"cell_type": "code",
"source": [
"import cognee\n",
"import os\n",
"from pathlib import Path\n",
"\n",
"print('🔍 Quick Cognee Import Check')\n",
"print('=' * 30)\n",
"print(f'📍 Cognee location: {cognee.__file__}')\n",
"print(f'📁 Package directory: {os.path.dirname(cognee.__file__)}')\n",
"\n",
"# Check if it's local or installed\n",
"current_dir = Path.cwd()\n",
"cognee_path = Path(cognee.__file__)\n",
"if current_dir in cognee_path.parents:\n",
" print('🏠 Status: LOCAL DEVELOPMENT VERSION')\n",
"else:\n",
" print('📦 Status: INSTALLED PACKAGE')"
],
"id": "9386ecb596860399",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"\u001B[2m2025-09-07T09:57:28.419783\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mDeleted old log file: /Users/lazar/PycharmProjects/cognee/logs/2025-09-04_09-37-20.log\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.shared.logging_utils\u001B[0m]\u001B[0m\n",
"/Users/lazar/PycharmProjects/cognee/.venv/lib/python3.12/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
" from .autonotebook import tqdm as notebook_tqdm\n",
"\n",
"\u001B[2m2025-09-07T09:57:29.163761\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mLogging initialized \u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.shared.logging_utils\u001B[0m]\u001B[0m \u001B[36mcognee_version\u001B[0m=\u001B[35m0.2.4-local\u001B[0m \u001B[36mdatabase_path\u001B[0m=\u001B[35m/Users/lazar/PycharmProjects/cognee/cognee/.cognee_system/databases\u001B[0m \u001B[36mgraph_database_name\u001B[0m=\u001B[35m\u001B[0m \u001B[36mos_info\u001B[0m=\u001B[35m'Darwin 24.5.0 (Darwin Kernel Version 24.5.0: Tue Apr 22 19:54:29 PDT 2025; root:xnu-11417.121.6~2/RELEASE_ARM64_T6030)'\u001B[0m \u001B[36mpython_version\u001B[0m=\u001B[35m3.12.8\u001B[0m \u001B[36mrelational_config\u001B[0m=\u001B[35mcognee_db\u001B[0m \u001B[36mstructlog_version\u001B[0m=\u001B[35m25.4.0\u001B[0m \u001B[36mvector_config\u001B[0m=\u001B[35mlancedb\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T09:57:29.164208\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mDatabase storage: /Users/lazar/PycharmProjects/cognee/cognee/.cognee_system/databases\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.shared.logging_utils\u001B[0m]\u001B[0m\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"🔍 Quick Cognee Import Check\n",
"==============================\n",
"📍 Cognee location: /Users/lazar/PycharmProjects/cognee/cognee/__init__.py\n",
"📁 Package directory: /Users/lazar/PycharmProjects/cognee/cognee\n",
"📦 Status: INSTALLED PACKAGE\n"
]
}
],
"execution_count": 1
},
{
"metadata": {},
"cell_type": "markdown",
"source": "And just to be safe, we will make sure that the path contains the root directory, so Python can find everything it needs to run the notebook.",
"id": "76895c6570d1a4dc"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T09:59:43.525416Z",
"start_time": "2025-09-07T09:59:43.522480Z"
}
},
"cell_type": "code",
"source": [
"import sys\n",
"from pathlib import Path\n",
"notebook_dir = Path.cwd()\n",
"if notebook_dir.name == 'notebooks':\n",
" project_root = notebook_dir.parent\n",
"else:\n",
" project_root = Path.cwd()\n",
"\n",
"# Add project root to the beginning of sys.path\n",
"project_root_str = str(project_root.absolute())\n",
"if project_root_str not in sys.path:\n",
" sys.path.insert(0, project_root_str)\n",
"\n",
"print(f\"📁 Project root: {project_root_str}\")"
],
"id": "19e74e6b691020db",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"📁 Project root: /Users/lazar/PycharmProjects/cognee\n"
]
}
],
"execution_count": 2
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Finally, we will begin with a clean slate, by removing any previous Cognee data:",
"id": "af584b935cbdc8d"
},
{
"metadata": {},
"cell_type": "code",
"outputs": [],
"execution_count": null,
"source": [
"await cognee.prune.prune_data()\n",
"await cognee.prune.prune_system(metadata=True)"
],
"id": "dd47383aa9519465"
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"### Exploring Guido's Python Contributions\n",
"\n",
"We'll begin with a document that contains detailed PRs and commits from Guido van Rossum's work on mypy and CPython, showing real-world examples of Python's creator solving type system and language design challenges.\n",
"\n",
"We'll use Cognee's `add()` and `cognify()` functions to ingest this data and build a knowledge graph that connects Guido's development patterns with Python best practices."
],
"id": "93c9783037715026"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T10:00:14.685409Z",
"start_time": "2025-09-07T10:00:12.419145Z"
}
},
"cell_type": "code",
"source": [
"import cognee\n",
"\n",
"\n",
"\n",
"result = await cognee.add(\"file://data/guido_contributions.json\", node_set=[\"guido\"])\n",
"await cognee.cognify()\n",
"results = await cognee.search(\"Show me commits\")"
],
"id": "b8743ed520b4de37",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"\u001B[2m2025-09-07T10:00:12.505721\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mOntology file 'None' not found. No owl ontology will be attached to the graph.\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T10:00:12.578388\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 85 nodes and 182 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T10:00:12.580139\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mGraph projection completed: 85 nodes, 182 edges in 0.03s\u001B[0m [\u001B[0m\u001B[1m\u001B[34mCogneeGraph\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T10:00:12.958731\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mVector collection retrieval completed: Retrieved distances from 6 collections in 0.03s\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.shared.logging_utils\u001B[0m]\u001B[0m\n"
]
}
],
"execution_count": 6
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T10:00:16.283950Z",
"start_time": "2025-09-07T10:00:16.280509Z"
}
},
"cell_type": "code",
"source": "results[0]",
"id": "f08b362cbf12b398",
"outputs": [
{
"data": {
"text/plain": [
"'Here are the commits from the provided context:'"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 7
},
{
"metadata": {},
"cell_type": "markdown",
"source": "What's happening here? The search() function uses natural language to query a knowledge graph containing Guido's development history. Unlike traditional databases, this understands the relationships between commits, language features, design decisions, and evolution over time.",
"id": "10d582d02ead905e"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T10:04:42.969912Z",
"start_time": "2025-09-07T10:04:42.898473Z"
}
},
"cell_type": "code",
"source": [
"from cognee import visualize_graph\n",
"\n",
"await visualize_graph('./guido_contributions.html')"
],
"id": "1fb068f422bda6cf",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"\u001B[2m2025-09-07T10:04:42.959421\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 85 nodes and 182 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T10:04:42.963711\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mGraph visualization saved as ./guido_contributions.html\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.shared.logging_utils\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T10:04:42.964638\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mThe HTML file has been stored at path: ./guido_contributions.html\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.shared.logging_utils\u001B[0m]\u001B[0m\n"
]
},
{
"data": {
"text/plain": [
"'\\n <!DOCTYPE html>\\n <html>\\n <head>\\n <meta charset=\"utf-8\">\\n <script src=\"https://d3js.org/d3.v5.min.js\"></script>\\n <style>\\n body, html { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; background: linear-gradient(90deg, #101010, #1a1a2e); color: white; font-family: \\'Inter\\', sans-serif; }\\n\\n svg { width: 100vw; height: 100vh; display: block; }\\n .links line { stroke: rgba(255, 255, 255, 0.4); stroke-width: 2px; }\\n .links line.weighted { stroke: rgba(255, 215, 0, 0.7); }\\n .links line.multi-weighted { stroke: rgba(0, 255, 127, 0.8); }\\n .nodes circle { stroke: white; stroke-width: 0.5px; filter: drop-shadow(0 0 5px rgba(255,255,255,0.3)); }\\n .node-label { font-size: 5px; font-weight: bold; fill: white; text-anchor: middle; dominant-baseline: middle; font-family: \\'Inter\\', sans-serif; pointer-events: none; }\\n .edge-label { font-size: 3px; fill: rgba(255, 255, 255, 0.7); text-anchor: middle; dominant-baseline: middle; font-family: \\'Inter\\', sans-serif; pointer-events: none; }\\n \\n .tooltip {\\n position: absolute;\\n text-align: left;\\n padding: 8px;\\n font-size: 12px;\\n background: rgba(0, 0, 0, 0.9);\\n color: white;\\n border: 1px solid rgba(255, 255, 255, 0.3);\\n border-radius: 4px;\\n pointer-events: none;\\n opacity: 0;\\n transition: opacity 0.2s;\\n z-index: 1000;\\n max-width: 300px;\\n word-wrap: break-word;\\n }\\n </style>\\n </head>\\n <body>\\n <svg></svg>\\n <div class=\"tooltip\" id=\"tooltip\"></div>\\n <script>\\n var nodes = [{\"id\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"text\": \"\\\\n Susan should always review new code changes before merging to main.\\\\n New releases should not happen on Friday so we don\\'t have to fix them during the weekend.\\\\n \", \"chunk_index\": 0, \"chunk_size\": 76, \"cut_type\": \"paragraph_end\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"DocumentChunk\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#801212\", \"name\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\"}, {\"id\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"description\": \"Reviewer who must approve changes before merging to main\", \"name\": \"susan\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"d072ba0f-e1a9-58bf-9974-e1802adc8134\", \"description\": \"person\", \"name\": \"person\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"5753ee74-d6f5-5407-86de-f5c1599d258a\", \"description\": \"Main branch of the repository\", \"name\": \"main\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"ad9dd386-60ea-5204-9bd7-0a4861b87c02\", \"description\": \"branch\", \"name\": \"branch\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"4b0ecca4-7e42-5c18-8050-aff051d48f74\", \"description\": \"Code changes that are new and need review before merging\", \"name\": \"new code changes\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"description\": \"concept\", \"name\": \"concept\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"61806582-543f-5a98-a5a3-b30e368340ef\", \"description\": \"Software releases\", \"name\": \"new releases\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"23113263-f417-5426-9189-018203405fbb\", \"description\": \"Day of week when releases should not happen\", \"name\": \"friday\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"description\": \"PR creation date.\", \"name\": \"2025-09-05\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"8ac1709a-a832-5711-96c4-919d41496af8\", \"raw_data_location\": \"file:///Users/lazar/PycharmProjects/cognee/cognee/.data_storage/text_0214d8f8b9ec1d6cf1c364d354e0a6ac.txt\", \"mime_type\": \"text/plain\", \"name\": \"text_0214d8f8b9ec1d6cf1c364d354e0a6ac\", \"ontology_valid\": false, \"topological_rank\": 0, \"external_metadata\": \"{}\", \"type\": \"TextDocument\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#D3D3D3\"}, {\"id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"text\": \"\\\\n We want code to be formatted by PEP8 standards.\\\\n Typing and Docstrings must be added.\\\\n Please also make sure to write NOTE: on all more complex code segments.\\\\n If there is any duplicate code, try to handle it in one function to avoid code duplication.\\\\n Susan should also always review new code changes before merging to main.\\\\n New releases should not happen on Friday so we don\\'t have to fix them during the weekend.\\\\n \", \"chunk_index\": 0, \"chunk_size\": 196, \"cut_type\": \"paragraph_end\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"DocumentChunk\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#801212\", \"name\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\"}, {\"id\": \"b8b946ea-31d8-5bb2-b7d7-0e5a60d0847a\", \"description\": \"Python style guide for code formatting\", \"name\": \"pep8\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"3aa74625-a00e-58c7-bb81-4c38b9e4a8c5\", \"description\": \"standard\", \"name\": \"standard\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"e2a6bacf-7da5-513f-895c-60ea96744d57\", \"description\": \"Use of type hints in Python code\", \"name\": \"typing\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"57287794-d03b-5f3e-ada7-f4e69f6676d5\", \"description\": \"Documentation strings for modules, classes, functions\", \"name\": \"docstrings\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"5924ba28-aa89-534c-b5d6-0974e2194089\", \"description\": \"Include NOTE: on complex code segments\", \"name\": \"note_tag\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"5eac68d6-95a0-5a10-819a-26aad1d9006a\", \"description\": \"convention\", \"name\": \"convention\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"a7782fe0-b311-5e8c-b9de-7eba4657e00d\", \"description\": \"Refactor duplicate code into single functions\", \"name\": \"deduplicate_code\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"4d0ff2f4-8a28-5c14-a533-dc8e018aa46c\", \"description\": \"practice\", \"name\": \"practice\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"b37a7e7f-38ca-54be-9270-f7f44e13e2b9\", \"description\": \"Do not release new versions on Friday\", \"name\": \"release_day_constraint\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"006be3b7-a897-55bc-bb5f-efa02318dcf9\", \"description\": \"rule\", \"name\": \"rule\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"b6300805-a086-5562-a7a5-8cdda7d0849c\", \"raw_data_location\": \"file:///Users/lazar/PycharmProjects/cognee/cognee/.data_storage/text_39e408c72fd981a472a8cebacfb691bc.txt\", \"mime_type\": \"text/plain\", \"name\": \"text_39e408c72fd981a472a8cebacfb691bc\", \"ontology_valid\": false, \"topological_rank\": 0, \"external_metadata\": \"{}\", \"type\": \"TextDocument\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#D3D3D3\"}, {\"id\": \"56e24564-89ba-5b01-a2a0-8901f1a6293f\", \"text\": \"Code reviews by Susan required; avoid Friday releases.\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"56e24564-89ba-5b01-a2a0-8901f1a6293f\"}, {\"id\": \"b1b53420-5e54-501f-987a-c04bb5cf9eef\", \"text\": \"Repository coding and release policies\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"b1b53420-5e54-501f-987a-c04bb5cf9eef\"}, {\"id\": \"11111111-1111-1111-1111-111111111111\", \"text\": \"Require at least one peer review by a designated reviewer for all changes to main or protected branches before merging.\", \"ontology_valid\": true, \"topological_rank\": 0, \"type\": \"Rule\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"rule\\\\\"]}\", \"version\": 1, \"color\": \"#D3D3D3\", \"name\": \"11111111-1111-1111-1111-111111111111\"}, {\"id\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"name\": \"coding_agent_rules\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"NodeSet\", \"metadata\": \"{\\\\\"index_fields\\\\\": []}\", \"version\": 1, \"color\": \"#D3D3D3\"}, {\"id\": \"22222222-2222-2222-2222-222222222222\", \"text\": \"Enforce that release deployments include an automated checklist verifying tests, migrations, and monitoring are green before promotion to production.\", \"ontology_valid\": true, \"topological_rank\": 0, \"type\": \"Rule\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"rule\\\\\"]}\", \"version\": 1, \"color\": \"#D3D3D3\", \"name\": \"22222222-2222-2222-2222-222222222222\"}, {\"id\": \"33333333-3333-3333-3333-333333333333\", \"text\": \"Prevent scheduling automated releases or deployments during defined blackout windows (e.g., weekends or late hours) unless explicitly approved with a rollback plan.\", \"ontology_valid\": true, \"topological_rank\": 0, \"type\": \"Rule\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"rule\\\\\"]}\", \"version\": 1, \"color\": \"#D3D3D3\", \"name\": \"33333333-3333-3333-3333-333333333333\"}, {\"id\": \"d1a9e2b3-0000-4c4d-8b2a-abcdef012345\", \"text\": \"Enforce consistent code formatting using a configurable formatter (e.g., Black for Python) integrated into pre-commit hooks and CI checks to automatically reject non-conforming changes.\", \"ontology_valid\": true, \"topological_rank\": 0, \"type\": \"Rule\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"rule\\\\\"]}\", \"version\": 1, \"color\": \"#D3D3D3\", \"name\": \"d1a9e2b3-0000-4c4d-8b2a-abcdef012345\"}, {\"id\": \"e2b3f4c5-0000-4d4e-9c3b-abcdef678901\", \"text\": \"Require static typing annotations and enforce them with type-checking tools (e.g., mypy) in CI; mandate clear docstrings for public functions and classes checked by documentation linters.\", \"ontology_valid\": true, \"topological_rank\": 0, \"type\": \"Rule\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"rule\\\\\"]}\", \"version\": 1, \"color\": \"#D3D3D3\", \"name\": \"e2b3f4c5-0000-4d4e-9c3b-abcdef678901\"}, {\"id\": \"f3c4d5e6-0000-4e5f-ac4d-abcdef234567\", \"text\": \"Designate at least one required approver per repository (a list of reviewers) enforced by branch protection rules; require that designated reviewers verify complex or high-risk changes before merge.\", \"ontology_valid\": true, \"topological_rank\": 0, \"type\": \"Rule\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"rule\\\\\"]}\", \"version\": 1, \"color\": \"#D3D3D3\", \"name\": \"f3c4d5e6-0000-4e5f-ac4d-abcdef234567\"}, {\"id\": \"a4d5e6f7-0000-4f6a-bd5e-abcdef345678\", \"text\": \"Discourage duplicated code by requiring developers to refactor repeated logic into reusable functions or modules; include automated detection of code duplication in CI (e.g., static analysis tools).\", \"ontology_valid\": true, \"topological_rank\": 0, \"type\": \"Rule\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"rule\\\\\"]}\", \"version\": 1, \"color\": \"#D3D3D3\", \"name\": \"a4d5e6f7-0000-4f6a-bd5e-abcdef345678\"}, {\"id\": \"b5e6f7a8-0000-4a7b-cd6f-abcdef456789\", \"text\": \"Define release scheduling policies that prohibit initiating major releases during high-risk windows (e.g., weekends or late hours) unless an explicit approval with a documented rollback plan is recorded.\", \"ontology_valid\": true, \"topological_rank\": 0, \"type\": \"Rule\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"rule\\\\\"]}\", \"version\": 1, \"color\": \"#D3D3D3\", \"name\": \"b5e6f7a8-0000-4a7b-cd6f-abcdef456789\"}, {\"id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"text\": \"[\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"pr\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"Re-work indirect dependencies\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"Wow, this was quite a ride. Indirect dependencies were always supported kind of on best effort. This PR puts them on some principled foundation. It fixes three crashes and three stale types reported. All tests are quite weird/obscure, they are designed to expose the flaws in current logic (plus one test that passes on master, but it covers important corner case, so I add it just in case ). A short summary of various fixes (in arbitrary order):\\\\\\\\r\\\\\\\\n* Update many outdated comments and docstrings\\\\\\\\r\\\\\\\\n* Missing transitive dependency is now considered stale\\\\\\\\r\\\\\\\\n* Handle transitive generic bases in indirection visitor\\\\\\\\r\\\\\\\\n* Handle chained alias targets in indirection visitor\\\\\\\\r\\\\\\\\n* Always record original aliases during semantic analysis\\\\\\\\r\\\\\\\\n* Delete `qualified_tvars` as a concept, they are not needed since long ago\\\\\\\\r\\\\\\\\n* Remove ad-hoc handling for `TypeInfo`s from `build.py`\\\\\\\\r\\\\\\\\n* Support symbols with setter type different from getter type\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nIn general the logic should be more simple/straightforward now:\\\\\\\\r\\\\\\\\n* Get all types in a file (need both symbol types _and_ expression types since some types may be only local)\\\\\\\\r\\\\\\\\n* For each type _transitively_ find all named types in them (thus aggregating all interfaces the type depends on)\\\\\\\\r\\\\\\\\n* In case any type was forced using `get_proper_type()`, record the orginal type alias during semantic analysis\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nNote since this makes the algorithm correct, it may also make it slower (most notably because we must visit generic bases). I tried to offset this by couple optimizations, hopefully performance impact will be minimal.\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/pull/19798\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2025-09-05T13:54:52Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"19798\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"mypy/build.py\\\\\",\\\\n \\\\\"mypy/fixup.py\\\\\",\\\\n \\\\\"mypy/indirection.py\\\\\",\\\\n \\\\\"mypy/nodes.py\\\\\",\\\\n \\\\\"mypy/semanal.py\\\\\",\\\\n \\\\\"mypy/server/deps.py\\\\\",\\\\n \\\\\"mypy/test/typefixture.py\\\\\",\\\\n \\\\\"mypy/typeanal.py\\\\\",\\\\n \\\\\"test-data/unit/check-incremental.test\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 0,\\\\n \\\\\"deletions\\\\\": 0,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/build.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"from mypy.graph_utils import prepare_sccs, strongly_connected_components, topsort\\\\\\\\nfrom mypy.indirection import TypeIndirectionVisitor\\\\\\\\nfrom mypy.messages import MessageBuilder\\\\\\\\nfrom mypy.nodes import Import, ImportAll, ImportBase, ImportFrom, MypyFile, SymbolTable, TypeInfo\\\\\\\\nfrom mypy.partially_defined import PossiblyUndefinedVariableVisitor\\\\\\\\nfrom mypy.semanal import SemanticAnalyzer\\\\\\\\nfrom mypy.semanal_pass1 import SemanticAnalyzerPreAnalysis\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"from mypy.graph_utils import prepare_sccs, strongly_connected_components, topsort\\\\\\\\nfrom mypy.indirection import TypeIndirectionVisitor\\\\\\\\nfrom mypy.messages import MessageBuilder\\\\\\\\nfrom mypy.nodes import (\\\\\\\\n Decorator,\\\\\\\\n Import,\\\\\\\\n ImportAll,\\\\\\\\n ImportBase,\\\\\\\\n ImportFrom,\\\\\\\\n MypyFile,\\\\\\\\n OverloadedFuncDef,\\\\\\\\n SymbolTable,\\\\\\\\n)\\\\\\\\nfrom mypy.partially_defined import PossiblyUndefinedVariableVisitor\\\\\\\\nfrom mypy.semanal import SemanticAnalyzer\\\\\\\\nfrom mypy.semanal_pass1 import SemanticAnalyzerPreAnalysis\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"from mypy.graph_utils import prepare_sccs, strongly_connected_components, topsort\\\\\\\\nfrom mypy.indirection import TypeIndirectionVisitor\\\\\\\\nfrom mypy.messages import MessageBuilder\\\\\\\\nfrom mypy.nodes import Import, ImportAll, ImportBase, ImportFrom, MypyFile, SymbolTable, TypeInfo\\\\\\\\nfrom mypy.nodes import (\\\\\\\\n Decorator,\\\\\\\\n Import,\\\\\\\\n ImportAll,\\\\\\\\n ImportBase,\\\\\\\\n ImportFrom,\\\\\\\\n MypyFile,\\\\\\\\n OverloadedFuncDef,\\\\\\\\n SymbolTable,\\\\\\\\n)\\\\\\\\nfrom mypy.partially_defined import PossiblyUndefinedVariableVisitor\\\\\\\\nfrom mypy.semanal import SemanticAnalyzer\\\\\\\\nfrom mypy.semanal_pass1 import SemanticAnalyzerPreAnalysis\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/build.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"\\\\\\\\nFor single nodes, processing is simple. If the node was cached, we\\\\\\\\ndeserialize the cache data and fix up cross-references. Otherwise, we\\\\\\\\ndo semantic analysis followed by type checking. We also handle (c)\\\\\\\\nabove; if a module has valid cache data *but* any of its\\\\\\\\ndependencies was processed from source, then the module should be\\\\\\\\nprocessed from source.\\\\\\\\n\\\\\\\\nA relatively simple optimization (outside SCCs) we might do in the\\\\\\\\nfuture is as follows: if a node\\'s cache data is valid, but one or more\\\\\\\\nof its dependencies are out of date so we have to re-parse the node\\\\\\\\nfrom source, once we have fully type-checked the node, we can decide\\\\\\\\nwhether its symbol table actually changed compared to the cache data\\\\\\\\n(by reading the cache data and comparing it to the data we would be\\\\\\\\nwriting). If there is no change we can declare the node up to date,\\\\\\\\nand any node that depends (and for which we have cached data, and\\\\\\\\nwhose other dependencies are up to date) on it won\\'t need to be\\\\\\\\nre-parsed from source.\\\\\\\\n\\\\\\\\nImport cycles\\\\\\\\n-------------\\\\\\\\n\\\\\\\\nFinally we have to decide how to handle (c), import cycles. Here\\\\\\\\nwe\\'ll need a modified version of the original state machine\\\\\\\\n(build.py), but we only need to do this per SCC, and we won\\'t have to\\\\\\\\ndeal with changes to the list of nodes while we\\'re processing it.\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"\\\\\\\\nFor single nodes, processing is simple. If the node was cached, we\\\\\\\\ndeserialize the cache data and fix up cross-references. Otherwise, we\\\\\\\\ndo semantic analysis followed by type checking. Once we (re-)processed\\\\\\\\nan SCC we check whether its interface (symbol table) is still fresh\\\\\\\\n(matches previous cached value). If it is not, we consider dependent SCCs\\\\\\\\nstale so that they need to be re-parsed as well.\\\\\\\\n\\\\\\\\nNote on indirect dependencies: normally dependencies are determined from\\\\\\\\nimports, but since our type interfaces are \\\\\\\\\\\\\"opaque\\\\\\\\\\\\\" (i.e. symbol tables can\\\\\\\\ncontain types identified by name), these are not enough. We *must* also\\\\\\\\nadd \\\\\\\\\\\\\"indirect\\\\\\\\\\\\\" dependencies from types to their definitions. For this\\\\\\\\npurpose, after we finished processing a module, we travers its type map and\\\\\\\\nsymbol tables, and for each type we find (transitively) on which opaque/named\\\\\\\\ntypes it depends.\\\\\\\\n\\\\\\\\nImport cycles\\\\\\\\n-------------\\\\\\\\n\\\\\\\\nFinally we have to decide how to handle (b), import cycles. Here\\\\\\\\nwe\\'ll need a modified version of the original state machine\\\\\\\\n(build.py), but we only need to do this per SCC, and we won\\'t have to\\\\\\\\ndeal with changes to the list of nodes while we\\'re processing it.\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"\\\\\\\\nFor single nodes, processing is simple. If the node was cached, we\\\\\\\\ndeserialize the cache data and fix up cross-references. Otherwise, we\\\\\\\\ndo semantic analysis followed by type checking. We also handle (c)\\\\\\\\nabove; if a module has valid cache data *but* any of its\\\\\\\\ndependencies was processed from source, then the module should be\\\\\\\\nprocessed from source.\\\\\\\\n\\\\\\\\nA relatively simple optimization (outside SCCs) we might do in the\\\\\\\\nfuture is as follows: if a node\\'s cache data is valid, but one or more\\\\\\\\nof its dependencies are out of date so we have to re-parse the node\\\\\\\\nfrom source, once we have fully type-checked the node, we can decide\\\\\\\\nwhether its symbol table actually changed compared to the cache data\\\\\\\\n(by reading the cache data and comparing it to the data we would be\\\\\\\\nwriting). If there is no change we can declare the node up to date,\\\\\\\\nand any node that depends (and for which we have cached data, and\\\\\\\\nwhose other dependencies are up to date) on it won\\'t need to be\\\\\\\\nre-parsed from source.\\\\\\\\ndo semantic analysis followed by type checking. Once we (re-)processed\\\\\\\\nan SCC we check whether its interface (symbol table) is still fresh\\\\\\\\n(matches previous cached value). If it is not, we consider dependent SCCs\\\\\\\\nstale so that they need to be re-parsed as well.\\\\\\\\n\\\\\\\\nNote on indirect dependencies: normally dependencies are determined from\\\\\\\\nimports, but since our type interfaces are \\\\\\\\\\\\\"opaque\\\\\\\\\\\\\" (i.e. symbol tables can\\\\\\\\ncontain types identified by name), these are not enough. We *must* also\\\\\\\\nadd \\\\\\\\\\\\\"indirect\\\\\\\\\\\\\" dependencies from types to their definitions. For this\\\\\\\\npurpose, after we finished processing a module, we travers its type map and\\\\\\\\nsymbol tables, and for each type we find (transitively) on which opaque/named\\\\\\\\ntypes it depends.\\\\\\\\n\\\\\\\\nImport cycles\\\\\\\\n-------------\\\\\\\\n\\\\\\\\nFinally we have to decide how to handle (c), import cycles. Here\\\\\\\\nFinally we have to decide how to handle (b), import cycles. Here\\\\\\\\nwe\\'ll need a modified version of the original state machine\\\\\\\\n(build.py), but we only need to do this per SCC, and we won\\'t have to\\\\\\\\ndeal with changes to the list of nodes while we\\'re processing it.\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 10,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"generator_expression\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/build.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"\\\\\\\\n # We should always patch indirect dependencies, even in full (non-incremental) builds,\\\\\\\\n # because the cache still may be written, and it must be correct.\\\\\\\\n # TODO: find a more robust way to traverse *all* relevant types?\\\\\\\\n all_types = list(self.type_map().values())\\\\\\\\n for _, sym, _ in self.tree.local_definitions():\\\\\\\\n if sym.type is not None:\\\\\\\\n all_types.append(sym.type)\\\\\\\\n if isinstance(sym.node, TypeInfo):\\\\\\\\n # TypeInfo symbols have some extra relevant types.\\\\\\\\n all_types.extend(sym.node.bases)\\\\\\\\n if sym.node.metaclass_type:\\\\\\\\n all_types.append(sym.node.metaclass_type)\\\\\\\\n if sym.node.typeddict_type:\\\\\\\\n all_types.append(sym.node.typeddict_type)\\\\\\\\n if sym.node.tuple_type:\\\\\\\\n all_types.append(sym.node.tuple_type)\\\\\\\\n self._patch_indirect_dependencies(self.type_checker().module_refs, all_types)\\\\\\\\n\\\\\\\\n if self.options.dump_inference_stats:\\\\\\\\n dump_type_stats(\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"\\\\\\\\n # We should always patch indirect dependencies, even in full (non-incremental) builds,\\\\\\\\n # because the cache still may be written, and it must be correct.\\\\\\\\n all_types = set(self.type_map().values())\\\\\\\\n for _, sym, _ in self.tree.local_definitions():\\\\\\\\n if sym.type is not None:\\\\\\\\n all_types.add(sym.type)\\\\\\\\n # Special case: settable properties may have two types.\\\\\\\\n if isinstance(sym.node, OverloadedFuncDef) and sym.node.is_property:\\\\\\\\n assert isinstance(first_node := sym.node.items[0], Decorator)\\\\\\\\n if first_node.var.setter_type:\\\\\\\\n all_types.add(first_node.var.setter_type)\\\\\\\\n # Using mod_alias_deps is unfortunate but needed, since it is highly impractical\\\\\\\\n # (and practically impossible) to avoid all get_proper_type() calls. For example,\\\\\\\\n # TypeInfo.bases and metaclass, *args and **kwargs, Overloaded.items, and trivial\\\\\\\\n # aliases like Text = str, etc. all currently forced to proper types. Thus, we need\\\\\\\\n # to record the original definitions as they are first seen in semanal.py.\\\\\\\\n self._patch_indirect_dependencies(\\\\\\\\n self.type_checker().module_refs | self.tree.mod_alias_deps, all_types\\\\\\\\n )\\\\\\\\n\\\\\\\\n if self.options.dump_inference_stats:\\\\\\\\n dump_type_stats(\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"\\\\\\\\n # We should always patch indirect dependencies, even in full (non-incremental) builds,\\\\\\\\n # because the cache still may be written, and it must be correct.\\\\\\\\n # TODO: find a more robust way to traverse *all* relevant types?\\\\\\\\n all_types = list(self.type_map().values())\\\\\\\\n all_types = set(self.type_map().values())\\\\\\\\n for _, sym, _ in self.tree.local_definitions():\\\\\\\\n if sym.type is not None:\\\\\\\\n all_types.append(sym.type)\\\\\\\\n if isinstance(sym.node, TypeInfo):\\\\\\\\n # TypeInfo symbols have some extra relevant types.\\\\\\\\n all_types.extend(sym.node.bases)\\\\\\\\n if sym.node.metaclass_type:\\\\\\\\n all_types.append(sym.node.metaclass_type)\\\\\\\\n if sym.node.typeddict_type:\\\\\\\\n all_types.append(sym.node.typeddict_type)\\\\\\\\n if sym.node.tuple_type:\\\\\\\\n all_types.append(sym.node.tuple_type)\\\\\\\\n self._patch_indirect_dependencies(self.type_checker().module_refs, all_types)\\\\\\\\n all_types.add(sym.type)\\\\\\\\n # Special case: settable properties may have two types.\\\\\\\\n if isinstance(sym.node, OverloadedFuncDef) and sym.node.is_property:\\\\\\\\n assert isinstance(first_node := sym.node.items[0], Decorator)\\\\\\\\n if first_node.var.setter_type:\\\\\\\\n all_types.add(first_node.var.setter_type)\\\\\\\\n # Using mod_alias_deps is unfortunate but needed, since it is highly impractical\\\\\\\\n # (and practically impossible) to avoid all get_proper_type() calls. For example,\\\\\\\\n # TypeInfo.bases and metaclass, *args and **kwargs, Overloaded.items, and trivial\\\\\\\\n # aliases like Text = str, etc. all currently forced to proper types. Thus, we need\\\\\\\\n # to record the original definitions as they are first seen in semanal.py.\\\\\\\\n self._patch_indirect_dependencies(\\\\\\\\n self.type_checker().module_refs | self.tree.mod_alias_deps, all_types\\\\\\\\n )\\\\\\\\n\\\\\\\\n if self.options.dump_inference_stats:\\\\\\\\n dump_type_stats(\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 8,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"generator_expression\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/build.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" self._type_checker.reset()\\\\\\\\n self._type_checker = None\\\\\\\\n\\\\\\\\n def _patch_indirect_dependencies(self, module_refs: set[str], types: list[Type]) -> None:\\\\\\\\n assert None not in types\\\\\\\\n valid = self.valid_references()\\\\\\\\n\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" self._type_checker.reset()\\\\\\\\n self._type_checker = None\\\\\\\\n\\\\\\\\n def _patch_indirect_dependencies(self, module_refs: set[str], types: set[Type]) -> None:\\\\\\\\n assert None not in types\\\\\\\\n valid = self.valid_references()\\\\\\\\n\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" self._type_checker.reset()\\\\\\\\n self._type_checker = None\\\\\\\\n\\\\\\\\n def _patch_indirect_dependencies(self, module_refs: set[str], types: list[Type]) -> None:\\\\\\\\n def _patch_indirect_dependencies(self, module_refs: set[str], types: set[Type]) -> None:\\\\\\\\n assert None not in types\\\\\\\\n valid = self.valid_references()\\\\\\\\n\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": \\\\\"_patch_indirect_dependencies\\\\\",\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"function_definition\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/build.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" for id in scc:\\\\\\\\n deps.update(graph[id].dependencies)\\\\\\\\n deps -= ascc\\\\\\\\n stale_deps = {id for id in deps if id in graph and not graph[id].is_interface_fresh()}\\\\\\\\n fresh = fresh and not stale_deps\\\\\\\\n undeps = set()\\\\\\\\n if fresh:\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" for id in scc:\\\\\\\\n deps.update(graph[id].dependencies)\\\\\\\\n deps -= ascc\\\\\\\\n # Note: if a dependency is not in graph anymore, it should be considered interface-stale.\\\\\\\\n # This is important to trigger any relevant updates from indirect dependencies that were\\\\\\\\n # removed in load_graph().\\\\\\\\n stale_deps = {id for id in deps if id not in graph or not graph[id].is_interface_fresh()}\\\\\\\\n fresh = fresh and not stale_deps\\\\\\\\n undeps = set()\\\\\\\\n if fresh:\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" for id in scc:\\\\\\\\n deps.update(graph[id].dependencies)\\\\\\\\n deps -= ascc\\\\\\\\n stale_deps = {id for id in deps if id in graph and not graph[id].is_interface_fresh()}\\\\\\\\n # Note: if a dependency is not in graph anymore, it should be considered interface-stale.\\\\\\\\n # This is important to trigger any relevant updates from indirect dependencies that were\\\\\\\\n # removed in load_graph().\\\\\\\\n stale_deps = {id for id in deps if id not in graph or not graph[id].is_interface_fresh()}\\\\\\\\n fresh = fresh and not stale_deps\\\\\\\\n undeps = set()\\\\\\\\n if fresh:\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"generator_expression\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/indirection.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" def __init__(self) -> None:\\\\\\\\n # Module references are collected here\\\\\\\\n self.modules: set[str] = set()\\\\\\\\n # User to avoid infinite recursion with recursive type aliases\\\\\\\\n self.seen_aliases: set[types.TypeAliasType] = set()\\\\\\\\n # Used to avoid redundant work\\\\\\\\n self.seen_fullnames: set[str] = set()\\\\\\\\n\\\\\\\\n def find_modules(self, typs: Iterable[types.Type]) -> set[str]:\\\\\\\\n self.modules = set()\\\\\\\\n self.seen_fullnames = set()\\\\\\\\n self.seen_aliases = set()\\\\\\\\n for typ in typs:\\\\\\\\n self._visit(typ)\\\\\\\\n return self.modules\\\\\\\\n\\\\\\\\n def _visit(self, typ: types.\", \"chunk_index\": 0, \"chunk_size\": 8175, \"cut_type\": \"sentence_end\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"DocumentChunk\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#801212\", \"name\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\"}, {\"id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"name\": \"guido\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"NodeSet\", \"metadata\": \"{\\\\\"index_fields\\\\\": []}\", \"version\": 1, \"color\": \"#D3D3D3\"}, {\"id\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"description\": \"PR to rework handling of indirect dependencies in mypy, fixes crashes and stale types, updates comments, records original aliases, handles generics and chained aliases, supports setter type differing from getter.\", \"name\": \"re-work indirect dependencies\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"description\": \"pullrequest\", \"name\": \"pullrequest\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"description\": \"Static type checker for Python.\", \"name\": \"mypy\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"0a95583a-244a-596f-b60a-fe3d9307e7ea\", \"description\": \"softwarerepository\", \"name\": \"softwarerepository\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"description\": \"List of files modified by the PR.\", \"name\": \"files changed in pr 19798\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"2f1666ba-5553-52fe-b0da-560a43f3e131\", \"description\": \"Build and incremental processing logic; updated to patch indirect dependencies and record module alias deps.\", \"name\": \"mypy/build.py\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"description\": \"file\", \"name\": \"file\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"3dbe696b-03af-56d4-a61b-16fbc0d30ee8\", \"description\": \"Type indirection visitor updated to handle transitive generic bases and chained alias targets.\", \"name\": \"mypy/indirection.py\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"0c0f550d-f630-54c3-9d23-bc5ae28bf39b\", \"description\": \"Semantic analysis updated to record original aliases.\", \"name\": \"mypy/semanal.py\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"description\": \"Visitor that finds module references from types; improved to handle generics and aliases.\", \"name\": \"typeindirectionvisitor\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"9e295ef4-1c4e-5509-a47f-65c0c508282f\", \"description\": \"class\", \"name\": \"class\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"efcde15b-056f-5dd1-8ce0-f05dfdf6227a\", \"description\": \"List of fixes: update comments, missing transitive dependency stale, handle transitive generic bases, chained alias targets, record original aliases, delete qualified_tvars, remove ad-hoc TypeInfo handling, support setter type.\", \"name\": \"summary of fixes\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"1954e7fd-eaac-5121-a674-ce501cd1c2a1\", \"description\": \"Pull request number/sha.\", \"name\": \"19798\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"a5b7efe7-e02c-505a-9dd8-3f0643bacfb9\", \"description\": \"identifier\", \"name\": \"identifier\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"raw_data_location\": \"file:///Users/lazar/PycharmProjects/cognee/cognee/.data_storage/text_e26f30c905128d5b231744dd2a381270.txt\", \"mime_type\": \"text/plain\", \"name\": \"guido_contributions\", \"ontology_valid\": false, \"topological_rank\": 0, \"external_metadata\": \"{\\\\n \\\\\"node_set\\\\\": [\\\\n \\\\\"guido\\\\\"\\\\n ]\\\\n}\", \"type\": \"TextDocument\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#D3D3D3\"}, {\"text\": \"Type) -> None:\\\\\\\\n if isinstance(typ, types.TypeAliasType):\\\\\\\\n # Avoid infinite recursion for recursive type aliases.\\\\\\\\n if typ not in self.seen_aliases:\\\\\\\\n self.seen_aliases.add(typ)\\\\\\\\n typ.accept(self)\\\\\\\\n\\\\\\\\n def _visit_type_tuple(self, typs: tuple[types.Type, ...]) -> None:\\\\\\\\n # Micro-optimization: Specialized version of _visit for lists\\\\\\\\n for typ in typs:\\\\\\\\n if isinstance(typ, types.TypeAliasType):\\\\\\\\n # Avoid infinite recursion for recursive type aliases.\\\\\\\\n if typ in self.seen_aliases:\\\\\\\\n continue\\\\\\\\n self.seen_aliases.add(typ)\\\\\\\\n typ.accept(self)\\\\\\\\n\\\\\\\\n def _visit_type_list(self, typs: list[types.Type]) -> None:\\\\\\\\n # Micro-optimization: Specialized version of _visit for tuples\\\\\\\\n for typ in typs:\\\\\\\\n if isinstance(typ, types.TypeAliasType):\\\\\\\\n # Avoid infinite recursion for recursive type aliases.\\\\\\\\n if typ in self.seen_aliases:\\\\\\\\n continue\\\\\\\\n self.seen_aliases.add(typ)\\\\\\\\n typ.accept(self)\\\\\\\\n\\\\\\\\n def _visit_module_name(self, module_name: str) -> None:\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" def __init__(self) -> None:\\\\\\\\n # Module references are collected here\\\\\\\\n self.modules: set[str] = set()\\\\\\\\n # User to avoid infinite recursion with recursive types\\\\\\\\n self.seen_types: set[types.TypeAliasType | types.Instance] = set()\\\\\\\\n # Used to avoid redundant work\\\\\\\\n self.seen_fullnames: set[str] = set()\\\\\\\\n\\\\\\\\n def find_modules(self, typs: Iterable[types.Type]) -> set[str]:\\\\\\\\n self.modules = set()\\\\\\\\n self.seen_fullnames = set()\\\\\\\\n self.seen_types = set()\\\\\\\\n for typ in typs:\\\\\\\\n self._visit(typ)\\\\\\\\n return self.modules\\\\\\\\n\\\\\\\\n def _visit(self, typ: types.Type) -> None:\\\\\\\\n # Note: instances are needed for `class str(Sequence[str]): ...`\\\\\\\\n if (\\\\\\\\n isinstance(typ, types.TypeAliasType)\\\\\\\\n or isinstance(typ, types.ProperType)\\\\\\\\n and isinstance(typ, types.Instance)\\\\\\\\n ):\\\\\\\\n # Avoid infinite recursion for recursive types.\\\\\\\\n if typ in self.seen_types:\\\\\\\\n return\\\\\\\\n self.seen_types.add(typ)\\\\\\\\n typ.accept(self)\\\\\\\\n\\\\\\\\n def _visit_type_tuple(self, typs: tuple[types.Type, ...]) -> None:\\\\\\\\n # Micro-optimization: Specialized version of _visit for lists\\\\\\\\n for typ in typs:\\\\\\\\n if (\\\\\\\\n isinstance(typ, types.TypeAliasType)\\\\\\\\n or isinstance(typ, types.ProperType)\\\\\\\\n and isinstance(typ, types.Instance)\\\\\\\\n ):\\\\\\\\n # Avoid infinite recursion for recursive types.\\\\\\\\n if typ in self.seen_types:\\\\\\\\n continue\\\\\\\\n self.seen_types.add(typ)\\\\\\\\n typ.accept(self)\\\\\\\\n\\\\\\\\n def _visit_type_list(self, typs: list[types.Type]) -> None:\\\\\\\\n # Micro-optimization: Specialized version of _visit for tuples\\\\\\\\n for typ in typs:\\\\\\\\n if (\\\\\\\\n isinstance(typ, types.TypeAliasType)\\\\\\\\n or isinstance(typ, types.ProperType)\\\\\\\\n and isinstance(typ, types.Instance)\\\\\\\\n ):\\\\\\\\n # Avoid infinite recursion for recursive types.\\\\\\\\n if typ in self.seen_types:\\\\\\\\n continue\\\\\\\\n self.seen_types.add(typ)\\\\\\\\n typ.accept(self)\\\\\\\\n\\\\\\\\n def _visit_module_name(self, module_name: str) -> None:\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" def __init__(self) -> None:\\\\\\\\n # Module references are collected here\\\\\\\\n self.modules: set[str] = set()\\\\\\\\n # User to avoid infinite recursion with recursive type aliases\\\\\\\\n self.seen_aliases: set[types.TypeAliasType] = set()\\\\\\\\n # User to avoid infinite recursion with recursive types\\\\\\\\n self.seen_types: set[types.TypeAliasType | types.Instance] = set()\\\\\\\\n # Used to avoid redundant work\\\\\\\\n self.seen_fullnames: set[str] = set()\\\\\\\\n\\\\\\\\n def find_modules(self, typs: Iterable[types.Type]) -> set[str]:\\\\\\\\n self.modules = set()\\\\\\\\n self.seen_fullnames = set()\\\\\\\\n self.seen_aliases = set()\\\\\\\\n self.seen_types = set()\\\\\\\\n for typ in typs:\\\\\\\\n self._visit(typ)\\\\\\\\n return self.modules\\\\\\\\n\\\\\\\\n def _visit(self, typ: types.Type) -> None:\\\\\\\\n if isinstance(typ, types.TypeAliasType):\\\\\\\\n # Avoid infinite recursion for recursive type aliases.\\\\\\\\n if typ not in self.seen_aliases:\\\\\\\\n self.seen_aliases.add(typ)\\\\\\\\n # Note: instances are needed for `class str(Sequence[str]): ...`\\\\\\\\n if (\\\\\\\\n isinstance(typ, types.TypeAliasType)\\\\\\\\n or isinstance(typ, types.ProperType)\\\\\\\\n and isinstance(typ, types.Instance)\\\\\\\\n ):\\\\\\\\n # Avoid infinite recursion for recursive types.\\\\\\\\n if typ in self.seen_types:\\\\\\\\n return\\\\\\\\n self.seen_types.add(typ)\\\\\\\\n typ.accept(self)\\\\\\\\n\\\\\\\\n def _visit_type_tuple(self, typs: tuple[types.Type, ...]) -> None:\\\\\\\\n # Micro-optimization: Specialized version of _visit for lists\\\\\\\\n for typ in typs:\\\\\\\\n if isinstance(typ, types.TypeAliasType):\\\\\\\\n # Avoid infinite recursion for recursive type aliases.\\\\\\\\n if typ in self.seen_aliases:\\\\\\\\n if (\\\\\\\\n isinstance(typ, types.TypeAliasType)\\\\\\\\n or isinstance(typ, types.ProperType)\\\\\\\\n and isinstance(typ, types.Instance)\\\\\\\\n ):\\\\\\\\n # Avoid infinite recursion for recursive types.\\\\\\\\n if typ in self.seen_types:\\\\\\\\n continue\\\\\\\\n self.seen_aliases.add(typ)\\\\\\\\n self.seen_types.add(typ)\\\\\\\\n typ.accept(self)\\\\\\\\n\\\\\\\\n def _visit_type_list(self, typs: list[types.Type]) -> None:\\\\\\\\n # Micro-optimization: Specialized version of _visit for tuples\\\\\\\\n for typ in typs:\\\\\\\\n if isinstance(typ, types.TypeAliasType):\\\\\\\\n # Avoid infinite recursion for recursive type aliases.\\\\\\\\n if typ in self.seen_aliases:\\\\\\\\n if (\\\\\\\\n isinstance(typ, types.TypeAliasType)\\\\\\\\n or isinstance(typ, types.ProperType)\\\\\\\\n and isinstance(typ, types.Instance)\\\\\\\\n ):\\\\\\\\n # Avoid infinite recursion for recursive types.\\\\\\\\n if typ in self.seen_types:\\\\\\\\n continue\\\\\\\\n self.seen_aliases.add(typ)\\\\\\\\n self.seen_types.add(typ)\\\\\\\\n typ.accept(self)\\\\\\\\n\\\\\\\\n def _visit_module_name(self, module_name: str) -> None:\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 29,\\\\n \\\\\"function_name\\\\\": \\\\\"_visit_module_name\\\\\",\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"generator_expression\\\\\",\\\\n \\\\\"context_manager\\\\\",\\\\n \\\\\"class_definition\\\\\",\\\\n \\\\\"type_hint\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/indirection.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" self._visit_type_list(t.arg_types)\\\\\\\\n\\\\\\\\n def visit_instance(self, t: types.Instance) -> None:\\\\\\\\n self._visit_type_tuple(t.args)\\\\\\\\n if t.type:\\\\\\\\n # Uses of a class depend on everything in the MRO,\\\\\\\\n # as changes to classes in the MRO can add types to methods,\\\\\\\\n # change property types, change the MRO itself, etc.\\\\\\\\n for s in t.type.mro:\\\\\\\\n self._visit_module_name(s.module_name)\\\\\\\\n if t.type.metaclass_type is not None:\\\\\\\\n self._visit_module_name(t.type.metaclass_type.type.module_name)\\\\\\\\n\\\\\\\\n def visit_callable_type(self, t: types.CallableType) -> None:\\\\\\\\n self._visit_type_list(t.arg_types)\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" self._visit_type_list(t.arg_types)\\\\\\\\n\\\\\\\\n def visit_instance(self, t: types.Instance) -> None:\\\\\\\\n # Instance is named, record its definition and continue digging into\\\\\\\\n # components that constitute semantic meaning of this type: bases, metaclass,\\\\\\\\n # tuple type, and typeddict type.\\\\\\\\n # Note: we cannot simply record the MRO, in case an intermediate base contains\\\\\\\\n # a reference to type alias, this affects meaning of map_instance_to_supertype(),\\\\\\\\n # see e.g. testDoubleReexportGenericUpdated.\\\\\\\\n self._visit_type_tuple(t.args)\\\\\\\\n if t.type:\\\\\\\\n # Important optimization: instead of simply recording the definition and\\\\\\\\n # recursing into bases, record the MRO and only traverse generic bases.\\\\\\\\n for s in t.type.mro:\\\\\\\\n self._visit_module_name(s.module_name)\\\\\\\\n for base in s.bases:\\\\\\\\n if base.args:\\\\\\\\n self._visit_type_tuple(base.args)\\\\\\\\n if t.type.metaclass_type:\\\\\\\\n self._visit(t.type.metaclass_type)\\\\\\\\n if t.type.typeddict_type:\\\\\\\\n self._visit(t.type.typeddict_type)\\\\\\\\n if t.type.tuple_type:\\\\\\\\n self._visit(t.type.tuple_type)\\\\\\\\n\\\\\\\\n def visit_callable_type(self, t: types.CallableType) -> None:\\\\\\\\n self._visit_type_list(t.arg_types)\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" self._visit_type_list(t.arg_types)\\\\\\\\n\\\\\\\\n def visit_instance(self, t: types.Instance) -> None:\\\\\\\\n # Instance is named, record its definition and continue digging into\\\\\\\\n # components that constitute semantic meaning of this type: bases, metaclass,\\\\\\\\n # tuple type, and typeddict type.\\\\\\\\n # Note: we cannot simply record the MRO, in case an intermediate base contains\\\\\\\\n # a reference to type alias, this affects meaning of map_instance_to_supertype(),\\\\\\\\n # see e.g. testDoubleReexportGenericUpdated.\\\\\\\\n self._visit_type_tuple(t.args)\\\\\\\\n if t.type:\\\\\\\\n # Uses of a class depend on everything in the MRO,\\\\\\\\n # as changes to classes in the MRO can add types to methods,\\\\\\\\n # change property types, change the MRO itself, etc.\\\\\\\\n # Important optimization: instead of simply recording the definition and\\\\\\\\n # recursing into bases, record the MRO and only traverse generic bases.\\\\\\\\n for s in t.type.mro:\\\\\\\\n self._visit_module_name(s.module_name)\\\\\\\\n if t.type.metaclass_type is not None:\\\\\\\\n self._visit_module_name(t.type.metaclass_type.type.module_name)\\\\\\\\n for base in s.bases:\\\\\\\\n if base.args:\\\\\\\\n self._visit_type_tuple(base.args)\\\\\\\\n if t.type.metaclass_type:\\\\\\\\n self._visit(t.type.metaclass_type)\\\\\\\\n if t.type.typeddict_type:\\\\\\\\n self._visit(t.type.typeddict_type)\\\\\\\\n if t.type.tuple_type:\\\\\\\\n self._visit(t.type.tuple_type)\\\\\\\\n\\\\\\\\n def visit_callable_type(self, t: types.CallableType) -> None:\\\\\\\\n self._visit_type_list(t.arg_types)\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 10,\\\\n \\\\\"function_name\\\\\": \\\\\"visit_callable_type\\\\\",\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"generator_expression\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/indirection.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" self.seen_fullnames.add(fullname)\\\\\\\\n\\\\\\\\n def visit_overloaded(self, t: types.Overloaded) -> None:\\\\\\\\n self._visit_type_list(list(t.items))\\\\\\\\n self._visit(t.fallback)\\\\\\\\n\\\\\\\\n def visit_tuple_type(self, t: types.TupleType) -> None:\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" self.seen_fullnames.add(fullname)\\\\\\\\n\\\\\\\\n def visit_overloaded(self, t: types.Overloaded) -> None:\\\\\\\\n for item in t.items:\\\\\\\\n self._visit(item)\\\\\\\\n self._visit(t.fallback)\\\\\\\\n\\\\\\\\n def visit_tuple_type(self, t: types.TupleType) -> None:\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" self.seen_fullnames.add(fullname)\\\\\\\\n\\\\\\\\n def visit_overloaded(self, t: types.Overloaded) -> None:\\\\\\\\n self._visit_type_list(list(t.items))\\\\\\\\n for item in t.items:\\\\\\\\n self._visit(item)\\\\\\\\n self._visit(t.fallback)\\\\\\\\n\\\\\\\\n def visit_tuple_type(self, t: types.TupleType) -> None:\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": \\\\\"visit_tuple_type\\\\\",\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/indirection.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" self._visit(t.item)\\\\\\\\n\\\\\\\\n def visit_type_alias_type(self, t: types.TypeAliasType) -> None:\\\\\\\\n self._visit(types.get_proper_type(t))\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" self._visit(t.item)\\\\\\\\n\\\\\\\\n def visit_type_alias_type(self, t: types.TypeAliasType) -> None:\\\\\\\\n # Type alias is named, record its definition and continue digging into\\\\\\\\n # components that constitute semantic meaning of this type: target and args.\\\\\\\\n if t.alias:\\\\\\\\n self._visit_module_name(t.alias.module)\\\\\\\\n self._visit(t.alias.target)\\\\\\\\n self._visit_type_list(t.args)\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" self._visit(t.item)\\\\\\\\n\\\\\\\\n def visit_type_alias_type(self, t: types.TypeAliasType) -> None:\\\\\\\\n self._visit(types.get_proper_type(t))\\\\\\\\n # Type alias is named, record its definition and continue digging into\\\\\\\\n # components that constitute semantic meaning of this type: target and args.\\\\\\\\n if t.alias:\\\\\\\\n self._visit_module_name(t.alias.module)\\\\\\\\n self._visit(t.alias.target)\\\\\\\\n self._visit_type_list(t.args)\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 3,\\\\n \\\\\"function_name\\\\\": \\\\\"visit_type_alias_type\\\\\",\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/nodes.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" defs: list[Statement]\\\\\\\\n # Type alias dependencies as mapping from target to set of alias full names\\\\\\\\n alias_deps: defaultdict[str, set[str]]\\\\\\\\n # Is there a UTF-8 BOM at the start?\\\\\\\\n is_bom: bool\\\\\\\\n names: SymbolTable\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" defs: list[Statement]\\\\\\\\n # Type alias dependencies as mapping from target to set of alias full names\\\\\\\\n alias_deps: defaultdict[str, set[str]]\\\\\\\\n # Same as above but for coarse-grained dependencies (i.e. modules instead of full names)\\\\\\\\n mod_alias_deps: set[str]\\\\\\\\n # Is there a UTF-8 BOM at the start?\\\\\\\\n is_bom: bool\\\\\\\\n names: SymbolTable\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" defs: list[Statement]\\\\\\\\n # Type alias dependencies as mapping from target to set of alias full names\\\\\\\\n alias_deps: defaultdict[str, set[str]]\\\\\\\\n # Same as above but for coarse-grained dependencies (i.e. modules instead of full names)\\\\\\\\n mod_alias_deps: set[str]\\\\\\\\n # Is there a UTF-8 BOM at the start?\\\\\\\\n is_bom: bool\\\\\\\\n names: SymbolTable\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"type_hint\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/nodes.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" target: The target type. For generic aliases contains bound type variables\\\\\\\\n as nested types (currently TypeVar and ParamSpec are supported).\\\\\\\\n _fullname: Qualified name of this type alias. This is used in particular\\\\\\\\n to track fine grained dependencies from aliases.\\\\\\\\n alias_tvars: Type variables used to define this alias.\\\\\\\\n normalized: Used to distinguish between `A = List`, and `A = list`. Both\\\\\\\\n are internally stored using `builtins.list` (because `typing.List` is\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" target: The target type. For generic aliases contains bound type variables\\\\\\\\n as nested types (currently TypeVar and ParamSpec are supported).\\\\\\\\n _fullname: Qualified name of this type alias. This is used in particular\\\\\\\\n to track fine-grained dependencies from aliases.\\\\\\\\n module: Module where the alias was defined.\\\\\\\\n alias_tvars: Type variables used to define this alias.\\\\\\\\n normalized: Used to distinguish between `A = List`, and `A = list`. Both\\\\\\\\n are internally stored using `builtins.list` (because `typing.\", \"ontology_valid\": false, \"topological_rank\": 0, \"contains\": [], \"type\": \"DocumentChunk\", \"version\": 1, \"id\": \"addd6b56-6213-5c40-8fc3-5f0a98b441db\", \"chunk_index\": 1, \"chunk_size\": 8167, \"cut_type\": \"sentence_end\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"color\": \"#801212\", \"name\": \"addd6b56-6213-5c40-8fc3-5f0a98b441db\"}, {\"text\": \"List` is\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" target: The target type. For generic aliases contains bound type variables\\\\\\\\n as nested types (currently TypeVar and ParamSpec are supported).\\\\\\\\n _fullname: Qualified name of this type alias. This is used in particular\\\\\\\\n to track fine grained dependencies from aliases.\\\\\\\\n to track fine-grained dependencies from aliases.\\\\\\\\n module: Module where the alias was defined.\\\\\\\\n alias_tvars: Type variables used to define this alias.\\\\\\\\n normalized: Used to distinguish between `A = List`, and `A = list`. Both\\\\\\\\n are internally stored using `builtins.list` (because `typing.List` is\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/semanal.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" declared_type_vars: TypeVarLikeList | None = None,\\\\\\\\n all_declared_type_params_names: list[str] | None = None,\\\\\\\\n python_3_12_type_alias: bool = False,\\\\\\\\n ) -> tuple[Type | None, list[TypeVarLikeType], set[str], list[str], bool]:\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"Check if \\'rvalue\\' is a valid type allowed for aliasing (e.g. not a type variable).\\\\\\\\n\\\\\\\\n If yes, return the corresponding type, a list of\\\\\\\\n qualified type variable names for generic aliases, a set of names the alias depends on,\\\\\\\\n and a list of type variables if the alias is generic.\\\\\\\\n A schematic example for the dependencies:\\\\\\\\n A = int\\\\\\\\n B = str\\\\\\\\n analyze_alias(Dict[A, B])[2] == {\\'__main__.A\\', \\'__main__.B\\'}\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\n dynamic = bool(self.function_stack and self.function_stack[-1].is_dynamic())\\\\\\\\n global_scope = not self.type and not self.function_stack\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" declared_type_vars: TypeVarLikeList | None = None,\\\\\\\\n all_declared_type_params_names: list[str] | None = None,\\\\\\\\n python_3_12_type_alias: bool = False,\\\\\\\\n ) -> tuple[Type | None, list[TypeVarLikeType], set[tuple[str, str]], bool]:\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"Check if \\'rvalue\\' is a valid type allowed for aliasing (e.g. not a type variable).\\\\\\\\n\\\\\\\\n If yes, return the corresponding type, a list of type variables for generic aliases,\\\\\\\\n a set of names the alias depends on, and True if the original type has empty tuple index.\\\\\\\\n An example for the dependencies:\\\\\\\\n A = int\\\\\\\\n B = str\\\\\\\\n analyze_alias(dict[A, B])[2] == {(\\'mod\\', \\'mod.A\\'), (\\'mod\\', \\'mod.B\\')}\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\n dynamic = bool(self.function_stack and self.function_stack[-1].is_dynamic())\\\\\\\\n global_scope = not self.type and not self.function_stack\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" declared_type_vars: TypeVarLikeList | None = None,\\\\\\\\n all_declared_type_params_names: list[str] | None = None,\\\\\\\\n python_3_12_type_alias: bool = False,\\\\\\\\n ) -> tuple[Type | None, list[TypeVarLikeType], set[str], list[str], bool]:\\\\\\\\n ) -> tuple[Type | None, list[TypeVarLikeType], set[tuple[str, str]], bool]:\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"Check if \\'rvalue\\' is a valid type allowed for aliasing (e.g. not a type variable).\\\\\\\\n\\\\\\\\n If yes, return the corresponding type, a list of\\\\\\\\n qualified type variable names for generic aliases, a set of names the alias depends on,\\\\\\\\n and a list of type variables if the alias is generic.\\\\\\\\n A schematic example for the dependencies:\\\\\\\\n If yes, return the corresponding type, a list of type variables for generic aliases,\\\\\\\\n a set of names the alias depends on, and True if the original type has empty tuple index.\\\\\\\\n An example for the dependencies:\\\\\\\\n A = int\\\\\\\\n B = str\\\\\\\\n analyze_alias(Dict[A, B])[2] == {\\'__main__.A\\', \\'__main__.B\\'}\\\\\\\\n analyze_alias(dict[A, B])[2] == {(\\'mod\\', \\'mod.A\\'), (\\'mod\\', \\'mod.B\\')}\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\n dynamic = bool(self.function_stack and self.function_stack[-1].is_dynamic())\\\\\\\\n global_scope = not self.type and not self.function_stack\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 10,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": \\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"Check if \\'rvalue\\' is a valid type allowed for aliasing (e.g. not a type variable).\\\\\",\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"list_comprehension\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/semanal.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" self.cur_mod_node.plugin_deps.setdefault(trigger, set()).add(target)\\\\\\\\n\\\\\\\\n def add_type_alias_deps(\\\\\\\\n self, aliases_used: Collection[str], target: str | None = None\\\\\\\\n ) -> None:\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"Add full names of type aliases on which the current node depends.\\\\\\\\n\\\\\\\\n This is used by fine-grained incremental mode to re-check the corresponding nodes.\\\\\\\\n If `target` is None, then the target node used will be the current scope.\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\n if not aliases_used:\\\\\\\\n # A basic optimization to avoid adding targets with no dependencies to\\\\\\\\n # the `alias_deps` dict.\\\\\\\\n return\\\\\\\\n if target is None:\\\\\\\\n target = self.scope.current_target()\\\\\\\\n self.cur_mod_node.alias_deps[target].update(aliases_used)\\\\\\\\n\\\\\\\\n def is_mangled_global(self, name: str) -> bool:\\\\\\\\n # A global is mangled if there exists at least one renamed variant.\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" self.cur_mod_node.plugin_deps.setdefault(trigger, set()).add(target)\\\\\\\\n\\\\\\\\n def add_type_alias_deps(\\\\\\\\n self, aliases_used: Collection[tuple[str, str]], target: str | None = None\\\\\\\\n ) -> None:\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"Add full names of type aliases on which the current node depends.\\\\\\\\n\\\\\\\\n This is used by fine-grained incremental mode to re-check the corresponding nodes.\\\\\\\\n If `target` is None, then the target node used will be the current scope. For\\\\\\\\n coarse-grained mode, add just the module names where aliases are defined.\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\n if not aliases_used:\\\\\\\\n return\\\\\\\\n if target is None:\\\\\\\\n target = self.scope.current_target()\\\\\\\\n for mod, fn in aliases_used:\\\\\\\\n self.cur_mod_node.alias_deps[target].add(fn)\\\\\\\\n self.cur_mod_node.mod_alias_deps.add(mod)\\\\\\\\n\\\\\\\\n def is_mangled_global(self, name: str) -> bool:\\\\\\\\n # A global is mangled if there exists at least one renamed variant.\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" self.cur_mod_node.plugin_deps.setdefault(trigger, set()).add(target)\\\\\\\\n\\\\\\\\n def add_type_alias_deps(\\\\\\\\n self, aliases_used: Collection[str], target: str | None = None\\\\\\\\n self, aliases_used: Collection[tuple[str, str]], target: str | None = None\\\\\\\\n ) -> None:\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"Add full names of type aliases on which the current node depends.\\\\\\\\n\\\\\\\\n This is used by fine-grained incremental mode to re-check the corresponding nodes.\\\\\\\\n If `target` is None, then the target node used will be the current scope.\\\\\\\\n If `target` is None, then the target node used will be the current scope. For\\\\\\\\n coarse-grained mode, add just the module names where aliases are defined.\\\\\\\\n \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\n if not aliases_used:\\\\\\\\n # A basic optimization to avoid adding targets with no dependencies to\\\\\\\\n # the `alias_deps` dict.\\\\\\\\n return\\\\\\\\n if target is None:\\\\\\\\n target = self.scope.current_target()\\\\\\\\n self.cur_mod_node.alias_deps[target].update(aliases_used)\\\\\\\\n for mod, fn in aliases_used:\\\\\\\\n self.cur_mod_node.alias_deps[target].add(fn)\\\\\\\\n self.cur_mod_node.mod_alias_deps.add(mod)\\\\\\\\n\\\\\\\\n def is_mangled_global(self, name: str) -> bool:\\\\\\\\n # A global is mangled if there exists at least one renamed variant.\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 15,\\\\n \\\\\"function_name\\\\\": \\\\\"is_mangled_global\\\\\",\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": \\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"Add full names of type aliases on which the current node depends.\\\\\",\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"list_comprehension\\\\\"\\\\n ]\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"concise_subject\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"pr\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"chore: add cline_docs/ to .gitignore\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"Cline is a commonly used LLM tool which, under certain conditions, creates a cline_docs/ folder with task status and todo items etc\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nThis folder is only helpful locally (unless we decide we want to add actual guidelines for Cline here, but thats outside the scope of this PR) so this PR adds it to .gitignore\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\n<!-- If this pull request fixes an issue, add \\\\\\\\\\\\\"Fixes #NNN\\\\\\\\\\\\\" with the issue number. -->\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\n<!--\\\\\\\\r\\\\\\\\nChecklist:\\\\\\\\r\\\\\\\\n- Read the [Contributing Guidelines](https://github.com/python/mypy/blob/master/CONTRIBUTING.md)\\\\\\\\r\\\\\\\\n- Add tests for all changed behaviour.\\\\\\\\r\\\\\\\\n- If you can\\'t add a test, please explain why and how you verified your changes work.\\\\\\\\r\\\\\\\\n- Make sure CI passes.\\\\\\\\r\\\\\\\\n- Please do not force push to the PR once it has been reviewed.\\\\\\\\r\\\\\\\\n-->\\\\\\\\r\\\\\\\\n\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/pull/19797\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2025-09-05T02:35:14Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"19797\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\".gitignore\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 0,\\\\n \\\\\"deletions\\\\\": 0,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [],\\\\n \\\\\"code_samples\\\\\": [],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"concise_subject\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"pr\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"[mypyc] Add type annotations to tests\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"Missing type annotations can compromise test coverage. My eventual goal is to require annotations by default in all run tests.\\\\\\\\r\\\\\\\\n\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/pull/19794\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2025-09-04T15:56:30Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"19794\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"mypyc/test-data/fixtures/ir.py\\\\\",\\\\n \\\\\"mypyc/test-data/fixtures/typing-full.pyi\\\\\",\\\\n \\\\\"mypyc/test-data/run-dunders.test\\\\\",\\\\n \\\\\"mypyc/test-data/run-singledispatch.test\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 0,\\\\n \\\\\"deletions\\\\\": 0,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypyc/test-data/fixtures/ir.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" def __iadd__(self, value: Iterable[_T], /) -> List[_T]: ... # type: ignore[misc]\\\\\\\\n def append(self, x: _T) -> None: pass\\\\\\\\n def pop(self, i: int = -1) -> _T: pass\\\\\\\\n def count(self, _T) -> int: pass\\\\\\\\n def extend(self, l: Iterable[_T]) -> None: pass\\\\\\\\n def insert(self, i: int, x: _T) -> None: pass\\\\\\\\n def sort(self) -> None: pass\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" def __iadd__(self, value: Iterable[_T], /) -> List[_T]: ... # type: ignore[misc]\\\\\\\\n def append(self, x: _T) -> None: pass\\\\\\\\n def pop(self, i: int = -1) -> _T: pass\\\\\\\\n def count(self, x: _T) -> int: pass\\\\\\\\n def extend(self, l: Iterable[_T]) -> None: pass\\\\\\\\n def insert(self, i: int, x: _T) -> None: pass\\\\\\\\n def sort(self) -> None: pass\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" def __iadd__(self, value: Iterable[_T], /) -> List[_T]: ... # type: ignore[misc]\\\\\\\\n def append(self, x: _T) -> None: pass\\\\\\\\n def pop(self, i: int = -1) -> _T: pass\\\\\\\\n def count(self, _T) -> int: pass\\\\\\\\n def count(self, x: _T) -> int: pass\\\\\\\\n def extend(self, l: Iterable[_T]) -> None: pass\\\\\\\\n def insert(self, i: int, x: _T) -> None: pass\\\\\\\\n def sort(self) -> None: pass\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": \\\\\"sort\\\\\",\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"function_definition\\\\\",\\\\n \\\\\"type_hint\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypyc/test-data/fixtures/ir.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"def id(o: object) -> int: pass\\\\\\\\n# This type is obviously wrong but the test stubs don\\'t have Sized anymore\\\\\\\\ndef len(o: object) -> int: pass\\\\\\\\ndef print(*object) -> None: pass\\\\\\\\ndef isinstance(x: object, t: object) -> bool: pass\\\\\\\\ndef iter(i: Iterable[_T]) -> Iterator[_T]: pass\\\\\\\\n@overload\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"def id(o: object) -> int: pass\\\\\\\\n# This type is obviously wrong but the test stubs don\\'t have Sized anymore\\\\\\\\ndef len(o: object) -> int: pass\\\\\\\\ndef print(*args: object) -> None: pass\\\\\\\\ndef isinstance(x: object, t: object) -> bool: pass\\\\\\\\ndef iter(i: Iterable[_T]) -> Iterator[_T]: pass\\\\\\\\n@overload\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"def id(o: object) -> int: pass\\\\\\\\n# This type is obviously wrong but the test stubs don\\'t have Sized anymore\\\\\\\\ndef len(o: object) -> int: pass\\\\\\\\ndef print(*object) -> None: pass\\\\\\\\ndef print(*args: object) -> None: pass\\\\\\\\ndef isinstance(x: object, t: object) -> bool: pass\\\\\\\\ndef iter(i: Iterable[_T]) -> Iterator[_T]: pass\\\\\\\\n@overload\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": \\\\\"iter\\\\\",\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"function_definition\\\\\",\\\\n \\\\\"type_hint\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypyc/test-data/fixtures/typing-full.pyi\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"class GenericMeta(type): pass\\\\\\\\n\\\\\\\\nclass _SpecialForm:\\\\\\\\n def __getitem__(self, index): ...\\\\\\\\nclass TypeVar:\\\\\\\\n def __init__(self, name, *args, bound=None): ...\\\\\\\\n def __or__(self, other): ...\\\\\\\\n\\\\\\\\ncast = 0\\\\\\\\noverload = 0\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"class GenericMeta(type): pass\\\\\\\\n\\\\\\\\nclass _SpecialForm:\\\\\\\\n def __getitem__(self, index: Any) -> Any: ...\\\\\\\\nclass TypeVar:\\\\\\\\n def __init__(self, name: str, *args: Any, bound: Any = None): ...\\\\\\\\n def __or__(self, other: Any) -> Any: ...\\\\\\\\n\\\\\\\\ncast = 0\\\\\\\\noverload = 0\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"class GenericMeta(type): pass\\\\\\\\n\\\\\\\\nclass _SpecialForm:\\\\\\\\n def __getitem__(self, index): ...\\\\\\\\n def __getitem__(self, index: Any) -> Any: ...\\\\\\\\nclass TypeVar:\\\\\\\\n def __init__(self, name, *args, bound=None): ...\\\\\\\\n def __or__(self, other): ...\\\\\\\\n def __init__(self, name: str, *args: Any, bound: Any = None): ...\\\\\\\\n def __or__(self, other: Any) -> Any: ...\\\\\\\\n\\\\\\\\ncast = 0\\\\\\\\noverload = 0\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 7,\\\\n \\\\\"function_name\\\\\": \\\\\"__or__\\\\\",\\\\n \\\\\"class_name\\\\\": \\\\\"TypeVar\\\\\",\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"function_definition\\\\\",\\\\n \\\\\"type_hint\\\\\"\\\\n ]\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"concise_subject\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"pr\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"Check functions without annotations in mypyc tests\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"c.f. https://github.com/python/mypy/pull/19217#discussion_r2314303410\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nDisallowing functions without annotations (where not relevant to the tests) is probably a good idea, but this creates a large number of failures which would take some time to go through (many due to common issues, like untyped functions in the fixtures).\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nAs a smaller step in the right direction, this sets `check_untyped_defs = True` for the `run-*` tests so that we at least check functions without annotations. \\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/pull/19792\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2025-09-04T14:42:17Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"19792\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"mypyc/test-data/fixtures/ir.py\\\\\",\\\\n \\\\\"mypyc/test-data/run-classes.test\\\\\",\\\\n \\\\\"mypyc/test/test_run.py\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 0,\\\\n \\\\\"deletions\\\\\": 0,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypyc/test-data/fixtures/ir.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"class type:\\\\\\\\n def __init__(self, o: object) -> None: ...\\\\\\\\n def __or__(self, o: object) -> Any: ...\\\\\\\\n __name__ : str\\\\\\\\n __annotations__: Dict[str, Any]\\\\\\\\n\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"class type:\\\\\\\\n def __init__(self, o: object) -> None: ...\\\\\\\\n def __or__(self, o: object) -> Any: ...\\\\\\\\n def __new__(cls, *args: object) -> Any: ...\\\\\\\\n __name__ : str\\\\\\\\n __annotations__: Dict[str, Any]\\\\\\\\n\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"class type:\\\\\\\\n def __init__(self, o: object) -> None: ...\\\\\\\\n def __or__(self, o: object) -> Any: ...\\\\\\\\n def __new__(cls, *args: object) -> Any: ...\\\\\\\\n __name__ : str\\\\\\\\n __annotations__: Dict[str, Any]\\\\\\\\n\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": \\\\\"__new__\\\\\",\\\\n \\\\\"class_name\\\\\": \\\\\"type\\\\\",\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"function_definition\\\\\"\\\\n ]\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"concise_subject\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"pr\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"fix: Allow instantiation of type[None] in analyze_type_type_callee\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"<!-- If this pull request fixes an issue, add \\\\\\\\\\\\\"Fixes #NNN\\\\\\\\\\\\\" with the issue number. -->\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\n(Explain how this PR changes mypy.)\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\n<!--\\\\\\\\r\\\\\\\\nChecklist:\\\\\\\\r\\\\\\\\n- Read the [Contributing Guidelines](https://github.com/python/mypy/blob/master/CONTRIBUTING.md)\\\\\\\\r\\\\\\\\n- Add tests for all changed behaviour.\\\\\\\\r\\\\\\\\n- If you can\\'t add a test, please explain why and how you verified your changes work.\\\\\\\\r\\\\\\\\n- Make sure CI passes.\\\\\\\\r\\\\\\\\n- Please do not force push to the PR once it has been reviewed.\", \"ontology_valid\": false, \"topological_rank\": 0, \"contains\": [], \"type\": \"DocumentChunk\", \"version\": 1, \"id\": \"ebd95cd5-52e5-5662-99a4-a0c13ff921b4\", \"chunk_index\": 2, \"chunk_size\": 8154, \"cut_type\": \"sentence_end\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"color\": \"#801212\", \"name\": \"ebd95cd5-52e5-5662-99a4-a0c13ff921b4\"}, {\"id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"text\": \"\\\\\\\\r\\\\\\\\n-->\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nFixes #19660\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nAllow instantiation of NoneType in type checker\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nThis change fixes the error \\\\\\\\\\\\\"Cannot instantiate type \\'Type[None]\\'\\\\\\\\\\\\\"\\\\\\\\r\\\\\\\\nwhen calling NoneType() or type(None)().\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nBy treating NoneType as a callable that returns None, mypy can now correctly\\\\\\\\r\\\\\\\\nhandle such calls without raising spurious errors.\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nAlso, I added test case testTypeUsingTypeCNoneType covering:\\\\\\\\r\\\\\\\\n- direct calls to type(None)() and NoneType()\\\\\\\\r\\\\\\\\n- functions accepting type[None] and type[NoneType] parameters and invoking them\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nThis ensures proper handling of NoneType instantiation and prevents spurious errors.\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/pull/19782\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2025-09-02T06:13:12Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"19782\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"mypy/checkexpr.py\\\\\",\\\\n \\\\\"test-data/unit/check-classes.test\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 0,\\\\n \\\\\"deletions\\\\\": 0,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"19660\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/checkexpr.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" return self.analyze_type_type_callee(tuple_fallback(item), context)\\\\\\\\n if isinstance(item, TypedDictType):\\\\\\\\n return self.typeddict_callable_from_context(item)\\\\\\\\n\\\\\\\\n self.msg.unsupported_type_type(item, context)\\\\\\\\n return AnyType(TypeOfAny.from_error)\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" return self.analyze_type_type_callee(tuple_fallback(item), context)\\\\\\\\n if isinstance(item, TypedDictType):\\\\\\\\n return self.typeddict_callable_from_context(item)\\\\\\\\n if isinstance(item, NoneType):\\\\\\\\n # NoneType() returns None, so treat it as a callable that returns None\\\\\\\\n return CallableType(\\\\\\\\n arg_types=[],\\\\\\\\n arg_kinds=[],\\\\\\\\n arg_names=[],\\\\\\\\n ret_type=NoneType(),\\\\\\\\n fallback=self.named_type(\\\\\\\\\\\\\"builtins.function\\\\\\\\\\\\\"),\\\\\\\\n name=None,\\\\\\\\n from_type_type=True,\\\\\\\\n )\\\\\\\\n\\\\\\\\n self.msg.unsupported_type_type(item, context)\\\\\\\\n return AnyType(TypeOfAny.from_error)\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" return self.analyze_type_type_callee(tuple_fallback(item), context)\\\\\\\\n if isinstance(item, TypedDictType):\\\\\\\\n return self.typeddict_callable_from_context(item)\\\\\\\\n if isinstance(item, NoneType):\\\\\\\\n # NoneType() returns None, so treat it as a callable that returns None\\\\\\\\n return CallableType(\\\\\\\\n arg_types=[],\\\\\\\\n arg_kinds=[],\\\\\\\\n arg_names=[],\\\\\\\\n ret_type=NoneType(),\\\\\\\\n fallback=self.named_type(\\\\\\\\\\\\\"builtins.function\\\\\\\\\\\\\"),\\\\\\\\n name=None,\\\\\\\\n from_type_type=True,\\\\\\\\n )\\\\\\\\n\\\\\\\\n self.msg.unsupported_type_type(item, context)\\\\\\\\n return AnyType(TypeOfAny.from_error)\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"standard\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"pr\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"feat: new mypyc primitives for weakref.proxy\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"This PR adds 2 new weakref primitives for weakref.proxy (1 and 2 arg)\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nThe C code generates correctly, but I\\'m not entirely sure why this test is failing. The weakly-proxied object is being destroyed too early, while there should still be a strong reference to it. It also fails if we use the builtin weakref.proxy, so I believe this might be exposing a reference counting bug unrelated to this PR.\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\n<!--\\\\\\\\r\\\\\\\\nChecklist:\\\\\\\\r\\\\\\\\n- Read the [Contributing Guidelines](https://github.com/python/mypy/blob/master/CONTRIBUTING.md)\\\\\\\\r\\\\\\\\n- Add tests for all changed behaviour.\\\\\\\\r\\\\\\\\n- If you can\\'t add a test, please explain why and how you verified your changes work.\\\\\\\\r\\\\\\\\n- Make sure CI passes.\\\\\\\\r\\\\\\\\n- Please do not force push to the PR once it has been reviewed.\\\\\\\\r\\\\\\\\n-->\\\\\\\\r\\\\\\\\n\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/pull/19217\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2025-06-03T17:02:26Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"19217\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"mypyc/primitives/weakref_ops.py\\\\\",\\\\n \\\\\"mypyc/test-data/fixtures/ir.py\\\\\",\\\\n \\\\\"mypyc/test-data/irbuild-weakref.test\\\\\",\\\\n \\\\\"mypyc/test-data/run-weakref.test\\\\\",\\\\n \\\\\"test-data/unit/lib-stub/_weakref.pyi\\\\\",\\\\n \\\\\"test-data/unit/lib-stub/weakref.pyi\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 0,\\\\n \\\\\"deletions\\\\\": 0,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypyc/test-data/fixtures/ir.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"class UnicodeEncodeError(RuntimeError): pass\\\\\\\\nclass UnicodeDecodeError(RuntimeError): pass\\\\\\\\nclass NotImplementedError(RuntimeError): pass\\\\\\\\n\\\\\\\\nclass StopIteration(Exception):\\\\\\\\n value: Any\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"class UnicodeEncodeError(RuntimeError): pass\\\\\\\\nclass UnicodeDecodeError(RuntimeError): pass\\\\\\\\nclass NotImplementedError(RuntimeError): pass\\\\\\\\nclass ReferenceError(Exception): pass\\\\\\\\n\\\\\\\\nclass StopIteration(Exception):\\\\\\\\n value: Any\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"class UnicodeEncodeError(RuntimeError): pass\\\\\\\\nclass UnicodeDecodeError(RuntimeError): pass\\\\\\\\nclass NotImplementedError(RuntimeError): pass\\\\\\\\nclass ReferenceError(Exception): pass\\\\\\\\n\\\\\\\\nclass StopIteration(Exception):\\\\\\\\n value: Any\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": \\\\\"StopIteration\\\\\",\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"class_definition\\\\\",\\\\n \\\\\"type_hint\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"test-data/unit/lib-stub/_weakref.pyi\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"from typing import Any, Callable, TypeVar, overload\\\\\\\\nfrom weakref import CallableProxyType, ProxyType\\\\\\\\n\\\\\\\\n_C = TypeVar(\\\\\\\\\\\\\"_C\\\\\\\\\\\\\", bound=Callable[..., Any])\\\\\\\\n_T = TypeVar(\\\\\\\\\\\\\"_T\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\\n# Return CallableProxyType if object is callable, ProxyType otherwise\\\\\\\\n@overload\\\\\\\\ndef proxy(object: _C, callback: Callable[[CallableProxyType[_C]], Any] | None = None, /) -> CallableProxyType[_C]: ...\\\\\\\\n@overload\\\\\\\\ndef proxy(object: _T, callback: Callable[[ProxyType[_T]], Any] | None = None, /) -> ProxyType[_T]: ...\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"from typing import Any, Callable, TypeVar, overload\\\\\\\\nfrom weakref import CallableProxyType, ProxyType\\\\\\\\n\\\\\\\\n_C = TypeVar(\\\\\\\\\\\\\"_C\\\\\\\\\\\\\", bound=Callable[..., Any])\\\\\\\\n_T = TypeVar(\\\\\\\\\\\\\"_T\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\\n# Return CallableProxyType if object is callable, ProxyType otherwise\\\\\\\\n@overload\\\\\\\\ndef proxy(object: _C, callback: Callable[[CallableProxyType[_C]], Any] | None = None, /) -> CallableProxyType[_C]: ...\\\\\\\\n@overload\\\\\\\\ndef proxy(object: _T, callback: Callable[[ProxyType[_T]], Any] | None = None, /) -> ProxyType[_T]: ...\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"addition\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 0,\\\\n \\\\\"function_name\\\\\": \\\\\"proxy\\\\\",\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"decorator\\\\\",\\\\n \\\\\"function_definition\\\\\"\\\\n ]\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"concise_subject\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"cpython\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"gh-128307: Update what\\'s new in 3.13 and 3.14 with create_task changes of asyncio (#134304)\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"gh-128307: Update what\\'s new in 3.13 and 3.14 with create_task changes of asyncio (#134304)\\\\\\\\n\\\\\\\\nCo-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com>\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/cpython/commit/28625d4f956f8d30671aba1daaac9735932983db\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2025-05-20T08:41:22Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"28625d4f956f8d30671aba1daaac9735932983db\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"Doc/whatsnew/3.13.rst\\\\\",\\\\n \\\\\"Doc/whatsnew/3.14.rst\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 34,\\\\n \\\\\"deletions\\\\\": 0,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"134304\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"Doc/whatsnew/3.13.rst\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"restructuredtext\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" never awaited).\\\\\\\\n (Contributed by Arthur Tacca and Jason Zhang in :gh:`115957`.)\\\\\\\\n\\\\\\\\n\\\\\\\\nbase64\\\\\\\\n------\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" never awaited).\\\\\\\\n (Contributed by Arthur Tacca and Jason Zhang in :gh:`115957`.)\\\\\\\\n\\\\\\\\n* The function and methods named ``create_task`` have received a new\\\\\\\\n ``**kwargs`` argument that is passed through to the task constructor.\\\\\\\\n This change was accidentally added in 3.13.3,\\\\\\\\n and broke the API contract for custom task factories.\\\\\\\\n Several third-party task factories implemented workarounds for this.\\\\\\\\n In 3.13.4 and later releases the old factory contract is honored\\\\\\\\n once again (until 3.14).\\\\\\\\n To keep the workarounds working, the extra ``**kwargs`` argument still\\\\\\\\n allows passing additional keyword arguments to :class:`~asyncio.Task`\\\\\\\\n and to custom task factories.\\\\\\\\n\\\\\\\\n This affects the following function and methods:\\\\\\\\n :meth:`asyncio.create_task`,\\\\\\\\n :meth:`asyncio.loop.create_task`,\\\\\\\\n :meth:`asyncio.TaskGroup.create_task`.\\\\\\\\n (Contributed by Thomas Grainger in :gh:`128307`.)\\\\\\\\n\\\\\\\\nbase64\\\\\\\\n------\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" never awaited).\\\\\\\\n (Contributed by Arthur Tacca and Jason Zhang in :gh:`115957`.)\\\\\\\\n\\\\\\\\n* The function and methods named ``create_task`` have received a new\\\\\\\\n ``**kwargs`` argument that is passed through to the task constructor.\\\\\\\\n This change was accidentally added in 3.13.3,\\\\\\\\n and broke the API contract for custom task factories.\\\\\\\\n Several third-party task factories implemented workarounds for this.\\\\\\\\n In 3.13.4 and later releases the old factory contract is honored\\\\\\\\n once again (until 3.14).\\\\\\\\n To keep the workarounds working, the extra ``**kwargs`` argument still\\\\\\\\n allows passing additional keyword arguments to :class:`~asyncio.Task`\\\\\\\\n and to custom task factories.\\\\\\\\n\\\\\\\\n This affects the following function and methods:\\\\\\\\n :meth:`asyncio.create_task`,\\\\\\\\n :meth:`asyncio.loop.create_task`,\\\\\\\\n :meth:`asyncio.TaskGroup.create_task`.\\\\\\\\n (Contributed by Thomas Grainger in :gh:`128307`.)\\\\\\\\n\\\\\\\\nbase64\\\\\\\\n------\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"Doc/whatsnew/3.14.rst\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"restructuredtext\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" (Contributed by Semyon Moroz in :gh:`133367`.)\\\\\\\\n\\\\\\\\n\\\\\\\\nbdb\\\\\\\\n---\\\\\\\\n\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" (Contributed by Semyon Moroz in :gh:`133367`.)\\\\\\\\n\\\\\\\\n\\\\\\\\nasyncio\\\\\\\\n-------\\\\\\\\n\\\\\\\\n* The function and methods named :func:`!create_task` now take an arbitrary\\\\\\\\n list of keyword arguments. All keyword arguments are passed to the\\\\\\\\n :class:`~asyncio.Task` constructor or the custom task factory.\\\\\\\\n (See :meth:`~asyncio.loop.set_task_factory` for details.)\\\\\\\\n The ``name`` and ``context`` keyword arguments are no longer special;\\\\\\\\n the name should now be set using the ``name`` keyword argument of the factory,\\\\\\\\n and ``context`` may be ``None``.\\\\\\\\n\\\\\\\\n This affects the following function and methods:\\\\\\\\n :meth:`asyncio.create_task`,\\\\\\\\n :meth:`asyncio.loop.create_task`,\\\\\\\\n :meth:`asyncio.TaskGroup.create_task`.\\\\\\\\n (Contributed by Thomas Grainger in :gh:`128307`.)\\\\\\\\n\\\\\\\\n\\\\\\\\nbdb\\\\\\\\n---\\\\\\\\n\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" (Contributed by Semyon Moroz in :gh:`133367`.)\\\\\\\\n\\\\\\\\n\\\\\\\\nasyncio\\\\\\\\n-------\\\\\\\\n\\\\\\\\n* The function and methods named :func:`!create_task` now take an arbitrary\\\\\\\\n list of keyword arguments. All keyword arguments are passed to the\\\\\\\\n :class:`~asyncio.Task` constructor or the custom task factory.\\\\\\\\n (See :meth:`~asyncio.loop.set_task_factory` for details.)\\\\\\\\n The ``name`` and ``context`` keyword arguments are no longer special;\\\\\\\\n the name should now be set using the ``name`` keyword argument of the factory,\\\\\\\\n and ``context`` may be ``None``.\\\\\\\\n\\\\\\\\n This affects the following function and methods:\\\\\\\\n :meth:`asyncio.create_task`,\\\\\\\\n :meth:`asyncio.loop.create_task`,\\\\\\\\n :meth:`asyncio.TaskGroup.create_task`.\\\\\\\\n (Contributed by Thomas Grainger in :gh:`128307`.)\\\\\\\\n\\\\\\\\n\\\\\\\\nbdb\\\\\\\\n---\\\\\\\\n\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"references_issue; has_body\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"cpython\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"Update CODEOWNERS (#126005)\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"Update CODEOWNERS (#126005)\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/cpython/commit/905eddceb2d61da9087f0d303aa7e4a405d2261a\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2024-10-26T15:24:51Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"905eddceb2d61da9087f0d303aa7e4a405d2261a\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\".github/CODEOWNERS\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 2,\\\\n \\\\\"deletions\\\\\": 2,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"126005\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"concise_subject; imperative_mood; references_issue\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"cpython\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"Withdraw most of my ownership in favor of Mark (#119611)\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"Withdraw most of my ownership in favor of Mark (#119611)\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/cpython/commit/3ff06ebec4e8b466f76078aa9c97cea2093d52ab\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2024-05-27T18:07:16Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"3ff06ebec4e8b466f76078aa9c97cea2093d52ab\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\".github/CODEOWNERS\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 6,\\\\n \\\\\"deletions\\\\\": 6,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"119611\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"references_issue\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"cpython\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"gh-117549: Don\\'t use designated initializers in headers (#118580)\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"gh-117549: Don\\'t use designated initializers in headers (#118580)\\\\\\\\n\\\\\\\\nThe designated initializer syntax in static inline functions in pycore_backoff.h\\\\\\\\r\\\\\\\\ncauses problems for C++ or MSVC users who aren\\'t yet using C++20.\\\\\\\\r\\\\\\\\nWhile internal, pycore_backoff.h is included (indirectly, via pycore_code.h)\\\\\\\\r\\\\\\\\nby some key 3rd party software that does so for speed.\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/cpython/commit/40cc809902304f60c6e1c933191dd4d64e570e28\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2024-05-05T19:28:55Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"40cc809902304f60c6e1c933191dd4d64e570e28\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"Include/internal/pycore_backoff.h\\\\\",\\\\n \\\\\"Misc/NEWS.d/next/Core and Builtins/2024-05-05-12-04-02.gh-issue-117549.kITawD.rst\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 12,\\\\n \\\\\"deletions\\\\\": 2,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"118580\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"Misc/NEWS.d/next/Core and Builtins/2024-05-05-12-04-02.gh-issue-117549.kITawD.rst\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"restructuredtext\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"Don\\'t use designated initializer syntax in inline functions in internal\\\\\\\\nheaders. They cause problems for C++ or MSVC users who aren\\'t yet using the\\\\\\\\nlatest C++ standard (C++20). While internal, pycore_backoff.h, is included\\\\\\\\n(indirectly, via pycore_code.h) by some key 3rd party software that does so\\\\\\\\nfor speed.\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"Don\\'t use designated initializer syntax in inline functions in internal\\\\\\\\nheaders. They cause problems for C++ or MSVC users who aren\\'t yet using the\\\\\\\\nlatest C++ standard (C++20). While internal, pycore_backoff.h, is included\\\\\\\\n(indirectly, via pycore_code.h) by some key 3rd party software that does so\\\\\\\\nfor speed.\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"addition\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 0,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"references_issue; has_body\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"cpython\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"gh-74929: Rudimentary docs for PEP 667 (#118581)\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"gh-74929: Rudimentary docs for PEP 667 (#118581)\\\\\\\\n\\\\\\\\nThis is *not* sufficient for the final 3.13 release, but it will do for beta 1:\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\n- What\\'s new entry\\\\\\\\r\\\\\\\\n- Updated changelog entry (news blurb)\\\\\\\\r\\\\\\\\n- Mention the proxy for f_globals in the datamodel and Python frame object docs\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nThis doesn\\'t have any C API details (what\\'s new refers to the PEP).\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/cpython/commit/9c13d9e37a194f574b8591da634bf98419786448\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2024-05-05T15:31:26Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"9c13d9e37a194f574b8591da634bf98419786448\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"Doc/c-api/frame.rst\\\\\",\\\\n \\\\\"Doc/reference/datamodel.rst\\\\\",\\\\n \\\\\"Doc/whatsnew/3.13.rst\\\\\",\\\\n \\\\\"Misc/NEWS.d/next/Core and Builtins/2024-04-27-21-44-40.gh-issue-74929.C2nESp.rst\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 22,\\\\n \\\\\"deletions\\\\\": 3,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"118581\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"Doc/c-api/frame.rst\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"restructuredtext\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"\\\\\\\\n.. c:function:: PyObject* PyFrame_GetLocals(PyFrameObject *frame)\\\\\\\\n\\\\\\\\n Get the *frame*\\'s :attr:`~frame.f_locals` attribute (:class:`dict`).\\\\\\\\n\\\\\\\\n Return a :term:`strong reference`.\\\\\\\\n\\\\\\\\n .. versionadded:: 3.11\\\\\\\\n\\\\\\\\n\\\\\\\\n.. c:function:: int PyFrame_GetLineNumber(PyFrameObject *frame)\\\\\\\\n\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"\\\\\\\\n.. c:function:: PyObject* PyFrame_GetLocals(PyFrameObject *frame)\\\\\\\\n\\\\\\\\n Get the *frame*\\'s :attr:`~frame.f_locals` attribute.\\\\\\\\n If the frame refers to a function or comprehension, this returns\\\\\\\\n a write-through proxy object that allows modifying the locals.\\\\\\\\n In all other cases (classes, modules) it returns the :class:`dict`\\\\\\\\n representing the frame locals directly.\\\\\\\\n\\\\\\\\n Return a :term:`strong reference`.\\\\\\\\n\\\\\\\\n .. versionadded:: 3.11\\\\\\\\n\\\\\\\\n .. versionchanged:: 3.13\\\\\\\\n Return a proxy object for functions and comprehensions.\\\\\\\\n\\\\\\\\n\\\\\\\\n.. c:function:: int PyFrame_GetLineNumber(PyFrameObject *frame)\\\\\\\\n\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"\\\\\\\\n.. c:function:: PyObject* PyFrame_GetLocals(PyFrameObject *frame)\\\\\\\\n\\\\\\\\n Get the *frame*\\'s :attr:`~frame.f_locals` attribute (:class:`dict`).\\\\\\\\n Get the *frame*\\'s :attr:`~frame.f_locals` attribute.\\\\\\\\n If the frame refers to a function or comprehension, this returns\\\\\\\\n a write-through proxy object that allows modifying the locals.\\\\\\\\n In all other cases (classes, modules) it returns the :class:`dict`\\\\\\\\n representing the frame locals directly.\\\\\\\\n\\\\\\\\n Return a :term:`strong reference`.\\\\\\\\n\\\\\\\\n .. versionadded:: 3.11\\\\\\\\n\\\\\\\\n .. versionchanged:: 3.13\\\\\\\\n Return a proxy object for functions and comprehensions.\\\\\\\\n\\\\\\\\n\\\\\\\\n.. \", \"chunk_index\": 3, \"chunk_size\": 8139, \"cut_type\": \"sentence_end\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"DocumentChunk\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#801212\", \"name\": \"b499402e-a501-52b8-954a-6571ddd727f9\"}, {\"id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"description\": \"Adds support for instantiating NoneType in type checker by treating NoneType as callable returning None. Adds tests.\", \"name\": \"mypy pr 19782\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"description\": \"Error: Cannot instantiate type \\'Type[None]\\' when calling NoneType() or type(None)().\", \"name\": \"issue 19660\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"54c17410-0d01-5596-be63-17324d8dc8f5\", \"description\": \"issue\", \"name\": \"issue\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"9fe70bdc-8d0b-5a8b-bd90-9d47b04ac07d\", \"description\": \"Modified to treat NoneType as callable returning None by returning a CallableType with ret_type NoneType.\", \"name\": \"mypy/checkexpr.py\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"4fe3883e-98b1-510a-923a-cac7ef417bdf\", \"description\": \"Added tests testTypeUsingTypeCNoneType covering calls to type(None)() and NoneType().\", \"name\": \"test-data/unit/check-classes.test\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"description\": \"Adds new mypyc primitives for weakref.proxy and stub updates; tests failing due to possible refcount bug.\", \"name\": \"mypyc pr 19217\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"2e66282b-1261-5065-9715-1bf26a8b3da9\", \"description\": \"Update what\\'s new in 3.13 and 3.14 with create_task changes of asyncio.\", \"name\": \"cpython commit 28625d4\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"description\": \"commit\", \"name\": \"commit\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"8b5669e3-058a-598e-b76a-67834c61ea3e\", \"description\": \"Update CODEOWNERS.\", \"name\": \"cpython commit 905eddc\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"ae8941fd-eb11-565a-b1bd-92adaf3ca2d8\", \"description\": \"Withdraw most of my ownership in favor of Mark.\", \"name\": \"cpython commit 3ff06eb\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"712b43bb-4f51-5305-b915-c26ed62f0bf4\", \"description\": \"Don\\'t use designated initializers in headers.\", \"name\": \"cpython commit 40cc8099\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"a694bb5a-967d-5f0c-a35f-ffe06a311cac\", \"description\": \"Rudimentary docs for PEP 667.\", \"name\": \"cpython commit 9c13d9e3\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"text\": \"c:function:: int PyFrame_GetLineNumber(PyFrameObject *frame)\\\\\\\\n\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 11,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"Doc/reference/datamodel.rst\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"restructuredtext\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"\\\\\\\\n * - .. attribute:: frame.f_locals\\\\\\\\n - The dictionary used by the frame to look up\\\\\\\\n :ref:`local variables <naming>`\\\\\\\\n\\\\\\\\n * - .. attribute:: frame.f_globals\\\\\\\\n - The dictionary used by the frame to look up\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"\\\\\\\\n * - .. attribute:: frame.f_locals\\\\\\\\n - The dictionary used by the frame to look up\\\\\\\\n :ref:`local variables <naming>`.\\\\\\\\n If the frame refers to a function or comprehension,\\\\\\\\n this may return a write-through proxy object.\\\\\\\\n\\\\\\\\n .. versionchanged:: 3.13\\\\\\\\n Return a proxy for functions and comprehensions.\\\\\\\\n\\\\\\\\n * - .. attribute:: frame.f_globals\\\\\\\\n - The dictionary used by the frame to look up\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"\\\\\\\\n * - .. attribute:: frame.f_locals\\\\\\\\n - The dictionary used by the frame to look up\\\\\\\\n :ref:`local variables <naming>`\\\\\\\\n :ref:`local variables <naming>`.\\\\\\\\n If the frame refers to a function or comprehension,\\\\\\\\n this may return a write-through proxy object.\\\\\\\\n\\\\\\\\n .. versionchanged:: 3.13\\\\\\\\n Return a proxy for functions and comprehensions.\\\\\\\\n\\\\\\\\n * - .. attribute:: frame.f_globals\\\\\\\\n - The dictionary used by the frame to look up\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"Doc/whatsnew/3.13.rst\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"restructuredtext\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" Performance improvements are modest -- we expect to be improving this\\\\\\\\n over the next few releases.\\\\\\\\n\\\\\\\\nNew typing features:\\\\\\\\n\\\\\\\\n* :pep:`696`: Type parameters (:data:`typing.TypeVar`, :data:`typing.ParamSpec`,\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" Performance improvements are modest -- we expect to be improving this\\\\\\\\n over the next few releases.\\\\\\\\n\\\\\\\\n* :pep:`667`: :attr:`FrameType.f_locals <frame.f_locals>` when used in\\\\\\\\n a function now returns a write-through proxy to the frame\\'s locals,\\\\\\\\n rather than a ``dict``. See the PEP for corresponding C API changes\\\\\\\\n and deprecations.\\\\\\\\n\\\\\\\\nNew typing features:\\\\\\\\n\\\\\\\\n* :pep:`696`: Type parameters (:data:`typing.TypeVar`, :data:`typing.ParamSpec`,\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" Performance improvements are modest -- we expect to be improving this\\\\\\\\n over the next few releases.\\\\\\\\n\\\\\\\\n* :pep:`667`: :attr:`FrameType.f_locals <frame.f_locals>` when used in\\\\\\\\n a function now returns a write-through proxy to the frame\\'s locals,\\\\\\\\n rather than a ``dict``. See the PEP for corresponding C API changes\\\\\\\\n and deprecations.\\\\\\\\n\\\\\\\\nNew typing features:\\\\\\\\n\\\\\\\\n* :pep:`696`: Type parameters (:data:`typing.TypeVar`, :data:`typing.ParamSpec`,\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"concise_subject; references_issue; has_body\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"cpython\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"gh-118335: Rename --experimental-interpreter on Windows to --experimental-jit-interpreter (#118497)\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"gh-118335: Rename --experimental-interpreter on Windows to --experimental-jit-interpreter (#118497)\\\\\\\\n\\\\\\\\nAlso fix docs for this in whatsnew.\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/cpython/commit/a37b0932285b5e883b13a46ff2a32f15d7339894\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2024-05-02T00:48:34Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"a37b0932285b5e883b13a46ff2a32f15d7339894\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"Doc/whatsnew/3.13.rst\\\\\",\\\\n \\\\\"PCbuild/build.bat\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 5,\\\\n \\\\\"deletions\\\\\": 4,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"118497\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"references_issue; has_body\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"Support TypeGuard (PEP 647) (#9865)\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"Support TypeGuard (PEP 647) (#9865)\\\\\\\\n\\\\\\\\nPEP 647 is still in draft mode, but it is likely to be accepted, and this helps solve some real issues.\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/commit/fffbe88fc54807c8b10ac40456522ad2faf8d350\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2021-01-18T18:13:36Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"fffbe88fc54807c8b10ac40456522ad2faf8d350\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"mypy/checker.py\\\\\",\\\\n \\\\\"mypy/checkexpr.py\\\\\",\\\\n \\\\\"mypy/constraints.py\\\\\",\\\\n \\\\\"mypy/expandtype.py\\\\\",\\\\n \\\\\"mypy/fixup.py\\\\\",\\\\n \\\\\"mypy/nodes.py\\\\\",\\\\n \\\\\"mypy/test/testcheck.py\\\\\",\\\\n \\\\\"mypy/typeanal.py\\\\\",\\\\n \\\\\"mypy/types.py\\\\\",\\\\n \\\\\"test-data/unit/check-python38.test\\\\\",\\\\n \\\\\"test-data/unit/check-serialize.test\\\\\",\\\\n \\\\\"test-data/unit/check-typeguard.test\\\\\",\\\\n \\\\\"test-data/unit/lib-stub/typing_extensions.pyi\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 408,\\\\n \\\\\"deletions\\\\\": 9,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"9865\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/checker.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" if literal(expr) == LITERAL_TYPE:\\\\\\\\n vartype = type_map[expr]\\\\\\\\n return self.conditional_callable_type_map(expr, vartype)\\\\\\\\n elif isinstance(node, ComparisonExpr):\\\\\\\\n # Step 1: Obtain the types of each operand and whether or not we can\\\\\\\\n # narrow their types. (For example, we shouldn\\'t try narrowing the\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" if literal(expr) == LITERAL_TYPE:\\\\\\\\n vartype = type_map[expr]\\\\\\\\n return self.conditional_callable_type_map(expr, vartype)\\\\\\\\n elif isinstance(node.callee, RefExpr):\\\\\\\\n if node.callee.type_guard is not None:\\\\\\\\n # TODO: Follow keyword args or *args, **kwargs\\\\\\\\n if node.arg_kinds[0] != nodes.ARG_POS:\\\\\\\\n self.fail(\\\\\\\\\\\\\"Type guard requires positional argument\\\\\\\\\\\\\", node)\\\\\\\\n return {}, {}\\\\\\\\n if literal(expr) == LITERAL_TYPE:\\\\\\\\n return {expr: TypeGuardType(node.callee.type_guard)}, {}\\\\\\\\n elif isinstance(node, ComparisonExpr):\\\\\\\\n # Step 1: Obtain the types of each operand and whether or not we can\\\\\\\\n # narrow their types. (For example, we shouldn\\'t try narrowing the\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" if literal(expr) == LITERAL_TYPE:\\\\\\\\n vartype = type_map[expr]\\\\\\\\n return self.conditional_callable_type_map(expr, vartype)\\\\\\\\n elif isinstance(node.callee, RefExpr):\\\\\\\\n if node.callee.type_guard is not None:\\\\\\\\n # TODO: Follow keyword args or *args, **kwargs\\\\\\\\n if node.arg_kinds[0] != nodes.ARG_POS:\\\\\\\\n self.fail(\\\\\\\\\\\\\"Type guard requires positional argument\\\\\\\\\\\\\", node)\\\\\\\\n return {}, {}\\\\\\\\n if literal(expr) == LITERAL_TYPE:\\\\\\\\n return {expr: TypeGuardType(node.callee.type_guard)}, {}\\\\\\\\n elif isinstance(node, ComparisonExpr):\\\\\\\\n # Step 1: Obtain the types of each operand and whether or not we can\\\\\\\\n # narrow their types. (For example, we shouldn\\'t try narrowing the\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/checkexpr.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" ret_type=self.object_type(),\\\\\\\\n fallback=self.named_type(\\'builtins.function\\'))\\\\\\\\n callee_type = get_proper_type(self.accept(e.callee, type_context, always_allow_any=True))\\\\\\\\n if (self.chk.options.disallow_untyped_calls and\\\\\\\\n self.chk.in_checked_function() and\\\\\\\\n isinstance(callee_type, CallableType)\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" ret_type=self.object_type(),\\\\\\\\n fallback=self.named_type(\\'builtins.function\\'))\\\\\\\\n callee_type = get_proper_type(self.accept(e.callee, type_context, always_allow_any=True))\\\\\\\\n if (isinstance(e.callee, RefExpr)\\\\\\\\n and isinstance(callee_type, CallableType)\\\\\\\\n and callee_type.type_guard is not None):\\\\\\\\n # Cache it for find_isinstance_check()\\\\\\\\n e.callee.type_guard = callee_type.type_guard\\\\\\\\n if (self.chk.options.disallow_untyped_calls and\\\\\\\\n self.chk.in_checked_function() and\\\\\\\\n isinstance(callee_type, CallableType)\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" ret_type=self.object_type(),\\\\\\\\n fallback=self.named_type(\\'builtins.function\\'))\\\\\\\\n callee_type = get_proper_type(self.accept(e.callee, type_context, always_allow_any=True))\\\\\\\\n if (isinstance(e.callee, RefExpr)\\\\\\\\n and isinstance(callee_type, CallableType)\\\\\\\\n and callee_type.type_guard is not None):\\\\\\\\n # Cache it for find_isinstance_check()\\\\\\\\n e.callee.type_guard = callee_type.type_guard\\\\\\\\n if (self.chk.options.disallow_untyped_calls and\\\\\\\\n self.chk.in_checked_function() and\\\\\\\\n isinstance(callee_type, CallableType)\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"generator_expression\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/checkexpr.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\n if literal(expr) >= LITERAL_TYPE:\\\\\\\\n restriction = self.chk.binder.get(expr)\\\\\\\\n # If the current node is deferred, some variables may get Any types that they\\\\\\\\n # otherwise wouldn\\'t have. We don\\'t want to narrow down these since it may\\\\\\\\n # produce invalid inferred Optional[Any] types, at least.\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\n if literal(expr) >= LITERAL_TYPE:\\\\\\\\n restriction = self.chk.binder.get(expr)\\\\\\\\n # Ignore the error about using get_proper_type().\\\\\\\\n if isinstance(restriction, TypeGuardType): # type: ignore[misc]\\\\\\\\n # A type guard forces the new type even if it doesn\\'t overlap the old.\\\\\\\\n return restriction.type_guard\\\\\\\\n # If the current node is deferred, some variables may get Any types that they\\\\\\\\n # otherwise wouldn\\'t have. We don\\'t want to narrow down these since it may\\\\\\\\n # produce invalid inferred Optional[Any] types, at least.\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" \\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\n if literal(expr) >= LITERAL_TYPE:\\\\\\\\n restriction = self.chk.binder.get(expr)\\\\\\\\n # Ignore the error about using get_proper_type().\\\\\\\\n if isinstance(restriction, TypeGuardType): # type: ignore[misc]\\\\\\\\n # A type guard forces the new type even if it doesn\\'t overlap the old.\\\\\\\\n return restriction.type_guard\\\\\\\\n # If the current node is deferred, some variables may get Any types that they\\\\\\\\n # otherwise wouldn\\'t have. We don\\'t want to narrow down these since it may\\\\\\\\n # produce invalid inferred Optional[Any] types, at least.\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": \\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\\\\\\\\\"\\\\\",\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"type_hint\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/constraints.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" for t, a in zip(template.arg_types, cactual.arg_types):\\\\\\\\n # Negate direction due to function argument type contravariance.\\\\\\\\n res.extend(infer_constraints(t, a, neg_op(self.direction)))\\\\\\\\n res.extend(infer_constraints(template.ret_type, cactual.ret_type,\\\\\\\\n self.direction))\\\\\\\\n return res\\\\\\\\n elif isinstance(self.actual, AnyType):\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" for t, a in zip(template.arg_types, cactual.arg_types):\\\\\\\\n # Negate direction due to function argument type contravariance.\\\\\\\\n res.extend(infer_constraints(t, a, neg_op(self.direction)))\\\\\\\\n template_ret_type, cactual_ret_type = template.ret_type, cactual.ret_type\\\\\\\\n if template.type_guard is not None:\\\\\\\\n template_ret_type = template.type_guard\\\\\\\\n if cactual.type_guard is not None:\\\\\\\\n cactual_ret_type = cactual.type_guard\\\\\\\\n res.extend(infer_constraints(template_ret_type, cactual_ret_type,\\\\\\\\n self.direction))\\\\\\\\n return res\\\\\\\\n elif isinstance(self.actual, AnyType):\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" for t, a in zip(template.arg_types, cactual.arg_types):\\\\\\\\n # Negate direction due to function argument type contravariance.\\\\\\\\n res.extend(infer_constraints(t, a, neg_op(self.direction)))\\\\\\\\n res.extend(infer_constraints(template.ret_type, cactual.ret_type,\\\\\\\\n template_ret_type, cactual_ret_type = template.ret_type, cactual.ret_type\\\\\\\\n if template.type_guard is not None:\\\\\\\\n template_ret_type = template.type_guard\\\\\\\\n if cactual.type_guard is not None:\\\\\\\\n cactual_ret_type = cactual.type_guard\\\\\\\\n res.extend(infer_constraints(template_ret_type, cactual_ret_type,\\\\\\\\n self.direction))\\\\\\\\n return res\\\\\\\\n elif isinstance(self.actual, AnyType):\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": [\\\\n \\\\\"type_hint\\\\\"\\\\n ]\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/expandtype.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"\\\\\\\\n def visit_callable_type(self, t: CallableType) -> Type:\\\\\\\\n return t.copy_modified(arg_types=self.expand_types(t.arg_types),\\\\\\\\n ret_type=t.ret_type.accept(self))\\\\\\\\n\\\\\\\\n def visit_overloaded(self, t: Overloaded) -> Type:\\\\\\\\n items = [] # type: List[CallableType]\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"\\\\\\\\n def visit_callable_type(self, t: CallableType) -> Type:\\\\\\\\n return t.copy_modified(arg_types=self.expand_types(t.arg_types),\\\\\\\\n ret_type=t.ret_type.accept(self),\\\\\\\\n type_guard=(t.type_guard.accept(self)\\\\\\\\n if t.type_guard is not None else None))\\\\\\\\n\\\\\\\\n def visit_overloaded(self, t: Overloaded) -> Type:\\\\\\\\n items = [] # type: List[CallableType]\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"\\\\\\\\n def visit_callable_type(self, t: CallableType) -> Type:\\\\\\\\n return t.copy_modified(arg_types=self.expand_types(t.arg_types),\\\\\\\\n ret_type=t.ret_type.accept(self))\\\\\\\\n ret_type=t.ret_type.accept(self),\\\\\\\\n type_guard=(t.type_guard.accept(self)\\\\\\\\n if t.type_guard is not None else None))\\\\\\\\n\\\\\\\\n def visit_overloaded(self, t: Overloaded) -> Type:\\\\\\\\n items = [] # type: List[CallableType]\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": \\\\\"visit_overloaded\\\\\",\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\"mypy/fixup.py\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"python\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\" for arg in ct.bound_args:\\\\\\\\n if arg:\\\\\\\\n arg.accept(self)\\\\\\\\n\\\\\\\\n def visit_overloaded(self, t: Overloaded) -> None:\\\\\\\\n for ct in t.\", \"chunk_index\": 4, \"chunk_size\": 8160, \"cut_type\": \"sentence_end\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"DocumentChunk\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#801212\", \"name\": \"73477942-79cd-59bb-90bc-2e6798ff9431\"}, {\"id\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"description\": \"Issue referenced in cpython commit about renaming experimental interpreter on Windows.\", \"name\": \"gh-118335\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"description\": \"Commit that renames --experimental-interpreter on Windows to --experimental-jit-interpreter and fixes docs in whatsnew.\", \"name\": \"rename --experimental-interpreter on windows to --experimental-jit-interpreter\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"4e2eb148-afe3-59c3-b4ed-171966e16ac4\", \"description\": \"The CPython source code repository.\", \"name\": \"cpython\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"9d2f4a61-7b81-5539-aef2-6bf677b5229e\", \"description\": \"repository\", \"name\": \"repository\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"description\": \"What\\'s New document for Python 3.13.\", \"name\": \"doc/whatsnew/3.13.rst\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"fb723c4d-3d29-5885-b7db-8f01dbaeeaae\", \"description\": \"Windows build script modified in the commit.\", \"name\": \"pcbuild/build.bat\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"description\": \"Mypy commit adding support for TypeGuard (PEP 647).\", \"name\": \"mypy: support typeguard (pep 647)\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"description\": \"PEP related to frame.f_locals returning a proxy.\", \"name\": \"pep 667\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"c173fcdb-8139-5426-b0b1-dd5013704063\", \"description\": \"pep\", \"name\": \"pep\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"d224b849-330b-5ece-9acf-e3b79816abf3\", \"description\": \"PEP about Type parameters; mentioned in whatsnew.\", \"name\": \"pep 696\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"description\": \"PEP for TypeGuard supported by mypy.\", \"name\": \"pep 647\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"text\": \"items():\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\" for arg in ct.bound_args:\\\\\\\\n if arg:\\\\\\\\n arg.accept(self)\\\\\\\\n if ct.type_guard is not None:\\\\\\\\n ct.type_guard.accept(self)\\\\\\\\n\\\\\\\\n def visit_overloaded(self, t: Overloaded) -> None:\\\\\\\\n for ct in t.items():\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\" for arg in ct.bound_args:\\\\\\\\n if arg:\\\\\\\\n arg.accept(self)\\\\\\\\n if ct.type_guard is not None:\\\\\\\\n ct.type_guard.accept(self)\\\\\\\\n\\\\\\\\n def visit_overloaded(self, t: Overloaded) -> None:\\\\\\\\n for ct in t.items():\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 6,\\\\n \\\\\"function_name\\\\\": \\\\\"visit_overloaded\\\\\",\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"concise_subject; references_issue; has_body\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"Add a separate issue form to report crashes (#9549)\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"Add a separate issue form to report crashes (#9549)\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/commit/cca6e2fdc874b7538bd1d2ef70daab687b2a0363\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2020-10-08T22:30:06Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"cca6e2fdc874b7538bd1d2ef70daab687b2a0363\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\".github/ISSUE_TEMPLATE/crash.md\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 41,\\\\n \\\\\"deletions\\\\\": 0,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"9549\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\".github/ISSUE_TEMPLATE/crash.md\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"markdown\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"---\\\\\\\\nname: Crash Report\\\\\\\\nabout: Crash (traceback or \\\\\\\\\\\\\"INTERNAL ERROR\\\\\\\\\\\\\")\\\\\\\\nlabels: \\\\\\\\\\\\\"crash\\\\\\\\\\\\\"\\\\\\\\n---\\\\\\\\n\\\\\\\\n<!--\\\\\\\\n Use this form only if mypy reports an \\\\\\\\\\\\\"INTERNAL ERROR\\\\\\\\\\\\\" and/or gives a traceback.\\\\\\\\n Please include the traceback and all other messages below (use `mypy --show-traceback`).\\\\\\\\n-->\\\\\\\\n\\\\\\\\n**Crash Report**\\\\\\\\n\\\\\\\\n(Tell us what happened.)\\\\\\\\n\\\\\\\\n**Traceback**\\\\\\\\n\\\\\\\\n```\\\\\\\\n(Insert traceback and other messages from mypy here -- use `--show-traceback`.)\\\\\\\\n```\\\\\\\\n\\\\\\\\n**To Reproduce**\\\\\\\\n\\\\\\\\n(Write what you did to reproduce the crash. Full source code is\\\\\\\\nappreciated. We also very much appreciate it if you try to narrow the\\\\\\\\nsource down to a small stand-alone example.)\\\\\\\\n\\\\\\\\n**Your Environment**\\\\\\\\n\\\\\\\\n<!-- Include as many relevant details about the environment you experienced the bug in -->\\\\\\\\n\\\\\\\\n- Mypy version used:\\\\\\\\n- Mypy command-line flags:\\\\\\\\n- Mypy configuration options from `mypy.ini` (and other config files):\\\\\\\\n- Python version used:\\\\\\\\n- Operating system and version:\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nYou can freely edit this text, please remove all the lines\\\\\\\\nyou believe are unnecessary.\\\\\\\\n-->\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"---\\\\\\\\nname: Crash Report\\\\\\\\nabout: Crash (traceback or \\\\\\\\\\\\\"INTERNAL ERROR\\\\\\\\\\\\\")\\\\\\\\nlabels: \\\\\\\\\\\\\"crash\\\\\\\\\\\\\"\\\\\\\\n---\\\\\\\\n\\\\\\\\n<!--\\\\\\\\n Use this form only if mypy reports an \\\\\\\\\\\\\"INTERNAL ERROR\\\\\\\\\\\\\" and/or gives a traceback.\\\\\\\\n Please include the traceback and all other messages below (use `mypy --show-traceback`).\\\\\\\\n-->\\\\\\\\n\\\\\\\\n**Crash Report**\\\\\\\\n\\\\\\\\n(Tell us what happened.)\\\\\\\\n\\\\\\\\n**Traceback**\\\\\\\\n\\\\\\\\n```\\\\\\\\n(Insert traceback and other messages from mypy here -- use `--show-traceback`.)\\\\\\\\n```\\\\\\\\n\\\\\\\\n**To Reproduce**\\\\\\\\n\\\\\\\\n(Write what you did to reproduce the crash. Full source code is\\\\\\\\nappreciated. We also very much appreciate it if you try to narrow the\\\\\\\\nsource down to a small stand-alone example.)\\\\\\\\n\\\\\\\\n**Your Environment**\\\\\\\\n\\\\\\\\n<!-- Include as many relevant details about the environment you experienced the bug in -->\\\\\\\\n\\\\\\\\n- Mypy version used:\\\\\\\\n- Mypy command-line flags:\\\\\\\\n- Mypy configuration options from `mypy.ini` (and other config files):\\\\\\\\n- Python version used:\\\\\\\\n- Operating system and version:\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nYou can freely edit this text, please remove all the lines\\\\\\\\nyou believe are unnecessary.\\\\\\\\n-->\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"addition\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 0,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"imperative_mood; references_issue\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"Make the new bug templates less markup-heavy (#9438)\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"Make the new bug templates less markup-heavy (#9438)\\\\\\\\n\\\\\\\\n- Remove emoji\\\\\\\\r\\\\\\\\n- Instead of `## H2 headings` just use `**bold**`\\\\\\\\r\\\\\\\\n- Add link to docs\\\\\\\\r\\\\\\\\n- Add suggestion for new users not to file a bug\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/commit/6f07cb6a2e02446b909846f99817f674675e826e\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2020-09-11T18:35:59Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"6f07cb6a2e02446b909846f99817f674675e826e\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\".github/ISSUE_TEMPLATE/bug.md\\\\\",\\\\n \\\\\".github/ISSUE_TEMPLATE/documentation.md\\\\\",\\\\n \\\\\".github/ISSUE_TEMPLATE/feature.md\\\\\",\\\\n \\\\\".github/ISSUE_TEMPLATE/question.md\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 24,\\\\n \\\\\"deletions\\\\\": 18,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"9438\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\".github/ISSUE_TEMPLATE/bug.md\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"markdown\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"---\\\\\\\\nname: \\\\ud83d\\\\udc1b Bug Report\\\\\\\\nabout: Submit a bug report\\\\\\\\nlabels: \\\\\\\\\\\\\"bug\\\\\\\\\\\\\"\\\\\\\\n---\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nNote: If the problem you are reporting is about a specific library function, then the typeshed tracker is better suited\\\\\\\\nfor this report: https://github.com/python/typeshed/issues\\\\\\\\n-->\\\\\\\\n\\\\\\\\n## \\\\ud83d\\\\udc1b Bug Report\\\\\\\\n\\\\\\\\n(A clear and concise description of what the bug is.)\\\\\\\\n\\\\\\\\n## To Reproduce\\\\\\\\n\\\\\\\\n(Write your steps here:)\\\\\\\\n\\\\\\\\n1. Step 1...\\\\\\\\n1. Step 2...\\\\\\\\n1. Step 3...\\\\\\\\n\\\\\\\\n## Expected Behavior\\\\\\\\n\\\\\\\\n<!--\\\\\\\\n How did you expect your project to behave?\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"---\\\\\\\\nname: Bug Report\\\\\\\\nabout: Submit a bug report\\\\\\\\nlabels: \\\\\\\\\\\\\"bug\\\\\\\\\\\\\"\\\\\\\\n---\\\\\\\\n\\\\\\\\n<!--\\\\\\\\n If you\\'re new to mypy and you\\'re not sure whether what you\\'re experiencing is a mypy bug, please see the \\\\\\\\\\\\\"Question and Help\\\\\\\\\\\\\" form\\\\\\\\n instead.\\\\\\\\n-->\\\\\\\\n\\\\\\\\n**Bug Report**\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nNote: If the problem you are reporting is about a specific library function, then the typeshed tracker is better suited\\\\\\\\nfor this report: https://github.com/python/typeshed/issues\\\\\\\\n-->\\\\\\\\n\\\\\\\\n(A clear and concise description of what the bug is.)\\\\\\\\n\\\\\\\\n**To Reproduce**\\\\\\\\n\\\\\\\\n(Write your steps here:)\\\\\\\\n\\\\\\\\n1. Step 1...\\\\\\\\n2. Step 2...\\\\\\\\n3. Step 3...\\\\\\\\n\\\\\\\\n**Expected Behavior**\\\\\\\\n\\\\\\\\n<!--\\\\\\\\n How did you expect your project to behave?\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"---\\\\\\\\nname: \\\\ud83d\\\\udc1b Bug Report\\\\\\\\nname: Bug Report\\\\\\\\nabout: Submit a bug report\\\\\\\\nlabels: \\\\\\\\\\\\\"bug\\\\\\\\\\\\\"\\\\\\\\n---\\\\\\\\n\\\\\\\\n<!--\\\\\\\\n If you\\'re new to mypy and you\\'re not sure whether what you\\'re experiencing is a mypy bug, please see the \\\\\\\\\\\\\"Question and Help\\\\\\\\\\\\\" form\\\\\\\\n instead.\\\\\\\\n-->\\\\\\\\n\\\\\\\\n**Bug Report**\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nNote: If the problem you are reporting is about a specific library function, then the typeshed tracker is better suited\\\\\\\\nfor this report: https://github.com/python/typeshed/issues\\\\\\\\n-->\\\\\\\\n\\\\\\\\n## \\\\ud83d\\\\udc1b Bug Report\\\\\\\\n\\\\\\\\n(A clear and concise description of what the bug is.)\\\\\\\\n\\\\\\\\n## To Reproduce\\\\\\\\n**To Reproduce**\\\\\\\\n\\\\\\\\n(Write your steps here:)\\\\\\\\n\\\\\\\\n1. Step 1...\\\\\\\\n1. Step 2...\\\\\\\\n1. Step 3...\\\\\\\\n2. Step 2...\\\\\\\\n3. Step 3...\\\\\\\\n\\\\\\\\n## Expected Behavior\\\\\\\\n**Expected Behavior**\\\\\\\\n\\\\\\\\n<!--\\\\\\\\n How did you expect your project to behave?\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"modification\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 20,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"references_issue; has_body\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"Add MYPY_CONFIG_FILE_DIR to environment when config file is read (2nd try) (#9414)\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"Add MYPY_CONFIG_FILE_DIR to environment when config file is read (2nd try) (#9414)\\\\\\\\n\\\\\\\\n(This fixes the mistake I introduced in the previous version.)\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nResubmit of #9403.\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nFixes #7968.\\\\\\\\r\\\\\\\\n\\\\\\\\r\\\\\\\\nCo-authored-by: aghast <aghast@aghast.dev>\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/commit/9d038469d80e36057c77e0a8a18831f829778f9d\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2020-09-04T20:55:14Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"9d038469d80e36057c77e0a8a18831f829778f9d\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"mypy/config_parser.py\\\\\",\\\\n \\\\\"mypy/test/testcmdline.py\\\\\",\\\\n \\\\\"test-data/unit/envvars.test\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 15,\\\\n \\\\\"deletions\\\\\": 0,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"9403\\\\\",\\\\n \\\\\"7968\\\\\",\\\\n \\\\\"9414\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"imperative_mood; references_issue; has_body\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"Revert \\\\\\\\\\\\\"Add MYPY_CONFIG_FILE_DIR to environment when config file is read (#9403)\\\\\\\\\\\\\"\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"Revert \\\\\\\\\\\\\"Add MYPY_CONFIG_FILE_DIR to environment when config file is read (#9403)\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\\nReason: This broke CI.\\\\\\\\n\\\\\\\\nThis reverts commit 652aca96609c876c47ca7eaa68d67ac1e36f4215.\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/commit/57d3473ae906fe945953b874d3dcb66efb2710ca\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2020-09-04T02:45:27Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"57d3473ae906fe945953b874d3dcb66efb2710ca\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\"mypy/config_parser.py\\\\\",\\\\n \\\\\"mypy/test/testcmdline.py\\\\\",\\\\n \\\\\"test-data/unit/envvars.test\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 0,\\\\n \\\\\"deletions\\\\\": 15,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"9403\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"references_issue; has_body\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n },\\\\n {\\\\n \\\\\"type\\\\\": \\\\\"commit\\\\\",\\\\n \\\\\"repository\\\\\": \\\\\"mypy\\\\\",\\\\n \\\\\"title\\\\\": \\\\\"Revert issue template (#9345) -- it doesn\\'t work\\\\\",\\\\n \\\\\"description\\\\\": \\\\\"Revert issue template (#9345) -- it doesn\\'t work\\\\\\\\n\\\\\\\\nThis reverts commit 18c84e0f6906cfb315c367aa35550a4727cb57f8.\\\\\",\\\\n \\\\\"url\\\\\": \\\\\"https://github.com/python/mypy/commit/42a522089c6b418727e143c181128e902acf0908\\\\\",\\\\n \\\\\"date\\\\\": \\\\\"2020-08-27T22:21:28Z\\\\\",\\\\n \\\\\"sha_or_number\\\\\": \\\\\"42a522089c6b418727e143c181128e902acf0908\\\\\",\\\\n \\\\\"files_changed\\\\\": [\\\\n \\\\\".github/ISSUE_TEMPLATE/bug.md\\\\\",\\\\n \\\\\".github/ISSUE_TEMPLATE/documentation.md\\\\\",\\\\n \\\\\".github/ISSUE_TEMPLATE/feature.md\\\\\",\\\\n \\\\\".github/ISSUE_TEMPLATE/question.md\\\\\",\\\\n \\\\\".github/PULL_REQUEST_TEMPLATE.md\\\\\",\\\\n \\\\\"ISSUE_TEMPLATE.md\\\\\"\\\\n ],\\\\n \\\\\"additions\\\\\": 20,\\\\n \\\\\"deletions\\\\\": 110,\\\\n \\\\\"labels\\\\\": [],\\\\n \\\\\"related_issues\\\\\": [\\\\n \\\\\"9345\\\\\"\\\\n ],\\\\n \\\\\"code_samples\\\\\": [\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\".github/ISSUE_TEMPLATE/bug.md\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"markdown\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"---\\\\\\\\nname: \\\\ud83d\\\\udc1b Bug Report\\\\\\\\nlabels: \\\\\\\\\\\\\"bug\\\\\\\\\\\\\"\\\\\\\\n---\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nNote: If the problem you are reporting is about a specific library function, then the typeshed tracker is better suited\\\\\\\\nfor this report: https://github.com/python/typeshed/issues\\\\\\\\n-->\\\\\\\\n\\\\\\\\n## \\\\ud83d\\\\udc1b Bug Report\\\\\\\\n\\\\\\\\n(A clear and concise description of what the bug is.)\\\\\\\\n\\\\\\\\n## To Reproduce\\\\\\\\n\\\\\\\\n(Write your steps here:)\\\\\\\\n\\\\\\\\n1. Step 1...\\\\\\\\n1. Step 2...\\\\\\\\n1. Step 3...\\\\\\\\n\\\\\\\\n## Expected Behavior\\\\\\\\n\\\\\\\\n<!--\\\\\\\\n How did you expect your project to behave?\\\\\\\\n It\\\\u2019s fine if you\\\\u2019re not sure your understanding is correct.\\\\\\\\n Write down what you thought would happen. If you just expected no errors, you can delete this section.\\\\\\\\n-->\\\\\\\\n\\\\\\\\n(Write what you thought would happen.)\\\\\\\\n\\\\\\\\n## Actual Behavior\\\\\\\\n\\\\\\\\n<!--\\\\\\\\n Did something go wrong?\\\\\\\\n Is something broken, or not behaving as you expected?\\\\\\\\n-->\\\\\\\\n\\\\\\\\n(Write what happened.)\\\\\\\\n\\\\\\\\n## Your Environment\\\\\\\\n\\\\\\\\n<!-- Include as many relevant details about the environment you experienced the bug in -->\\\\\\\\n\\\\\\\\n- Mypy version used:\\\\\\\\n- Mypy command-line flags:\\\\\\\\n- Mypy configuration options from `mypy.ini` (and other config files):\\\\\\\\n- Python version used:\\\\\\\\n- Operating system and version:\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nYou can freely edit this text, please remove all the lines\\\\\\\\nyou believe are unnecessary.\\\\\\\\n-->\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"---\\\\\\\\nname: \\\\ud83d\\\\udc1b Bug Report\\\\\\\\nlabels: \\\\\\\\\\\\\"bug\\\\\\\\\\\\\"\\\\\\\\n---\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nNote: If the problem you are reporting is about a specific library function, then the typeshed tracker is better suited\\\\\\\\nfor this report: https://github.com/python/typeshed/issues\\\\\\\\n-->\\\\\\\\n\\\\\\\\n## \\\\ud83d\\\\udc1b Bug Report\\\\\\\\n\\\\\\\\n(A clear and concise description of what the bug is.)\\\\\\\\n\\\\\\\\n## To Reproduce\\\\\\\\n\\\\\\\\n(Write your steps here:)\\\\\\\\n\\\\\\\\n1. Step 1...\\\\\\\\n1. Step 2...\\\\\\\\n1. Step 3...\\\\\\\\n\\\\\\\\n## Expected Behavior\\\\\\\\n\\\\\\\\n<!--\\\\\\\\n How did you expect your project to behave?\\\\\\\\n It\\\\u2019s fine if you\\\\u2019re not sure your understanding is correct.\\\\\\\\n Write down what you thought would happen. If you just expected no errors, you can delete this section.\\\\\\\\n-->\\\\\\\\n\\\\\\\\n(Write what you thought would happen.)\\\\\\\\n\\\\\\\\n## Actual Behavior\\\\\\\\n\\\\\\\\n<!--\\\\\\\\n Did something go wrong?\\\\\\\\n Is something broken, or not behaving as you expected?\\\\\\\\n-->\\\\\\\\n\\\\\\\\n(Write what happened.)\\\\\\\\n\\\\\\\\n## Your Environment\\\\\\\\n\\\\\\\\n<!-- Include as many relevant details about the environment you experienced the bug in -->\\\\\\\\n\\\\\\\\n- Mypy version used:\\\\\\\\n- Mypy command-line flags:\\\\\\\\n- Mypy configuration options from `mypy.ini` (and other config files):\\\\\\\\n- Python version used:\\\\\\\\n- Operating system and version:\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nYou can freely edit this text, please remove all the lines\\\\\\\\nyou believe are unnecessary.\\\\\\\\n-->\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"deletion\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 0,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\".github/ISSUE_TEMPLATE/feature.md\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"markdown\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"---\\\\\\\\nname: \\\\ud83d\\\\ude80 Feature\\\\\\\\nlabels: \\\\\\\\\\\\\"feature\\\\\\\\\\\\\"\\\\\\\\n---\\\\\\\\n\\\\\\\\n## \\\\ud83d\\\\ude80 Feature\\\\\\\\n\\\\\\\\n(A clear and concise description of your feature proposal.)\\\\\\\\n\\\\\\\\n## Pitch\\\\\\\\n\\\\\\\\n(Please explain why this feature should be implemented and how it would be used. Add examples, if applicable.)\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"---\\\\\\\\nname: \\\\ud83d\\\\ude80 Feature\\\\\\\\nlabels: \\\\\\\\\\\\\"feature\\\\\\\\\\\\\"\\\\\\\\n---\\\\\\\\n\\\\\\\\n## \\\\ud83d\\\\ude80 Feature\\\\\\\\n\\\\\\\\n(A clear and concise description of your feature proposal.)\\\\\\\\n\\\\\\\\n## Pitch\\\\\\\\n\\\\\\\\n(Please explain why this feature should be implemented and how it would be used. Add examples, if applicable.)\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"deletion\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 0,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n },\\\\n {\\\\n \\\\\"file_path\\\\\": \\\\\".github/PULL_REQUEST_TEMPLATE.md\\\\\",\\\\n \\\\\"language\\\\\": \\\\\"markdown\\\\\",\\\\n \\\\\"before_code\\\\\": \\\\\"### Have you read the [Contributing Guidelines](https://github.com/python/mypy/blob/master/CONTRIBUTING.md)?\\\\\\\\n\\\\\\\\n(Once you have, delete this section. If you leave it in, your PR may be closed without action.)\\\\\\\\n\\\\\\\\n### Description\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nIf this pull request closes or fixes an issue, write Closes #NNN\\\\\\\\\\\\\" or \\\\\\\\\\\\\"Fixes #NNN\\\\\\\\\\\\\" in that exact\\\\\\\\nformat.\\\\\\\\n-->\\\\\\\\n\\\\\\\\n(Explain how this PR changes mypy.)\\\\\\\\n\\\\\\\\n## Test Plan\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nIf this is a documentation change, rebuild the docs (link to instructions) and review the changed pages for markup errors.\\\\\\\\nIf this is a code change, include new tests (link to the testing docs). Be sure to run the tests locally and fix any errors before submitting the PR (more instructions).\\\\\\\\nIf this change cannot be tested by the CI, please explain how to verify it manually.\\\\\\\\n-->\\\\\\\\n\\\\\\\\n(Write your test plan here. If you changed any code, please provide us with clear instructions on how you verified your changes work.)\\\\\",\\\\n \\\\\"after_code\\\\\": \\\\\"\\\\\",\\\\n \\\\\"diff_context\\\\\": \\\\\"### Have you read the [Contributing Guidelines](https://github.com/python/mypy/blob/master/CONTRIBUTING.md)?\\\\\\\\n\\\\\\\\n(Once you have, delete this section. If you leave it in, your PR may be closed without action.)\\\\\\\\n\\\\\\\\n### Description\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nIf this pull request closes or fixes an issue, write Closes #NNN\\\\\\\\\\\\\" or \\\\\\\\\\\\\"Fixes #NNN\\\\\\\\\\\\\" in that exact\\\\\\\\nformat.\\\\\\\\n-->\\\\\\\\n\\\\\\\\n(Explain how this PR changes mypy.)\\\\\\\\n\\\\\\\\n## Test Plan\\\\\\\\n\\\\\\\\n<!--\\\\\\\\nIf this is a documentation change, rebuild the docs (link to instructions) and review the changed pages for markup errors.\\\\\\\\nIf this is a code change, include new tests (link to the testing docs). Be sure to run the tests locally and fix any errors before submitting the PR (more instructions).\\\\\\\\nIf this change cannot be tested by the CI, please explain how to verify it manually.\\\\\\\\n-->\\\\\\\\n\\\\\\\\n(Write your test plan here. If you changed any code, please provide us with clear instructions on how you verified your changes work.)\\\\\",\\\\n \\\\\"change_type\\\\\": \\\\\"deletion\\\\\",\\\\n \\\\\"lines_of_context\\\\\": 0,\\\\n \\\\\"function_name\\\\\": null,\\\\n \\\\\"class_name\\\\\": null,\\\\n \\\\\"docstring\\\\\": null,\\\\n \\\\\"coding_patterns\\\\\": []\\\\n }\\\\n ],\\\\n \\\\\"commit_message_style\\\\\": \\\\\"concise_subject; references_issue; has_body\\\\\",\\\\n \\\\\"python_version\\\\\": null,\\\\n \\\\\"pep_status\\\\\": null\\\\n }\\\\n]\", \"ontology_valid\": false, \"topological_rank\": 0, \"contains\": [], \"type\": \"DocumentChunk\", \"version\": 1, \"id\": \"4a6b97ed-0c1f-5c06-91be-8f807b2acd89\", \"chunk_index\": 5, \"chunk_size\": 7213, \"cut_type\": \"sentence_cut\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"color\": \"#801212\", \"name\": \"4a6b97ed-0c1f-5c06-91be-8f807b2acd89\"}, {\"id\": \"dafe2f00-e77c-5b0b-be9b-fa76ffe08a84\", \"text\": \"Refactor indirect dependency handling in mypy to be principled and correct\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"dafe2f00-e77c-5b0b-be9b-fa76ffe08a84\"}, {\"id\": \"9e1781f0-8e0d-558e-b12a-d151a77f65df\", \"text\": \"Patch modifies mypy\\'s indirection and nodes modules to improve type traversal and dependency tracking.\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"9e1781f0-8e0d-558e-b12a-d151a77f65df\"}, {\"id\": \"4525fa47-95fc-5410-b4f6-7623fbdeb758\", \"text\": \"PR and code diff summary for mypy repository changes\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"4525fa47-95fc-5410-b4f6-7623fbdeb758\"}, {\"id\": \"85b17306-ef76-56f0-a951-b00800c32964\", \"text\": \"Allow NoneType instantiation in mypy type checker\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"85b17306-ef76-56f0-a951-b00800c32964\"}, {\"id\": \"7e6e0d48-c611-5a52-ba69-eae566ea4762\", \"text\": \"Commit and doc changes relating to frame.f_locals behavior and TypeGuard support\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"7e6e0d48-c611-5a52-ba69-eae566ea4762\"}, {\"id\": \"7ccc2b1b-3079-5c9e-8844-ea83d2fe8ccb\", \"text\": \"Repository activity summary (mypy): recent commits modifying issue templates, adding crash report form, config env var handling, and reverting problematic changes.\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"7ccc2b1b-3079-5c9e-8844-ea83d2fe8ccb\"}];\\n var links = [{\"source\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:49\", \"source_node_id\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target_node_id\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"relationship_name\": \"contains\"}}, {\"source\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"target\": \"d072ba0f-e1a9-58bf-9974-e1802adc8134\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:49\", \"source_node_id\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"target_node_id\": \"d072ba0f-e1a9-58bf-9974-e1802adc8134\", \"relationship_name\": \"is_a\"}}, {\"source\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target\": \"5753ee74-d6f5-5407-86de-f5c1599d258a\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:49\", \"source_node_id\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target_node_id\": \"5753ee74-d6f5-5407-86de-f5c1599d258a\", \"relationship_name\": \"contains\"}}, {\"source\": \"5753ee74-d6f5-5407-86de-f5c1599d258a\", \"target\": \"ad9dd386-60ea-5204-9bd7-0a4861b87c02\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:49\", \"source_node_id\": \"5753ee74-d6f5-5407-86de-f5c1599d258a\", \"target_node_id\": \"ad9dd386-60ea-5204-9bd7-0a4861b87c02\", \"relationship_name\": \"is_a\"}}, {\"source\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target\": \"4b0ecca4-7e42-5c18-8050-aff051d48f74\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:49\", \"source_node_id\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target_node_id\": \"4b0ecca4-7e42-5c18-8050-aff051d48f74\", \"relationship_name\": \"contains\"}}, {\"source\": \"4b0ecca4-7e42-5c18-8050-aff051d48f74\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:49\", \"source_node_id\": \"4b0ecca4-7e42-5c18-8050-aff051d48f74\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target\": \"61806582-543f-5a98-a5a3-b30e368340ef\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:49\", \"source_node_id\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target_node_id\": \"61806582-543f-5a98-a5a3-b30e368340ef\", \"relationship_name\": \"contains\"}}, {\"source\": \"61806582-543f-5a98-a5a3-b30e368340ef\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:49\", \"source_node_id\": \"61806582-543f-5a98-a5a3-b30e368340ef\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target\": \"23113263-f417-5426-9189-018203405fbb\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:49\", \"source_node_id\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target_node_id\": \"23113263-f417-5426-9189-018203405fbb\", \"relationship_name\": \"contains\"}}, {\"source\": \"23113263-f417-5426-9189-018203405fbb\", \"target\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:49\", \"source_node_id\": \"23113263-f417-5426-9189-018203405fbb\", \"target_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relationship_name\": \"is_a\"}}, {\"source\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target\": \"8ac1709a-a832-5711-96c4-919d41496af8\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:49\", \"source_node_id\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"target_node_id\": \"8ac1709a-a832-5711-96c4-919d41496af8\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"target\": \"4b0ecca4-7e42-5c18-8050-aff051d48f74\", \"relation\": \"reviews_before_merge\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"ontology_valid\": false, \"target_node_id\": \"4b0ecca4-7e42-5c18-8050-aff051d48f74\", \"relationship_name\": \"reviews_before_merge\"}}, {\"source\": \"4b0ecca4-7e42-5c18-8050-aff051d48f74\", \"target\": \"5753ee74-d6f5-5407-86de-f5c1599d258a\", \"relation\": \"merged_into\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"4b0ecca4-7e42-5c18-8050-aff051d48f74\", \"ontology_valid\": false, \"target_node_id\": \"5753ee74-d6f5-5407-86de-f5c1599d258a\", \"relationship_name\": \"merged_into\"}}, {\"source\": \"61806582-543f-5a98-a5a3-b30e368340ef\", \"target\": \"23113263-f417-5426-9189-018203405fbb\", \"relation\": \"should_not_happen_on\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"61806582-543f-5a98-a5a3-b30e368340ef\", \"ontology_valid\": false, \"target_node_id\": \"23113263-f417-5426-9189-018203405fbb\", \"relationship_name\": \"should_not_happen_on\"}}, {\"source\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target\": \"b8b946ea-31d8-5bb2-b7d7-0e5a60d0847a\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target_node_id\": \"b8b946ea-31d8-5bb2-b7d7-0e5a60d0847a\", \"relationship_name\": \"contains\"}}, {\"source\": \"b8b946ea-31d8-5bb2-b7d7-0e5a60d0847a\", \"target\": \"3aa74625-a00e-58c7-bb81-4c38b9e4a8c5\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"b8b946ea-31d8-5bb2-b7d7-0e5a60d0847a\", \"target_node_id\": \"3aa74625-a00e-58c7-bb81-4c38b9e4a8c5\", \"relationship_name\": \"is_a\"}}, {\"source\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target\": \"e2a6bacf-7da5-513f-895c-60ea96744d57\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target_node_id\": \"e2a6bacf-7da5-513f-895c-60ea96744d57\", \"relationship_name\": \"contains\"}}, {\"source\": \"e2a6bacf-7da5-513f-895c-60ea96744d57\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"e2a6bacf-7da5-513f-895c-60ea96744d57\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target\": \"57287794-d03b-5f3e-ada7-f4e69f6676d5\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target_node_id\": \"57287794-d03b-5f3e-ada7-f4e69f6676d5\", \"relationship_name\": \"contains\"}}, {\"source\": \"57287794-d03b-5f3e-ada7-f4e69f6676d5\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"57287794-d03b-5f3e-ada7-f4e69f6676d5\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target\": \"5924ba28-aa89-534c-b5d6-0974e2194089\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target_node_id\": \"5924ba28-aa89-534c-b5d6-0974e2194089\", \"relationship_name\": \"contains\"}}, {\"source\": \"5924ba28-aa89-534c-b5d6-0974e2194089\", \"target\": \"5eac68d6-95a0-5a10-819a-26aad1d9006a\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"5924ba28-aa89-534c-b5d6-0974e2194089\", \"target_node_id\": \"5eac68d6-95a0-5a10-819a-26aad1d9006a\", \"relationship_name\": \"is_a\"}}, {\"source\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target\": \"a7782fe0-b311-5e8c-b9de-7eba4657e00d\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target_node_id\": \"a7782fe0-b311-5e8c-b9de-7eba4657e00d\", \"relationship_name\": \"contains\"}}, {\"source\": \"a7782fe0-b311-5e8c-b9de-7eba4657e00d\", \"target\": \"4d0ff2f4-8a28-5c14-a533-dc8e018aa46c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"a7782fe0-b311-5e8c-b9de-7eba4657e00d\", \"target_node_id\": \"4d0ff2f4-8a28-5c14-a533-dc8e018aa46c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target_node_id\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"relationship_name\": \"contains\"}}, {\"source\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target\": \"b37a7e7f-38ca-54be-9270-f7f44e13e2b9\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target_node_id\": \"b37a7e7f-38ca-54be-9270-f7f44e13e2b9\", \"relationship_name\": \"contains\"}}, {\"source\": \"b37a7e7f-38ca-54be-9270-f7f44e13e2b9\", \"target\": \"006be3b7-a897-55bc-bb5f-efa02318dcf9\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"b37a7e7f-38ca-54be-9270-f7f44e13e2b9\", \"target_node_id\": \"006be3b7-a897-55bc-bb5f-efa02318dcf9\", \"relationship_name\": \"is_a\"}}, {\"source\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target\": \"b6300805-a086-5562-a7a5-8cdda7d0849c\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:52\", \"source_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"target_node_id\": \"b6300805-a086-5562-a7a5-8cdda7d0849c\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"b8b946ea-31d8-5bb2-b7d7-0e5a60d0847a\", \"target\": \"e2a6bacf-7da5-513f-895c-60ea96744d57\", \"relation\": \"requires\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"b8b946ea-31d8-5bb2-b7d7-0e5a60d0847a\", \"ontology_valid\": false, \"target_node_id\": \"e2a6bacf-7da5-513f-895c-60ea96744d57\", \"relationship_name\": \"requires\"}}, {\"source\": \"b8b946ea-31d8-5bb2-b7d7-0e5a60d0847a\", \"target\": \"57287794-d03b-5f3e-ada7-f4e69f6676d5\", \"relation\": \"encourages\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"b8b946ea-31d8-5bb2-b7d7-0e5a60d0847a\", \"ontology_valid\": false, \"target_node_id\": \"57287794-d03b-5f3e-ada7-f4e69f6676d5\", \"relationship_name\": \"encourages\"}}, {\"source\": \"5924ba28-aa89-534c-b5d6-0974e2194089\", \"target\": \"57287794-d03b-5f3e-ada7-f4e69f6676d5\", \"relation\": \"applies_to\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"5924ba28-aa89-534c-b5d6-0974e2194089\", \"ontology_valid\": false, \"target_node_id\": \"57287794-d03b-5f3e-ada7-f4e69f6676d5\", \"relationship_name\": \"applies_to\"}}, {\"source\": \"a7782fe0-b311-5e8c-b9de-7eba4657e00d\", \"target\": \"b8b946ea-31d8-5bb2-b7d7-0e5a60d0847a\", \"relation\": \"supports\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"a7782fe0-b311-5e8c-b9de-7eba4657e00d\", \"ontology_valid\": false, \"target_node_id\": \"b8b946ea-31d8-5bb2-b7d7-0e5a60d0847a\", \"relationship_name\": \"supports\"}}, {\"source\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"target\": \"a7782fe0-b311-5e8c-b9de-7eba4657e00d\", \"relation\": \"reviews\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"ontology_valid\": false, \"target_node_id\": \"a7782fe0-b311-5e8c-b9de-7eba4657e00d\", \"relationship_name\": \"reviews\"}}, {\"source\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"target\": \"b37a7e7f-38ca-54be-9270-f7f44e13e2b9\", \"relation\": \"enforces\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"aae11f99-f6df-5a1e-9d42-dfab80d5f517\", \"ontology_valid\": false, \"target_node_id\": \"b37a7e7f-38ca-54be-9270-f7f44e13e2b9\", \"relationship_name\": \"enforces\"}}, {\"source\": \"56e24564-89ba-5b01-a2a0-8901f1a6293f\", \"target\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:55\", \"source_node_id\": \"56e24564-89ba-5b01-a2a0-8901f1a6293f\", \"target_node_id\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"relationship_name\": \"made_from\"}}, {\"source\": \"b1b53420-5e54-501f-987a-c04bb5cf9eef\", \"target\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:54:58\", \"source_node_id\": \"b1b53420-5e54-501f-987a-c04bb5cf9eef\", \"target_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relationship_name\": \"made_from\"}}, {\"source\": \"11111111-1111-1111-1111-111111111111\", \"target\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:55:07\", \"source_node_id\": \"11111111-1111-1111-1111-111111111111\", \"target_node_id\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"22222222-2222-2222-2222-222222222222\", \"target\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:55:07\", \"source_node_id\": \"22222222-2222-2222-2222-222222222222\", \"target_node_id\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"33333333-3333-3333-3333-333333333333\", \"target\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:55:07\", \"source_node_id\": \"33333333-3333-3333-3333-333333333333\", \"target_node_id\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"11111111-1111-1111-1111-111111111111\", \"target\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"relation\": \"rule_associated_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"11111111-1111-1111-1111-111111111111\", \"ontology_valid\": false, \"target_node_id\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"relationship_name\": \"rule_associated_from\"}}, {\"source\": \"22222222-2222-2222-2222-222222222222\", \"target\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"relation\": \"rule_associated_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"22222222-2222-2222-2222-222222222222\", \"ontology_valid\": false, \"target_node_id\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"relationship_name\": \"rule_associated_from\"}}, {\"source\": \"33333333-3333-3333-3333-333333333333\", \"target\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"relation\": \"rule_associated_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"33333333-3333-3333-3333-333333333333\", \"ontology_valid\": false, \"target_node_id\": \"70f3e98c-8a4b-5954-8c5d-ca9bcd744325\", \"relationship_name\": \"rule_associated_from\"}}, {\"source\": \"d1a9e2b3-0000-4c4d-8b2a-abcdef012345\", \"target\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:55:23\", \"source_node_id\": \"d1a9e2b3-0000-4c4d-8b2a-abcdef012345\", \"target_node_id\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"e2b3f4c5-0000-4d4e-9c3b-abcdef678901\", \"target\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:55:23\", \"source_node_id\": \"e2b3f4c5-0000-4d4e-9c3b-abcdef678901\", \"target_node_id\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"f3c4d5e6-0000-4e5f-ac4d-abcdef234567\", \"target\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:55:23\", \"source_node_id\": \"f3c4d5e6-0000-4e5f-ac4d-abcdef234567\", \"target_node_id\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"a4d5e6f7-0000-4f6a-bd5e-abcdef345678\", \"target\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:55:23\", \"source_node_id\": \"a4d5e6f7-0000-4f6a-bd5e-abcdef345678\", \"target_node_id\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b5e6f7a8-0000-4a7b-cd6f-abcdef456789\", \"target\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:55:23\", \"source_node_id\": \"b5e6f7a8-0000-4a7b-cd6f-abcdef456789\", \"target_node_id\": \"13d848d5-c0f3-523a-a9d3-3f0c53519a23\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"d1a9e2b3-0000-4c4d-8b2a-abcdef012345\", \"target\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relation\": \"rule_associated_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"d1a9e2b3-0000-4c4d-8b2a-abcdef012345\", \"ontology_valid\": false, \"target_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relationship_name\": \"rule_associated_from\"}}, {\"source\": \"e2b3f4c5-0000-4d4e-9c3b-abcdef678901\", \"target\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relation\": \"rule_associated_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"e2b3f4c5-0000-4d4e-9c3b-abcdef678901\", \"ontology_valid\": false, \"target_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relationship_name\": \"rule_associated_from\"}}, {\"source\": \"f3c4d5e6-0000-4e5f-ac4d-abcdef234567\", \"target\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relation\": \"rule_associated_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"f3c4d5e6-0000-4e5f-ac4d-abcdef234567\", \"ontology_valid\": false, \"target_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relationship_name\": \"rule_associated_from\"}}, {\"source\": \"a4d5e6f7-0000-4f6a-bd5e-abcdef345678\", \"target\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relation\": \"rule_associated_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"a4d5e6f7-0000-4f6a-bd5e-abcdef345678\", \"ontology_valid\": false, \"target_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relationship_name\": \"rule_associated_from\"}}, {\"source\": \"b5e6f7a8-0000-4a7b-cd6f-abcdef456789\", \"target\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relation\": \"rule_associated_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"b5e6f7a8-0000-4a7b-cd6f-abcdef456789\", \"ontology_valid\": false, \"target_node_id\": \"14a4cea5-399d-56ee-87ca-05137b72ba32\", \"relationship_name\": \"rule_associated_from\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"relationship_name\": \"contains\"}}, {\"source\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"target\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"target_node_id\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relationship_name\": \"is_a\"}}, {\"source\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relationship_name\": \"contains\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"0a95583a-244a-596f-b60a-fe3d9307e7ea\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target_node_id\": \"0a95583a-244a-596f-b60a-fe3d9307e7ea\", \"relationship_name\": \"is_a\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"relationship_name\": \"contains\"}}, {\"source\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"2f1666ba-5553-52fe-b0da-560a43f3e131\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"2f1666ba-5553-52fe-b0da-560a43f3e131\", \"relationship_name\": \"contains\"}}, {\"source\": \"2f1666ba-5553-52fe-b0da-560a43f3e131\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"2f1666ba-5553-52fe-b0da-560a43f3e131\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"2f1666ba-5553-52fe-b0da-560a43f3e131\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"2f1666ba-5553-52fe-b0da-560a43f3e131\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"3dbe696b-03af-56d4-a61b-16fbc0d30ee8\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"3dbe696b-03af-56d4-a61b-16fbc0d30ee8\", \"relationship_name\": \"contains\"}}, {\"source\": \"3dbe696b-03af-56d4-a61b-16fbc0d30ee8\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"3dbe696b-03af-56d4-a61b-16fbc0d30ee8\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"3dbe696b-03af-56d4-a61b-16fbc0d30ee8\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"3dbe696b-03af-56d4-a61b-16fbc0d30ee8\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"0c0f550d-f630-54c3-9d23-bc5ae28bf39b\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"0c0f550d-f630-54c3-9d23-bc5ae28bf39b\", \"relationship_name\": \"contains\"}}, {\"source\": \"0c0f550d-f630-54c3-9d23-bc5ae28bf39b\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0c0f550d-f630-54c3-9d23-bc5ae28bf39b\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"0c0f550d-f630-54c3-9d23-bc5ae28bf39b\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0c0f550d-f630-54c3-9d23-bc5ae28bf39b\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"relationship_name\": \"contains\"}}, {\"source\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"target\": \"9e295ef4-1c4e-5509-a47f-65c0c508282f\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"target_node_id\": \"9e295ef4-1c4e-5509-a47f-65c0c508282f\", \"relationship_name\": \"is_a\"}}, {\"source\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"efcde15b-056f-5dd1-8ce0-f05dfdf6227a\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"efcde15b-056f-5dd1-8ce0-f05dfdf6227a\", \"relationship_name\": \"contains\"}}, {\"source\": \"efcde15b-056f-5dd1-8ce0-f05dfdf6227a\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"efcde15b-056f-5dd1-8ce0-f05dfdf6227a\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"efcde15b-056f-5dd1-8ce0-f05dfdf6227a\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"efcde15b-056f-5dd1-8ce0-f05dfdf6227a\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relationship_name\": \"contains\"}}, {\"source\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"target\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"target_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relationship_name\": \"is_a\"}}, {\"source\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"1954e7fd-eaac-5121-a674-ce501cd1c2a1\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"1954e7fd-eaac-5121-a674-ce501cd1c2a1\", \"relationship_name\": \"contains\"}}, {\"source\": \"1954e7fd-eaac-5121-a674-ce501cd1c2a1\", \"target\": \"a5b7efe7-e02c-505a-9dd8-3f0643bacfb9\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"1954e7fd-eaac-5121-a674-ce501cd1c2a1\", \"target_node_id\": \"a5b7efe7-e02c-505a-9dd8-3f0643bacfb9\", \"relationship_name\": \"is_a\"}}, {\"source\": \"1954e7fd-eaac-5121-a674-ce501cd1c2a1\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"1954e7fd-eaac-5121-a674-ce501cd1c2a1\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"target_node_id\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"addd6b56-6213-5c40-8fc3-5f0a98b441db\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"addd6b56-6213-5c40-8fc3-5f0a98b441db\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"addd6b56-6213-5c40-8fc3-5f0a98b441db\", \"target\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"addd6b56-6213-5c40-8fc3-5f0a98b441db\", \"target_node_id\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"ebd95cd5-52e5-5662-99a4-a0c13ff921b4\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"ebd95cd5-52e5-5662-99a4-a0c13ff921b4\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"ebd95cd5-52e5-5662-99a4-a0c13ff921b4\", \"target\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"ebd95cd5-52e5-5662-99a4-a0c13ff921b4\", \"target_node_id\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"relationship_name\": \"contains\"}}, {\"source\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target_node_id\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relationship_name\": \"is_a\"}}, {\"source\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"relationship_name\": \"contains\"}}, {\"source\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"target\": \"54c17410-0d01-5596-be63-17324d8dc8f5\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"target_node_id\": \"54c17410-0d01-5596-be63-17324d8dc8f5\", \"relationship_name\": \"is_a\"}}, {\"source\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"9fe70bdc-8d0b-5a8b-bd90-9d47b04ac07d\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"9fe70bdc-8d0b-5a8b-bd90-9d47b04ac07d\", \"relationship_name\": \"contains\"}}, {\"source\": \"9fe70bdc-8d0b-5a8b-bd90-9d47b04ac07d\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"9fe70bdc-8d0b-5a8b-bd90-9d47b04ac07d\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"9fe70bdc-8d0b-5a8b-bd90-9d47b04ac07d\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"9fe70bdc-8d0b-5a8b-bd90-9d47b04ac07d\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"4fe3883e-98b1-510a-923a-cac7ef417bdf\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"4fe3883e-98b1-510a-923a-cac7ef417bdf\", \"relationship_name\": \"contains\"}}, {\"source\": \"4fe3883e-98b1-510a-923a-cac7ef417bdf\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"4fe3883e-98b1-510a-923a-cac7ef417bdf\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"4fe3883e-98b1-510a-923a-cac7ef417bdf\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"4fe3883e-98b1-510a-923a-cac7ef417bdf\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"relationship_name\": \"contains\"}}, {\"source\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"target\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"target_node_id\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relationship_name\": \"is_a\"}}, {\"source\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"2e66282b-1261-5065-9715-1bf26a8b3da9\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"2e66282b-1261-5065-9715-1bf26a8b3da9\", \"relationship_name\": \"contains\"}}, {\"source\": \"2e66282b-1261-5065-9715-1bf26a8b3da9\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"2e66282b-1261-5065-9715-1bf26a8b3da9\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"2e66282b-1261-5065-9715-1bf26a8b3da9\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"2e66282b-1261-5065-9715-1bf26a8b3da9\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"8b5669e3-058a-598e-b76a-67834c61ea3e\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"8b5669e3-058a-598e-b76a-67834c61ea3e\", \"relationship_name\": \"contains\"}}, {\"source\": \"8b5669e3-058a-598e-b76a-67834c61ea3e\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"8b5669e3-058a-598e-b76a-67834c61ea3e\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"8b5669e3-058a-598e-b76a-67834c61ea3e\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"8b5669e3-058a-598e-b76a-67834c61ea3e\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"ae8941fd-eb11-565a-b1bd-92adaf3ca2d8\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"ae8941fd-eb11-565a-b1bd-92adaf3ca2d8\", \"relationship_name\": \"contains\"}}, {\"source\": \"ae8941fd-eb11-565a-b1bd-92adaf3ca2d8\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"ae8941fd-eb11-565a-b1bd-92adaf3ca2d8\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"ae8941fd-eb11-565a-b1bd-92adaf3ca2d8\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"ae8941fd-eb11-565a-b1bd-92adaf3ca2d8\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"712b43bb-4f51-5305-b915-c26ed62f0bf4\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"712b43bb-4f51-5305-b915-c26ed62f0bf4\", \"relationship_name\": \"contains\"}}, {\"source\": \"712b43bb-4f51-5305-b915-c26ed62f0bf4\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"712b43bb-4f51-5305-b915-c26ed62f0bf4\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"712b43bb-4f51-5305-b915-c26ed62f0bf4\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"712b43bb-4f51-5305-b915-c26ed62f0bf4\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"a694bb5a-967d-5f0c-a35f-ffe06a311cac\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"a694bb5a-967d-5f0c-a35f-ffe06a311cac\", \"relationship_name\": \"contains\"}}, {\"source\": \"a694bb5a-967d-5f0c-a35f-ffe06a311cac\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"a694bb5a-967d-5f0c-a35f-ffe06a311cac\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"a694bb5a-967d-5f0c-a35f-ffe06a311cac\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"a694bb5a-967d-5f0c-a35f-ffe06a311cac\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"target_node_id\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target_node_id\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"relationship_name\": \"contains\"}}, {\"source\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"target\": \"54c17410-0d01-5596-be63-17324d8dc8f5\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"target_node_id\": \"54c17410-0d01-5596-be63-17324d8dc8f5\", \"relationship_name\": \"is_a\"}}, {\"source\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target_node_id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"relationship_name\": \"contains\"}}, {\"source\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target\": \"4e2eb148-afe3-59c3-b4ed-171966e16ac4\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target_node_id\": \"4e2eb148-afe3-59c3-b4ed-171966e16ac4\", \"relationship_name\": \"contains\"}}, {\"source\": \"4e2eb148-afe3-59c3-b4ed-171966e16ac4\", \"target\": \"9d2f4a61-7b81-5539-aef2-6bf677b5229e\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"4e2eb148-afe3-59c3-b4ed-171966e16ac4\", \"target_node_id\": \"9d2f4a61-7b81-5539-aef2-6bf677b5229e\", \"relationship_name\": \"is_a\"}}, {\"source\": \"4e2eb148-afe3-59c3-b4ed-171966e16ac4\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"4e2eb148-afe3-59c3-b4ed-171966e16ac4\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target_node_id\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"relationship_name\": \"contains\"}}, {\"source\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target\": \"fb723c4d-3d29-5885-b7db-8f01dbaeeaae\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target_node_id\": \"fb723c4d-3d29-5885-b7db-8f01dbaeeaae\", \"relationship_name\": \"contains\"}}, {\"source\": \"fb723c4d-3d29-5885-b7db-8f01dbaeeaae\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"fb723c4d-3d29-5885-b7db-8f01dbaeeaae\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"fb723c4d-3d29-5885-b7db-8f01dbaeeaae\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"fb723c4d-3d29-5885-b7db-8f01dbaeeaae\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target_node_id\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"relationship_name\": \"contains\"}}, {\"source\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target_node_id\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"relationship_name\": \"contains\"}}, {\"source\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"target\": \"c173fcdb-8139-5426-b0b1-dd5013704063\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"target_node_id\": \"c173fcdb-8139-5426-b0b1-dd5013704063\", \"relationship_name\": \"is_a\"}}, {\"source\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target\": \"d224b849-330b-5ece-9acf-e3b79816abf3\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target_node_id\": \"d224b849-330b-5ece-9acf-e3b79816abf3\", \"relationship_name\": \"contains\"}}, {\"source\": \"d224b849-330b-5ece-9acf-e3b79816abf3\", \"target\": \"c173fcdb-8139-5426-b0b1-dd5013704063\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"d224b849-330b-5ece-9acf-e3b79816abf3\", \"target_node_id\": \"c173fcdb-8139-5426-b0b1-dd5013704063\", \"relationship_name\": \"is_a\"}}, {\"source\": \"d224b849-330b-5ece-9acf-e3b79816abf3\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"d224b849-330b-5ece-9acf-e3b79816abf3\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target_node_id\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"relationship_name\": \"contains\"}}, {\"source\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"target\": \"c173fcdb-8139-5426-b0b1-dd5013704063\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"target_node_id\": \"c173fcdb-8139-5426-b0b1-dd5013704063\", \"relationship_name\": \"is_a\"}}, {\"source\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"target_node_id\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"4a6b97ed-0c1f-5c06-91be-8f807b2acd89\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"4a6b97ed-0c1f-5c06-91be-8f807b2acd89\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"4a6b97ed-0c1f-5c06-91be-8f807b2acd89\", \"target\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:57:53\", \"source_node_id\": \"4a6b97ed-0c1f-5c06-91be-8f807b2acd89\", \"target_node_id\": \"4e5aec6b-3b33-5983-b044-3f8b5dee95a8\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"target\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relation\": \"targets_repository\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"ontology_valid\": false, \"target_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relationship_name\": \"targets_repository\"}}, {\"source\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"target\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"relation\": \"modifies\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"ontology_valid\": false, \"target_node_id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"relationship_name\": \"modifies\"}}, {\"source\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"target\": \"2f1666ba-5553-52fe-b0da-560a43f3e131\", \"relation\": \"includes_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"ontology_valid\": false, \"target_node_id\": \"2f1666ba-5553-52fe-b0da-560a43f3e131\", \"relationship_name\": \"includes_file\"}}, {\"source\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"target\": \"3dbe696b-03af-56d4-a61b-16fbc0d30ee8\", \"relation\": \"includes_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"ontology_valid\": false, \"target_node_id\": \"3dbe696b-03af-56d4-a61b-16fbc0d30ee8\", \"relationship_name\": \"includes_file\"}}, {\"source\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"target\": \"0c0f550d-f630-54c3-9d23-bc5ae28bf39b\", \"relation\": \"includes_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"ontology_valid\": false, \"target_node_id\": \"0c0f550d-f630-54c3-9d23-bc5ae28bf39b\", \"relationship_name\": \"includes_file\"}}, {\"source\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"target\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"relation\": \"updates\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"ontology_valid\": false, \"target_node_id\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"relationship_name\": \"updates\"}}, {\"source\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"target\": \"efcde15b-056f-5dd1-8ce0-f05dfdf6227a\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"ontology_valid\": false, \"target_node_id\": \"efcde15b-056f-5dd1-8ce0-f05dfdf6227a\", \"relationship_name\": \"contains\"}}, {\"source\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"target\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relation\": \"created_on\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"ontology_valid\": false, \"target_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relationship_name\": \"created_on\"}}, {\"source\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"target\": \"1954e7fd-eaac-5121-a674-ce501cd1c2a1\", \"relation\": \"has_identifier\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"9d9cdb2b-670d-500b-9a0c-7cafa604cda9\", \"ontology_valid\": false, \"target_node_id\": \"1954e7fd-eaac-5121-a674-ce501cd1c2a1\", \"relationship_name\": \"has_identifier\"}}, {\"source\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"relation\": \"addresses_issue\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"ontology_valid\": false, \"target_node_id\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"relationship_name\": \"addresses_issue\"}}, {\"source\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target\": \"9fe70bdc-8d0b-5a8b-bd90-9d47b04ac07d\", \"relation\": \"modifies_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"ontology_valid\": false, \"target_node_id\": \"9fe70bdc-8d0b-5a8b-bd90-9d47b04ac07d\", \"relationship_name\": \"modifies_file\"}}, {\"source\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target\": \"4fe3883e-98b1-510a-923a-cac7ef417bdf\", \"relation\": \"adds_test\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"ontology_valid\": false, \"target_node_id\": \"4fe3883e-98b1-510a-923a-cac7ef417bdf\", \"relationship_name\": \"adds_test\"}}, {\"source\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"target\": \"9fe70bdc-8d0b-5a8b-bd90-9d47b04ac07d\", \"relation\": \"unrelated_but_same_repo\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"ontology_valid\": false, \"target_node_id\": \"9fe70bdc-8d0b-5a8b-bd90-9d47b04ac07d\", \"relationship_name\": \"unrelated_but_same_repo\"}}, {\"source\": \"2e66282b-1261-5065-9715-1bf26a8b3da9\", \"target\": \"a694bb5a-967d-5f0c-a35f-ffe06a311cac\", \"relation\": \"related_topic_asyncio\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"2e66282b-1261-5065-9715-1bf26a8b3da9\", \"ontology_valid\": false, \"target_node_id\": \"a694bb5a-967d-5f0c-a35f-ffe06a311cac\", \"relationship_name\": \"related_topic_asyncio\"}}, {\"source\": \"8b5669e3-058a-598e-b76a-67834c61ea3e\", \"target\": \"ae8941fd-eb11-565a-b1bd-92adaf3ca2d8\", \"relation\": \"both_modify_codeowners\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"8b5669e3-058a-598e-b76a-67834c61ea3e\", \"ontology_valid\": false, \"target_node_id\": \"ae8941fd-eb11-565a-b1bd-92adaf3ca2d8\", \"relationship_name\": \"both_modify_codeowners\"}}, {\"source\": \"712b43bb-4f51-5305-b915-c26ed62f0bf4\", \"target\": \"a694bb5a-967d-5f0c-a35f-ffe06a311cac\", \"relation\": \"core_change_documentation\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"712b43bb-4f51-5305-b915-c26ed62f0bf4\", \"ontology_valid\": false, \"target_node_id\": \"a694bb5a-967d-5f0c-a35f-ffe06a311cac\", \"relationship_name\": \"core_change_documentation\"}}, {\"source\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target\": \"4e2eb148-afe3-59c3-b4ed-171966e16ac4\", \"relation\": \"in_repository\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"ontology_valid\": false, \"target_node_id\": \"4e2eb148-afe3-59c3-b4ed-171966e16ac4\", \"relationship_name\": \"in_repository\"}}, {\"source\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"relation\": \"modifies_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"ontology_valid\": false, \"target_node_id\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"relationship_name\": \"modifies_file\"}}, {\"source\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target\": \"fb723c4d-3d29-5885-b7db-8f01dbaeeaae\", \"relation\": \"modifies_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"ontology_valid\": false, \"target_node_id\": \"fb723c4d-3d29-5885-b7db-8f01dbaeeaae\", \"relationship_name\": \"modifies_file\"}}, {\"source\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"relation\": \"references_issue\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"ontology_valid\": false, \"target_node_id\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"relationship_name\": \"references_issue\"}}, {\"source\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"target\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"relation\": \"mentions_pep\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"ontology_valid\": false, \"target_node_id\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"relationship_name\": \"mentions_pep\"}}, {\"source\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"target\": \"d224b849-330b-5ece-9acf-e3b79816abf3\", \"relation\": \"mentions_pep\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"ontology_valid\": false, \"target_node_id\": \"d224b849-330b-5ece-9acf-e3b79816abf3\", \"relationship_name\": \"mentions_pep\"}}, {\"source\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"target\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"relation\": \"implements_pep\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"ontology_valid\": false, \"target_node_id\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"relationship_name\": \"implements_pep\"}}, {\"source\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"target\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"relation\": \"self\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"ontology_valid\": false, \"target_node_id\": \"5baea20c-df64-516e-aac4-d0ea636bf446\", \"relationship_name\": \"self\"}}, {\"source\": \"dafe2f00-e77c-5b0b-be9b-fa76ffe08a84\", \"target\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:58:02\", \"source_node_id\": \"dafe2f00-e77c-5b0b-be9b-fa76ffe08a84\", \"target_node_id\": \"0cd8c4cd-2e57-562e-9184-1ce553b95f8e\", \"relationship_name\": \"made_from\"}}, {\"source\": \"9e1781f0-8e0d-558e-b12a-d151a77f65df\", \"target\": \"addd6b56-6213-5c40-8fc3-5f0a98b441db\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:58:02\", \"source_node_id\": \"9e1781f0-8e0d-558e-b12a-d151a77f65df\", \"target_node_id\": \"addd6b56-6213-5c40-8fc3-5f0a98b441db\", \"relationship_name\": \"made_from\"}}, {\"source\": \"4525fa47-95fc-5410-b4f6-7623fbdeb758\", \"target\": \"ebd95cd5-52e5-5662-99a4-a0c13ff921b4\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:58:02\", \"source_node_id\": \"4525fa47-95fc-5410-b4f6-7623fbdeb758\", \"target_node_id\": \"ebd95cd5-52e5-5662-99a4-a0c13ff921b4\", \"relationship_name\": \"made_from\"}}, {\"source\": \"85b17306-ef76-56f0-a951-b00800c32964\", \"target\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:58:02\", \"source_node_id\": \"85b17306-ef76-56f0-a951-b00800c32964\", \"target_node_id\": \"b499402e-a501-52b8-954a-6571ddd727f9\", \"relationship_name\": \"made_from\"}}, {\"source\": \"7e6e0d48-c611-5a52-ba69-eae566ea4762\", \"target\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:58:02\", \"source_node_id\": \"7e6e0d48-c611-5a52-ba69-eae566ea4762\", \"target_node_id\": \"73477942-79cd-59bb-90bc-2e6798ff9431\", \"relationship_name\": \"made_from\"}}, {\"source\": \"7ccc2b1b-3079-5c9e-8844-ea83d2fe8ccb\", \"target\": \"4a6b97ed-0c1f-5c06-91be-8f807b2acd89\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 09:58:02\", \"source_node_id\": \"7ccc2b1b-3079-5c9e-8844-ea83d2fe8ccb\", \"target_node_id\": \"4a6b97ed-0c1f-5c06-91be-8f807b2acd89\", \"relationship_name\": \"made_from\"}}];\\n\\n var svg = d3.select(\"svg\"),\\n width = window.innerWidth,\\n height = window.innerHeight;\\n\\n var container = svg.append(\"g\");\\n var tooltip = d3.select(\"#tooltip\");\\n\\n var simulation = d3.forceSimulation(nodes)\\n .force(\"link\", d3.forceLink(links).id(d => d.id).strength(0.1))\\n .force(\"charge\", d3.forceManyBody().strength(-275))\\n .force(\"center\", d3.forceCenter(width / 2, height / 2))\\n .force(\"x\", d3.forceX().strength(0.1).x(width / 2))\\n .force(\"y\", d3.forceY().strength(0.1).y(height / 2));\\n\\n var link = container.append(\"g\")\\n .attr(\"class\", \"links\")\\n .selectAll(\"line\")\\n .data(links)\\n .enter().append(\"line\")\\n .attr(\"stroke-width\", d => {\\n if (d.weight) return Math.max(2, d.weight * 5);\\n if (d.all_weights && Object.keys(d.all_weights).length > 0) {\\n var avgWeight = Object.values(d.all_weights).reduce((a, b) => a + b, 0) / Object.values(d.all_weights).length;\\n return Math.max(2, avgWeight * 5);\\n }\\n return 2;\\n })\\n .attr(\"class\", d => {\\n if (d.all_weights && Object.keys(d.all_weights).length > 1) return \"multi-weighted\";\\n if (d.weight || (d.all_weights && Object.keys(d.all_weights).length > 0)) return \"weighted\";\\n return \"\";\\n })\\n .on(\"mouseover\", function(d) {\\n // Create tooltip content for edge\\n var content = \"<strong>Edge Information</strong><br/>\";\\n content += \"Relationship: \" + d.relation + \"<br/>\";\\n \\n // Show all weights\\n if (d.all_weights && Object.keys(d.all_weights).length > 0) {\\n content += \"<strong>Weights:</strong><br/>\";\\n Object.keys(d.all_weights).forEach(function(weightName) {\\n content += \"&nbsp;&nbsp;\" + weightName + \": \" + d.all_weights[weightName] + \"<br/>\";\\n });\\n } else if (d.weight !== null && d.weight !== undefined) {\\n content += \"Weight: \" + d.weight + \"<br/>\";\\n }\\n \\n if (d.relationship_type) {\\n content += \"Type: \" + d.relationship_type + \"<br/>\";\\n }\\n \\n // Add other edge properties\\n if (d.edge_info) {\\n Object.keys(d.edge_info).forEach(function(key) {\\n if (key !== \\'weight\\' && key !== \\'weights\\' && key !== \\'relationship_type\\' && \\n key !== \\'source_node_id\\' && key !== \\'target_node_id\\' && \\n key !== \\'relationship_name\\' && key !== \\'updated_at\\' && \\n !key.startsWith(\\'weight_\\')) {\\n content += key + \": \" + d.edge_info[key] + \"<br/>\";\\n }\\n });\\n }\\n \\n tooltip.html(content)\\n .style(\"left\", (d3.event.pageX + 10) + \"px\")\\n .style(\"top\", (d3.event.pageY - 10) + \"px\")\\n .style(\"opacity\", 1);\\n })\\n .on(\"mouseout\", function(d) {\\n tooltip.style(\"opacity\", 0);\\n });\\n\\n var edgeLabels = container.append(\"g\")\\n .attr(\"class\", \"edge-labels\")\\n .selectAll(\"text\")\\n .data(links)\\n .enter().append(\"text\")\\n .attr(\"class\", \"edge-label\")\\n .text(d => {\\n var label = d.relation;\\n if (d.all_weights && Object.keys(d.all_weights).length > 1) {\\n // Show count of weights for multiple weights\\n label += \" (\" + Object.keys(d.all_weights).length + \" weights)\";\\n } else if (d.weight) {\\n label += \" (\" + d.weight + \")\";\\n } else if (d.all_weights && Object.keys(d.all_weights).length === 1) {\\n var singleWeight = Object.values(d.all_weights)[0];\\n label += \" (\" + singleWeight + \")\";\\n }\\n return label;\\n });\\n\\n var nodeGroup = container.append(\"g\")\\n .attr(\"class\", \"nodes\")\\n .selectAll(\"g\")\\n .data(nodes)\\n .enter().append(\"g\");\\n\\n var node = nodeGroup.append(\"circle\")\\n .attr(\"r\", 13)\\n .attr(\"fill\", d => d.color)\\n .call(d3.drag()\\n .on(\"start\", dragstarted)\\n .on(\"drag\", dragged)\\n .on(\"end\", dragended));\\n\\n nodeGroup.append(\"text\")\\n .attr(\"class\", \"node-label\")\\n .attr(\"dy\", 4)\\n .attr(\"text-anchor\", \"middle\")\\n .text(d => d.name);\\n\\n node.append(\"title\").text(d => JSON.stringify(d));\\n\\n simulation.on(\"tick\", function() {\\n link.attr(\"x1\", d => d.source.x)\\n .attr(\"y1\", d => d.source.y)\\n .attr(\"x2\", d => d.target.x)\\n .attr(\"y2\", d => d.target.y);\\n\\n edgeLabels\\n .attr(\"x\", d => (d.source.x + d.target.x) / 2)\\n .attr(\"y\", d => (d.source.y + d.target.y) / 2 - 5);\\n\\n node.attr(\"cx\", d => d.x)\\n .attr(\"cy\", d => d.y);\\n\\n nodeGroup.select(\"text\")\\n .attr(\"x\", d => d.x)\\n .attr(\"y\", d => d.y)\\n .attr(\"dy\", 4)\\n .attr(\"text-anchor\", \"middle\");\\n });\\n\\n svg.call(d3.zoom().on(\"zoom\", function() {\\n container.attr(\"transform\", d3.event.transform);\\n }));\\n\\n function dragstarted(d) {\\n if (!d3.event.active) simulation.alphaTarget(0.3).restart();\\n d.fx = d.x;\\n d.fy = d.y;\\n }\\n\\n function dragged(d) {\\n d.fx = d3.event.x;\\n d.fy = d3.event.y;\\n }\\n\\n function dragended(d) {\\n if (!d3.event.active) simulation.alphaTarget(0);\\n d.fx = null;\\n d.fy = null;\\n }\\n\\n window.addEventListener(\"resize\", function() {\\n width = window.innerWidth;\\n height = window.innerHeight;\\n svg.attr(\"width\", width).attr(\"height\", height);\\n simulation.force(\"center\", d3.forceCenter(width / 2, height / 2));\\n simulation.alpha(1).restart();\\n });\\n </script>\\n\\n <svg style=\"position: fixed; bottom: 10px; right: 10px; width: 150px; height: auto; z-index: 9999;\" viewBox=\"0 0 158 44\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.7496 4.92654C7.83308 4.92654 4.8585 7.94279 4.8585 11.3612V14.9304C4.8585 18.3488 7.83308 21.3651 11.7496 21.3651C13.6831 21.3651 15.0217 20.8121 16.9551 19.3543C18.0458 18.5499 19.5331 18.8013 20.3263 19.9072C21.1195 21.0132 20.8717 22.5213 19.781 23.3257C17.3518 25.0851 15.0217 26.2414 11.7 26.2414C5.35425 26.2414 0 21.2646 0 14.9304V11.3612C0 4.97681 5.35425 0.0502739 11.7 0.0502739C15.0217 0.0502739 17.3518 1.2065 19.781 2.96598C20.8717 3.77032 21.1195 5.27843 20.3263 6.38439C19.5331 7.49035 18.0458 7.69144 16.9551 6.93737C15.0217 5.52979 13.6831 4.92654 11.7496 4.92654ZM35.5463 4.92654C31.7289 4.92654 28.6552 8.04333 28.6552 11.8639V14.478C28.6552 18.2986 31.7289 21.4154 35.5463 21.4154C39.3141 21.4154 42.3878 18.2986 42.3878 14.478V11.8639C42.3878 8.04333 39.3141 4.92654 35.5463 4.92654ZM23.7967 11.8639C23.7967 5.32871 29.0518 0 35.5463 0C42.0408 0 47.2463 5.32871 47.2463 11.8639V14.478C47.2463 21.0132 42.0408 26.3419 35.5463 26.3419C29.0518 26.3419 23.7967 21.0635 23.7967 14.478V11.8639ZM63.3091 5.07736C59.4917 5.07736 56.418 8.19415 56.418 12.0147C56.418 15.8353 59.4917 18.9521 63.3091 18.9521C67.1265 18.9521 70.1506 15.8856 70.1506 12.0147C70.1506 8.14388 67.0769 5.07736 63.3091 5.07736ZM51.5595 11.9645C51.5595 5.42925 56.8146 0.150814 63.3091 0.150814C66.0854 0.150814 68.5642 1.10596 70.5968 2.71463L72.4311 0.904876C73.3731 -0.0502693 74.9099 -0.0502693 75.8519 0.904876C76.7938 1.86002 76.7938 3.41841 75.8519 4.37356L73.7201 6.53521C74.5629 8.19414 75.0587 10.0542 75.0587 12.0147C75.0587 18.4997 69.8532 23.8284 63.3587 23.8284C63.3091 23.8284 63.2099 23.8284 63.1603 23.8284H58.0044C57.1616 23.8284 56.4675 24.5322 56.4675 25.3868C56.4675 26.2414 57.1616 26.9452 58.0044 26.9452H64.6476H66.7794C68.5146 26.9452 70.3489 27.4479 71.7866 28.6041C73.2739 29.8106 74.2159 31.5701 74.4142 33.7317C74.7116 37.6026 72.0345 40.2166 69.8532 41.0713L63.8048 43.7859C62.5654 44.3389 61.1277 43.7859 60.6319 42.5291C60.0866 41.2723 60.6319 39.8648 61.8714 39.3118L68.0188 36.5972C68.0684 36.5972 68.118 36.5469 68.1675 36.5469C68.4154 36.4463 68.8616 36.1447 69.2087 35.6923C69.5061 35.2398 69.7044 34.7371 69.6548 34.1339C69.6053 33.229 69.2582 32.7263 68.8616 32.4247C68.4154 32.0728 67.7214 31.8214 66.8786 31.8214H58.2027C58.1531 31.8214 58.1531 31.8214 58.1035 31.8214H58.054C54.534 31.8214 51.6586 28.956 51.6586 25.3868C51.6586 23.0743 52.8485 21.0635 54.6828 19.9072C52.6997 17.7959 51.5595 15.031 51.5595 11.9645ZM90.8736 5.07736C87.0562 5.07736 83.9824 8.19415 83.9824 12.0147V23.9289C83.9824 25.2862 82.8917 26.3922 81.5532 26.3922C80.2146 26.3922 79.1239 25.2862 79.1239 23.9289V11.9645C79.1239 5.42925 84.379 0.150814 90.824 0.150814C97.2689 0.150814 102.524 5.42925 102.524 11.9645V23.8786C102.524 25.2359 101.433 26.3419 100.095 26.3419C98.7562 26.3419 97.6655 25.2359 97.6655 23.8786V11.9645C97.7647 8.14387 94.6414 5.07736 90.8736 5.07736ZM119.43 5.07736C115.513 5.07736 112.39 8.24441 112.39 12.065V14.5785C112.39 18.4494 115.513 21.5662 119.43 21.5662C120.768 21.5662 122.057 21.164 123.098 20.5105C124.238 19.8067 125.726 20.1586 126.42 21.3148C127.114 22.4711 126.767 23.9792 125.627 24.683C123.842 25.7889 121.71 26.4425 119.43 26.4425C112.885 26.4425 107.581 21.1137 107.581 14.5785V12.065C107.581 5.47952 112.935 0.201088 119.43 0.201088C125.032 0.201088 129.692 4.07194 130.931 9.3001L131.427 11.3612L121.115 15.584C119.876 16.0867 118.488 15.4834 117.942 14.2266C117.447 12.9699 118.041 11.5623 119.281 11.0596L125.478 8.54604C124.238 6.43466 122.008 5.07736 119.43 5.07736ZM146.003 5.07736C142.086 5.07736 138.963 8.24441 138.963 12.065V14.5785C138.963 18.4494 142.086 21.5662 146.003 21.5662C147.341 21.5662 148.630 21.164 149.671 20.5105C150.217 20.1586 150.663 19.8067 151.109 19.304C152.001 18.2986 153.538 18.2483 154.53 19.2034C155.521 20.1083 155.571 21.6667 154.629 22.6721C153.935 23.4262 153.092 24.13 152.2 24.683C150.415 25.7889 148.283 26.4425 146.003 26.4425C139.458 26.4425 134.154 21.1137 134.154 14.5785V12.065C134.154 5.47952 139.508 0.201088 146.003 0.201088C151.605 0.201088 156.265 4.07194 157.504 9.3001L158 11.3612L147.688 15.584C146.449 16.0867 145.061 15.4834 144.515 14.2266C144.019 12.9699 144.614 11.5623 145.854 11.0596L152.051 8.54604C150.762 6.43466 148.58 5.07736 146.003 5.07736Z\" fill=\"white\"/>\\n </svg>\\n </body>\\n </html>\\n '"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 12
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T10:04:24.449814Z",
"start_time": "2025-09-07T10:04:24.443869Z"
}
},
"cell_type": "code",
"source": [
"from IPython.display import IFrame, HTML, display\n",
"display(IFrame(\"./guido_contributions.html\", width=\"100%\", height=\"500\"))"
],
"id": "f24341c97d6eaccb",
"outputs": [
{
"data": {
"text/plain": [
"<IPython.lib.display.IFrame at 0x154269370>"
],
"text/html": [
"\n",
" <iframe\n",
" width=\"100%\"\n",
" height=\"500\"\n",
" src=\"./guido_contributions.html\"\n",
" frameborder=\"0\"\n",
" allowfullscreen\n",
" \n",
" ></iframe>\n",
" "
]
},
"metadata": {},
"output_type": "display_data"
}
],
"execution_count": 11
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"**Why visualization matters:** Knowledge graphs reveal hidden patterns in Python's development. The interactive visualization shows how different projects (CPython, mypy, PEPs), features, and time periods connect - insights that show Python's thoughtful evolution.\n",
"\n",
"Take a moment to explore the graph. Notice how:\n",
"\n",
"- CPython core development clusters around 2020\n",
"- Mypy contributions focus on fixtures and run classes\n",
"- PEP discussions mention Thomas Grainiger and Adam Turner\n",
"- Time-based connections show how ideas evolved into features"
],
"id": "3418aa17bf35e3bb"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "tNow we'll add your own the remaining data and see how they connections emerge between Guido's contributions, Python best practices and user conversations.",
"id": "5e8d9094a09ae05d"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T11:29:01.564485Z",
"start_time": "2025-09-07T11:29:01.371325Z"
}
},
"cell_type": "code",
"source": [
"await cognee.add(\"file://data/copilot_conversations.json\", node_set=\"conversation_logs\")\n",
"await cognee.add(\"file://data/my_developer_rules.md\", node_set=\"repository_data\")\n",
"await cognee.add(\"file://data/zen_principles.md\", node_set=\"repository_data\")\n",
"await cognee.add(\"file://data/pep_style_guide.md\", node_set=\"repository_data\")"
],
"id": "5315318324968f0f",
"outputs": [
{
"data": {
"text/plain": [
"PipelineRunCompleted(status='PipelineRunCompleted', pipeline_run_id=UUID('525400dd-b28e-59bf-aee9-ff7338a16159'), dataset_id=UUID('7cbac52a-507c-5a7d-aea8-91cc6a696792'), dataset_name='main_dataset', payload=None, data_ingestion_info=[{'run_info': PipelineRunAlreadyCompleted(status='PipelineRunAlreadyCompleted', pipeline_run_id=UUID('525400dd-b28e-59bf-aee9-ff7338a16159'), dataset_id=UUID('7cbac52a-507c-5a7d-aea8-91cc6a696792'), dataset_name='main_dataset', payload=None, data_ingestion_info=None), 'data_id': UUID('c2edae28-6c2f-5673-b354-b5376e88c6b1')}])"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 19
},
{
"metadata": {},
"cell_type": "markdown",
"source": "",
"id": "98b9b613d6d11bc5"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T10:07:59.212671Z",
"start_time": "2025-09-07T10:07:56.314960Z"
}
},
"cell_type": "code",
"source": [
"results = cognee.search(\"What Python type hinting challenges did I face, and how does Guido approach similar problems in mypy?\")\n",
"print(results)"
],
"id": "98b69c45db2fca3",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"\u001B[2m2025-09-07T10:07:56.373046\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 147 nodes and 322 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T10:07:56.375530\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mGraph projection completed: 147 nodes, 322 edges in 0.04s\u001B[0m [\u001B[0m\u001B[1m\u001B[34mCogneeGraph\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T10:07:56.739044\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mVector collection retrieval completed: Retrieved distances from 6 collections in 0.02s\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.shared.logging_utils\u001B[0m]\u001B[0m\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[\"Using the provided context, I'll answer briefly about your type-hinting challenges and how Guido (in mypy) approaches similar problems.\"]\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/b6/fdg52thn3h309cbg6kv5nryc0000gn/T/ipykernel_75109/564786944.py:1: RuntimeWarning: coroutine 'search' was never awaited\n",
" results = await cognee.search(\"What Python type hinting challenges did I face, and how does Guido approach similar problems in mypy?\")\n",
"RuntimeWarning: Enable tracemalloc to get the object allocation traceback\n"
]
}
],
"execution_count": 18
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"You'll see that cognee has connected your Python development challenges with Guido's approaches, revealing patterns like:\n",
"\n",
"- \"Type hint implementation failed due to circular imports - similar to issue Guido solved in mypy PR #1234\"\n",
"- \"Performance bottleneck in list comprehension matches pattern Guido optimized in CPython commit abc123\""
],
"id": "6c49c4c252036fa1"
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"Let's now introduce the memory functions. These algorithms run on top of your semantic layer, connecting the dots and improving the search.\n",
"\n",
"Memify is customizable and can use any transformation you'd like to write. But it also requires"
],
"id": "a1f4606bfed8fc45"
},
{
"metadata": {},
"cell_type": "code",
"outputs": [],
"execution_count": null,
"source": "cognee.memify()",
"id": "20234960f7566b15"
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"**What `memify()` does for Python:** This advanced function uses AI to:\n",
"\n",
"- **Infer rule patterns** from your code (e.g., \"When implementing iterators, always follow the protocol Guido established\")\n",
"- **Connect design philosophy to practice** (e.g., linking \"explicit is better than implicit\" to your type hinting decisions)\n"
],
"id": "58d3ccec16f67c24"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Now let's see how the system has connected your Python development patterns with established best practices:\n",
"id": "a304033f9f0f5dcf"
},
{
"metadata": {},
"cell_type": "code",
"outputs": [],
"execution_count": null,
"source": [
"# Search for connections between your async patterns and Python philosophy\n",
"results = cognee.search(\n",
" \"How does my AsyncWebScraper implementation align with Python's design principles?\",\n",
" search_type=\"GRAPH_COMPLETION\"\n",
")\n",
"print(\"Python Pattern Analysis:\", results)"
],
"id": "518fa9b17a604657"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Now let's see use time awareness feature of cognee to see what are all events that happened between X and Y",
"id": "c641b8b7e50dd2ae"
},
{
"metadata": {},
"cell_type": "code",
"outputs": [],
"execution_count": null,
"source": "",
"id": "28e7d5a75e076b8f"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Hm, maybe we are unhappy with the result and want to give feedback to the system so it doesn't give us a bad answer again",
"id": "ec6cf074a6c272ab"
},
{
"metadata": {},
"cell_type": "code",
"outputs": [],
"execution_count": null,
"source": "",
"id": "67dec85a658aad76"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}