cognee/notebooks/tutorial.ipynb
2025-09-07 14:15:38 +02:00

1202 lines
348 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, best practice coding patterns, and your preferences and experience\n",
"- **Learn how to use intelligent search capabilities** that combine the diverse context\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 core Cognee operations we'll be working with:\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.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-07T12:05:29.648998Z",
"start_time": "2025-09-07T12:05:29.642122Z"
}
},
"cell_type": "code",
"source": [
"import nest_asyncio\n",
"nest_asyncio.apply()"
],
"id": "20cb02b49e3c53e2",
"outputs": [],
"execution_count": 17
},
{
"metadata": {},
"cell_type": "markdown",
"source": "We will do a quick import check.",
"id": "45e1caaec20c9518"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T12:05:32.556756Z",
"start_time": "2025-09-07T12:05:32.551903Z"
}
},
"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": "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": 18
},
{
"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-07T12:05:34.435510Z",
"start_time": "2025-09-07T12:05:34.430582Z"
}
},
"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": 19
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Finally, we will begin with a clean slate, by removing any previous Cognee data:",
"id": "af584b935cbdc8d"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T12:05:41.228831Z",
"start_time": "2025-09-07T12:05:38.986516Z"
}
},
"cell_type": "code",
"source": [
"await cognee.prune.prune_data()\n",
"await cognee.prune.prune_system(metadata=True)"
],
"id": "dd47383aa9519465",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"\u001B[2m2025-09-07T12:05:41.226643\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mDatabase deleted successfully.\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.shared.logging_utils\u001B[0m]\u001B[0m\n"
]
}
],
"execution_count": 20
},
{
"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-07T11:55:27.121445Z",
"start_time": "2025-09-07T11:54:57.031243Z"
}
},
"cell_type": "code",
"source": [
"import cognee\n",
"result = await cognee.add(\n",
" \"file://data/guido_contributions.json\",\n",
" node_set=[\"guido\"]\n",
")\n",
"await cognee.cognify()\n",
"results = await cognee.search(\"Show me commits\")"
],
"id": "b8743ed520b4de37",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"User a35adc78-d4bb-42da-ad0b-3ad52fc222e7 has registered.\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"\u001B[1mEmbeddingRateLimiter initialized: enabled=False, requests_limit=60, interval_seconds=60\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.663413\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run started: `f5ca7c7d-08ef-584f-a745-891dcc728073`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.664064\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `resolve_data_directories`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.664466\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `ingest_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.678662\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRegistered loader: pypdf_loader\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.infrastructure.loaders.LoaderEngine\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.679216\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRegistered loader: text_loader\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.infrastructure.loaders.LoaderEngine\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.679596\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRegistered loader: image_loader\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.infrastructure.loaders.LoaderEngine\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.679951\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRegistered loader: audio_loader\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.infrastructure.loaders.LoaderEngine\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.680260\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRegistered loader: unstructured_loader\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.infrastructure.loaders.LoaderEngine\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.692179\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `ingest_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.692997\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `resolve_data_directories`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.693329\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run completed: `f5ca7c7d-08ef-584f-a745-891dcc728073`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.708125\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-07T11:54:59.729261\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run started: `7233180e-8575-54d0-bee4-700ba5f5de42`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.729906\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `classify_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.730351\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `check_permissions_on_dataset`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.739549\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task started: `extract_chunks_from_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:54:59.821323\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `extract_graph_from_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.803782\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'softwarechange' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.807972\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 're-work indirect dependencies' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.809182\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'softwareproject' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.810180\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'mypy' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.811212\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'prnumber' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.812692\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for '19798' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.813773\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'concept' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.814819\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'files changed' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.815754\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'indirect dependencies' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.816530\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'codecomponent' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.817383\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'typeindirectionvisitor' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.818102\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'process' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.818890\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'semantic analysis' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.819643\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'performance impact' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.820298\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'fixes' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.821052\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'date' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.821569\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for '2025-09-05' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.822748\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'file' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.823523\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'mypy/indirection.py changes' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.823901\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'mypy/nodes.py changes' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.824273\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'typealiastype' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.824599\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'instance' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.824933\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'variable' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.825219\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'seen_aliases' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.825488\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'seen_types' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.826183\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'seen_fullnames' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.826657\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'modules' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.826987\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'project' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.827334\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'pullrequest' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.827632\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'chore: add cline_docs/ to .gitignore' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.827911\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for '[mypyc] add type annotations to tests' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.828178\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'check functions without annotations in mypyc tests' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.828778\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'fix: allow instantiation of type[none] in analyze_type_type_callee' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.829118\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'mypy pr 19782' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.829426\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'issue' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.829708\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'issue 19660' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.830029\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'mypy/checkexpr.py' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.830317\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'testcase' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.830604\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'testtypeusingtypecnonetype' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.830860\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'mypyc pr 19217' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.831165\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'mypyc/primitives/weakref_ops.py' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.831451\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'commit' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.831747\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'cpython commit 28625d4f' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.831977\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for '2025-09-02' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.832241\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'gh-118335' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.832462\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'rename --experimental-interpreter on windows to --experimental-jit-interpreter' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.832901\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'document' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.833298\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'doc/whatsnew/3.13.rst' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.833553\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'pcbuild/build.bat' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.833875\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'pep' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.834104\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'pep 667' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.834438\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'attribute' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.834646\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'frame.f_locals' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.834950\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'write-through proxy' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.835311\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'typeguard (pep 647)' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.835796\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'mypy: support typeguard (pep 647)' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.836117\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'software' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.836381\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for '.github/issue_template/crash.md' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.836676\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for '.github/issue_template/bug.md' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.836932\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'mypy/config_parser.py' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.837324\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'commit_cca6e2f' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.837927\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'commit_6f07cb6' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.838309\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'commit_9d03846' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.838653\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'commit_57d3473' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:10.838967\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'commit_42a5220' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:14.763168\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 70 nodes and 156 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:15.500077\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `summarize_text`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:19.781997\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_data_points`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:23.577888\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 76 nodes and 209 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:24.515648\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_data_points`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:24.516093\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `summarize_text`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:24.516397\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `extract_graph_from_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:24.516754\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task completed: `extract_chunks_from_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:24.517062\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `check_permissions_on_dataset`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:24.517361\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `classify_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:24.517606\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run completed: `7233180e-8575-54d0-bee4-700ba5f5de42`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:24.550762\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 76 nodes and 209 edges in 0.01 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:24.552178\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mGraph projection completed: 76 nodes, 209 edges in 0.02s\u001B[0m [\u001B[0m\u001B[1m\u001B[34mCogneeGraph\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:24.995660\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": 5
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T11:55:29.022001Z",
"start_time": "2025-09-07T11:55:29.019626Z"
}
},
"cell_type": "code",
"source": "print(results[0])",
"id": "f08b362cbf12b398",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Showing commits for repository 'mypy':\n"
]
}
],
"execution_count": 6
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"### What's just happened?\n",
"The `search()` function uses natural language to query a knowledge graph containing Guido's development history.\n",
"Unlike traditional databases, Cognee understands the relationships between commits, language features, design decisions, and evolution over time.\n",
"\n",
"Cognee also allows you to visualize the graphs created:"
],
"id": "10d582d02ead905e"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T11:55:38.531950Z",
"start_time": "2025-09-07T11:55:38.486793Z"
}
},
"cell_type": "code",
"source": [
"from cognee import visualize_graph\n",
"await visualize_graph('./guido_contributions.html')"
],
"id": "1fb068f422bda6cf",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"\u001B[2m2025-09-07T11:55:38.519644\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 76 nodes and 209 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:55:38.522646\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-07T11:55:38.523615\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\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"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\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\"}, {\"id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"name\": \"guido\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"NodeSet\", \"metadata\": \"{\\\\\"index_fields\\\\\": []}\", \"version\": 1, \"color\": \"#D3D3D3\"}, {\"id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"description\": \"Pull request to rework indirect dependencies in mypy, fixes crashes and stale types, updates logic and adds optimizations.\", \"name\": \"re-work indirect dependencies\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"35d647fa-4270-59d0-a6c8-ed5073c2b528\", \"description\": \"softwarechange\", \"name\": \"softwarechange\", \"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\": \"3a44e90a-be04-558a-a5eb-9cef4f97e7ef\", \"description\": \"softwareproject\", \"name\": \"softwareproject\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"479a2785-79a0-50c3-ac03-214899bcaecf\", \"description\": \"Pull request number 19798.\", \"name\": \"19798\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"03a15f37-424f-56b3-b4cc-0b5df3ca49b8\", \"description\": \"prnumber\", \"name\": \"prnumber\", \"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 modified files in the PR.\", \"name\": \"files changed\", \"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\": \"38a596c1-8f33-525d-bc4e-fab926efde68\", \"description\": \"Dependencies from types to their definitions beyond import-based dependencies.\", \"name\": \"indirect dependencies\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"description\": \"Visitor in mypy.indirection to find named types transitively.\", \"name\": \"typeindirectionvisitor\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"b6916d67-a428-565f-95a1-1ce3c98c2d79\", \"description\": \"codecomponent\", \"name\": \"codecomponent\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"b632ce2d-bcfd-5f0d-a880-2128c6d6dd96\", \"description\": \"Phase where original aliases are recorded and types are analyzed.\", \"name\": \"semantic analysis\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"19c02ee0-4f10-5498-ac95-0f3a9eb786b1\", \"description\": \"process\", \"name\": \"process\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"fb90d891-e2b0-53f6-b389-c96f685a0af1\", \"description\": \"Potential slowdown due to visiting generic bases, mitigated by optimizations.\", \"name\": \"performance impact\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"d085fa79-190b-5a4f-963c-8f2e9c950ea2\", \"description\": \"Three crashes and three stale types fixed.\", \"name\": \"fixes\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"description\": \"Date of the pull request.\", \"name\": \"2025-09-05\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"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\"}, {\"id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"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.\", \"chunk_index\": 1, \"chunk_size\": 8167, \"cut_type\": \"sentence_end\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"DocumentChunk\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#801212\", \"name\": \"8bc13664-b755-5997-9481-00eeaafd79a9\"}, {\"id\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"description\": \"Modifications in mypy/indirection.py showing visitor logic and module collection improvements\", \"name\": \"mypy/indirection.py changes\", \"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\": \"3ad21abe-aa18-5eda-93f3-851a52032f75\", \"description\": \"Modifications adding module and alias dependency fields in nodes.py\", \"name\": \"mypy/nodes.py changes\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"6388df2d-1882-5d4f-b870-d0a2fb4f0bb3\", \"description\": \"Represents a type alias in mypy type system\", \"name\": \"typealiastype\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"19df58d4-b1a8-5618-8a11-a00ce7766a27\", \"description\": \"Represents a proper type instance in mypy\", \"name\": \"instance\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"05e3f55c-af49-56fc-a9c5-fd923df5ac12\", \"description\": \"Set tracking seen TypeAliasType to avoid recursion\", \"name\": \"seen_aliases\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"f9d9d4e0-c1a1-5943-a166-fa71eac855a6\", \"description\": \"variable\", \"name\": \"variable\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"8254047d-6bcd-5747-b993-d27d0b20712f\", \"description\": \"Set tracking seen types (aliases and instances) to avoid recursion\", \"name\": \"seen_types\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"fb222ca1-605f-5e52-ac1e-70ab5dab4b46\", \"description\": \"Set tracking processed fullnames to avoid redundant work\", \"name\": \"seen_fullnames\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"description\": \"Collected module names referenced by types\", \"name\": \"modules\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"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.\", \"chunk_index\": 2, \"chunk_size\": 8154, \"cut_type\": \"sentence_end\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"DocumentChunk\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#801212\", \"name\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\"}, {\"id\": \"161c8390-d401-5ad4-83af-4e7fd015787c\", \"description\": \"Adds cline_docs/ to .gitignore because Cline tool may create it locally.\", \"name\": \"chore: add cline_docs/ to .gitignore\", \"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\": \"4671a160-3b7d-535d-a8ad-816573bdbf7e\", \"description\": \"Adds type annotations to various mypyc test fixtures.\", \"name\": \"[mypyc] add type annotations to tests\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"6aa08a11-b0e1-560b-8d55-0653d70f4cc2\", \"description\": \"Sets check_untyped_defs = True for run-* tests to check functions without annotations.\", \"name\": \"check functions without annotations in mypyc tests\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"60095433-e631-5ecf-939c-1c3a3a6c8d82\", \"description\": \"Fix to allow instantiation of type[None] in analyze_type_type_callee.\", \"name\": \"fix: allow instantiation of type[none] in analyze_type_type_callee\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"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\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\"}, {\"id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"description\": \"Allow instantiation of NoneType in type checker; fixes error when calling NoneType() or type(None)()\", \"name\": \"mypy pr 19782\", \"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\": \"abcdc7e7-a2d0-580e-b478-2214f0aca5e8\", \"description\": \"Modified to treat NoneType as callable returning None\", \"name\": \"mypy/checkexpr.py\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"622d030a-0ba7-5309-916f-b741eaeeadbe\", \"description\": \"Tests for direct calls to type(None)() and NoneType() and functions accepting type[None] parameters\", \"name\": \"testtypeusingtypecnonetype\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"c68d093f-a7b4-5412-9bc6-04597773a8b5\", \"description\": \"testcase\", \"name\": \"testcase\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"description\": \"Adds new mypyc primitives for weakref.proxy; exposes potential reference counting bug\", \"name\": \"mypyc pr 19217\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"31b7b4aa-50b4-5cdb-bc3b-0d266d67f136\", \"description\": \"Added new weakref primitives\", \"name\": \"mypyc/primitives/weakref_ops.py\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"555c90d6-201d-578a-9fff-eb3a12ae97d3\", \"description\": \"Update what\\'s new in 3.13 and 3.14 with create_task changes of asyncio\", \"name\": \"cpython commit 28625d4f\", \"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\": \"ee739881-740c-5cba-8a4e-e163b0494025\", \"description\": \"2025-09-02\", \"name\": \"2025-09-02\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"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\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\"}, {\"id\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"description\": \"Issue referenced in commit about renaming --experimental-interpreter on Windows to --experimental-jit-interpreter\", \"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 a37b0932: Renamed flag and fixed docs; modifies Doc/whatsnew/3.13.rst and PCbuild/build.bat; date 2024-05-02\", \"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\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"description\": \"What\\'s New in Python 3.13 document modified to mention frame.f_locals behavior and experimental flag rename\", \"name\": \"doc/whatsnew/3.13.rst\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"7391ab9a-d827-5471-9b04-8cfd1994f783\", \"description\": \"document\", \"name\": \"document\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"a6d135f0-e1b3-5387-837a-4628db693f14\", \"description\": \"Windows build batch file modified to rename experimental flag\", \"name\": \"pcbuild/build.bat\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"description\": \"PEP changing frame.f_locals to return write-through proxy for functions and comprehensions\", \"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\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"description\": \"Frame attribute; now may return write-through proxy for functions and comprehensions (since 3.13)\", \"name\": \"frame.f_locals\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"36152967-e061-549d-975f-c91c1378deb9\", \"description\": \"attribute\", \"name\": \"attribute\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"EntityType\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#6510f4\"}, {\"id\": \"73da2292-a404-5e28-aba2-8b9ecbc277d5\", \"description\": \"Proxy object that writes through to frame locals\", \"name\": \"write-through proxy\", \"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 commit\", \"name\": \"typeguard (pep 647)\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"description\": \"Related issue about instantiation of NoneType\", \"name\": \"issue 19660\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"description\": \"mypy commit fffbe88f adding support for TypeGuard, modified multiple files; date 2021-01-18\", \"name\": \"mypy: support typeguard (pep 647)\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"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]\", \"chunk_index\": 5, \"chunk_size\": 7213, \"cut_type\": \"sentence_cut\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"DocumentChunk\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#801212\", \"name\": \"28dae116-2846-5652-ab2e-aae37913d3fe\"}, {\"id\": \"d6afb0c2-4164-5622-ae37-cc40479ada3a\", \"description\": \"Crash report issue template added in commit cca6e2f...\", \"name\": \".github/issue_template/crash.md\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"35a6dc80-4e60-59bc-81df-737f5599ba85\", \"description\": \"Bug report template modified in commits 6f07cb6... and reverted in 42a5220...\", \"name\": \".github/issue_template/bug.md\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"cf64ea2e-0fdc-5c2a-bdbd-7008b48cebaf\", \"description\": \"Config parser modified in commits 9d03846 and 57d3473...\", \"name\": \"mypy/config_parser.py\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"4e98f9f2-8469-5d1d-b104-694efd7a1423\", \"description\": \"Add separate issue form to report crashes (#9549) on 2020-10-08\", \"name\": \"commit_cca6e2f\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"fb3d7655-8d0f-51cb-8c04-1a0f6aa1eb96\", \"description\": \"Make new bug templates less markup-heavy (#9438) on 2020-09-11\", \"name\": \"commit_6f07cb6\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"de6f76f9-5daf-5b57-8c7c-14bab7b2a823\", \"description\": \"Add MYPY_CONFIG_FILE_DIR to environment when config file is read (2nd try) (#9414) on 2020-09-04\", \"name\": \"commit_9d03846\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"6904c5a7-9be3-5a14-92cd-062d42be3f9f\", \"description\": \"Revert addition of MYPY_CONFIG_FILE_DIR due to CI break on 2020-09-04\", \"name\": \"commit_57d3473\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"109f56ad-10e5-566e-a190-b9563577cd26\", \"description\": \"Revert issue template (#9345) on 2020-08-27\", \"name\": \"commit_42a5220\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"Entity\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"name\\\\\"]}\", \"version\": 1, \"color\": \"#f47710\"}, {\"id\": \"a4dddaf1-d485-550e-a9a8-b2c03c21f4bf\", \"text\": \"Rework indirect dependency handling in mypy.\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"a4dddaf1-d485-550e-a9a8-b2c03c21f4bf\"}, {\"id\": \"42fa2f93-dfe4-58e3-a023-a7e1c42985de\", \"text\": \"Patch modifies mypy code to better track module/type dependencies and avoid recursion, improving instance, alias, and overloaded handling.\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"42fa2f93-dfe4-58e3-a023-a7e1c42985de\"}, {\"id\": \"9f1d41c6-2ce8-5565-a636-37c62662b0e5\", \"text\": \"PR collection changes in mypy repository (Sept 2025)\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"9f1d41c6-2ce8-5565-a636-37c62662b0e5\"}, {\"id\": \"85d5304e-3012-5a03-ba2b-32c0cf00a00b\", \"text\": \"Allow instantiation of NoneType in mypy type checker\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"85d5304e-3012-5a03-ba2b-32c0cf00a00b\"}, {\"id\": \"bf7bc50d-208e-54ab-9981-cdc0bbecc6fd\", \"text\": \"Multiple codebase commits: CPython changes updated frame.f_locals to return write-through proxy per PEP 667; docs updated. Mypy added TypeGuard (PEP 647) support across many files, adjusting callable type handling, type inference, expansion, and checks. Other CPython commits tweak Windows flag rename and frame line number API changes.\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"bf7bc50d-208e-54ab-9981-cdc0bbecc6fd\"}, {\"id\": \"6ef1c3e1-d2ea-5ad4-9120-fdf0c8db691b\", \"text\": \"Series of mypy repository commits modifying issue templates and config behavior\", \"ontology_valid\": false, \"topological_rank\": 0, \"type\": \"TextSummary\", \"metadata\": \"{\\\\\"index_fields\\\\\": [\\\\\"text\\\\\"]}\", \"version\": 1, \"color\": \"#1077f4\", \"name\": \"6ef1c3e1-d2ea-5ad4-9120-fdf0c8db691b\"}];\\n var links = [{\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"relationship_name\": \"contains\"}}, {\"source\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target\": \"35d647fa-4270-59d0-a6c8-ed5073c2b528\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target_node_id\": \"35d647fa-4270-59d0-a6c8-ed5073c2b528\", \"relationship_name\": \"is_a\"}}, {\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"3a44e90a-be04-558a-a5eb-9cef4f97e7ef\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target_node_id\": \"3a44e90a-be04-558a-a5eb-9cef4f97e7ef\", \"relationship_name\": \"is_a\"}}, {\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"479a2785-79a0-50c3-ac03-214899bcaecf\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"479a2785-79a0-50c3-ac03-214899bcaecf\", \"relationship_name\": \"contains\"}}, {\"source\": \"479a2785-79a0-50c3-ac03-214899bcaecf\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"479a2785-79a0-50c3-ac03-214899bcaecf\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"479a2785-79a0-50c3-ac03-214899bcaecf\", \"target\": \"03a15f37-424f-56b3-b4cc-0b5df3ca49b8\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"479a2785-79a0-50c3-ac03-214899bcaecf\", \"target_node_id\": \"03a15f37-424f-56b3-b4cc-0b5df3ca49b8\", \"relationship_name\": \"is_a\"}}, {\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"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 11:55:10\", \"source_node_id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"38a596c1-8f33-525d-bc4e-fab926efde68\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"38a596c1-8f33-525d-bc4e-fab926efde68\", \"relationship_name\": \"contains\"}}, {\"source\": \"38a596c1-8f33-525d-bc4e-fab926efde68\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"38a596c1-8f33-525d-bc4e-fab926efde68\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"38a596c1-8f33-525d-bc4e-fab926efde68\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"38a596c1-8f33-525d-bc4e-fab926efde68\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"target\": \"b6916d67-a428-565f-95a1-1ce3c98c2d79\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"target_node_id\": \"b6916d67-a428-565f-95a1-1ce3c98c2d79\", \"relationship_name\": \"is_a\"}}, {\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"b632ce2d-bcfd-5f0d-a880-2128c6d6dd96\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"b632ce2d-bcfd-5f0d-a880-2128c6d6dd96\", \"relationship_name\": \"contains\"}}, {\"source\": \"b632ce2d-bcfd-5f0d-a880-2128c6d6dd96\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"b632ce2d-bcfd-5f0d-a880-2128c6d6dd96\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b632ce2d-bcfd-5f0d-a880-2128c6d6dd96\", \"target\": \"19c02ee0-4f10-5498-ac95-0f3a9eb786b1\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"b632ce2d-bcfd-5f0d-a880-2128c6d6dd96\", \"target_node_id\": \"19c02ee0-4f10-5498-ac95-0f3a9eb786b1\", \"relationship_name\": \"is_a\"}}, {\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"fb90d891-e2b0-53f6-b389-c96f685a0af1\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"fb90d891-e2b0-53f6-b389-c96f685a0af1\", \"relationship_name\": \"contains\"}}, {\"source\": \"fb90d891-e2b0-53f6-b389-c96f685a0af1\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"fb90d891-e2b0-53f6-b389-c96f685a0af1\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"fb90d891-e2b0-53f6-b389-c96f685a0af1\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"fb90d891-e2b0-53f6-b389-c96f685a0af1\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"d085fa79-190b-5a4f-963c-8f2e9c950ea2\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"d085fa79-190b-5a4f-963c-8f2e9c950ea2\", \"relationship_name\": \"contains\"}}, {\"source\": \"d085fa79-190b-5a4f-963c-8f2e9c950ea2\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"d085fa79-190b-5a4f-963c-8f2e9c950ea2\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"d085fa79-190b-5a4f-963c-8f2e9c950ea2\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"d085fa79-190b-5a4f-963c-8f2e9c950ea2\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"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 11:55:10\", \"source_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"target_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relationship_name\": \"is_a\"}}, {\"source\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"target_node_id\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target_node_id\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"relationship_name\": \"contains\"}}, {\"source\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target\": \"3ad21abe-aa18-5eda-93f3-851a52032f75\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target_node_id\": \"3ad21abe-aa18-5eda-93f3-851a52032f75\", \"relationship_name\": \"contains\"}}, {\"source\": \"3ad21abe-aa18-5eda-93f3-851a52032f75\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"3ad21abe-aa18-5eda-93f3-851a52032f75\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"3ad21abe-aa18-5eda-93f3-851a52032f75\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"3ad21abe-aa18-5eda-93f3-851a52032f75\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target\": \"6388df2d-1882-5d4f-b870-d0a2fb4f0bb3\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target_node_id\": \"6388df2d-1882-5d4f-b870-d0a2fb4f0bb3\", \"relationship_name\": \"contains\"}}, {\"source\": \"6388df2d-1882-5d4f-b870-d0a2fb4f0bb3\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6388df2d-1882-5d4f-b870-d0a2fb4f0bb3\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"6388df2d-1882-5d4f-b870-d0a2fb4f0bb3\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6388df2d-1882-5d4f-b870-d0a2fb4f0bb3\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target\": \"19df58d4-b1a8-5618-8a11-a00ce7766a27\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target_node_id\": \"19df58d4-b1a8-5618-8a11-a00ce7766a27\", \"relationship_name\": \"contains\"}}, {\"source\": \"19df58d4-b1a8-5618-8a11-a00ce7766a27\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"19df58d4-b1a8-5618-8a11-a00ce7766a27\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"19df58d4-b1a8-5618-8a11-a00ce7766a27\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"19df58d4-b1a8-5618-8a11-a00ce7766a27\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}, {\"source\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target\": \"05e3f55c-af49-56fc-a9c5-fd923df5ac12\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target_node_id\": \"05e3f55c-af49-56fc-a9c5-fd923df5ac12\", \"relationship_name\": \"contains\"}}, {\"source\": \"05e3f55c-af49-56fc-a9c5-fd923df5ac12\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"05e3f55c-af49-56fc-a9c5-fd923df5ac12\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"05e3f55c-af49-56fc-a9c5-fd923df5ac12\", \"target\": \"f9d9d4e0-c1a1-5943-a166-fa71eac855a6\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"05e3f55c-af49-56fc-a9c5-fd923df5ac12\", \"target_node_id\": \"f9d9d4e0-c1a1-5943-a166-fa71eac855a6\", \"relationship_name\": \"is_a\"}}, {\"source\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target\": \"8254047d-6bcd-5747-b993-d27d0b20712f\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target_node_id\": \"8254047d-6bcd-5747-b993-d27d0b20712f\", \"relationship_name\": \"contains\"}}, {\"source\": \"8254047d-6bcd-5747-b993-d27d0b20712f\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8254047d-6bcd-5747-b993-d27d0b20712f\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"8254047d-6bcd-5747-b993-d27d0b20712f\", \"target\": \"f9d9d4e0-c1a1-5943-a166-fa71eac855a6\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8254047d-6bcd-5747-b993-d27d0b20712f\", \"target_node_id\": \"f9d9d4e0-c1a1-5943-a166-fa71eac855a6\", \"relationship_name\": \"is_a\"}}, {\"source\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target\": \"fb222ca1-605f-5e52-ac1e-70ab5dab4b46\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target_node_id\": \"fb222ca1-605f-5e52-ac1e-70ab5dab4b46\", \"relationship_name\": \"contains\"}}, {\"source\": \"fb222ca1-605f-5e52-ac1e-70ab5dab4b46\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"fb222ca1-605f-5e52-ac1e-70ab5dab4b46\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"fb222ca1-605f-5e52-ac1e-70ab5dab4b46\", \"target\": \"f9d9d4e0-c1a1-5943-a166-fa71eac855a6\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"fb222ca1-605f-5e52-ac1e-70ab5dab4b46\", \"target_node_id\": \"f9d9d4e0-c1a1-5943-a166-fa71eac855a6\", \"relationship_name\": \"is_a\"}}, {\"source\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target_node_id\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"relationship_name\": \"contains\"}}, {\"source\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"target\": \"f9d9d4e0-c1a1-5943-a166-fa71eac855a6\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"target_node_id\": \"f9d9d4e0-c1a1-5943-a166-fa71eac855a6\", \"relationship_name\": \"is_a\"}}, {\"source\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"target_node_id\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relationship_name\": \"contains\"}}, {\"source\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target\": \"161c8390-d401-5ad4-83af-4e7fd015787c\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target_node_id\": \"161c8390-d401-5ad4-83af-4e7fd015787c\", \"relationship_name\": \"contains\"}}, {\"source\": \"161c8390-d401-5ad4-83af-4e7fd015787c\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"161c8390-d401-5ad4-83af-4e7fd015787c\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"161c8390-d401-5ad4-83af-4e7fd015787c\", \"target\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"161c8390-d401-5ad4-83af-4e7fd015787c\", \"target_node_id\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relationship_name\": \"is_a\"}}, {\"source\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target\": \"4671a160-3b7d-535d-a8ad-816573bdbf7e\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target_node_id\": \"4671a160-3b7d-535d-a8ad-816573bdbf7e\", \"relationship_name\": \"contains\"}}, {\"source\": \"4671a160-3b7d-535d-a8ad-816573bdbf7e\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"4671a160-3b7d-535d-a8ad-816573bdbf7e\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"4671a160-3b7d-535d-a8ad-816573bdbf7e\", \"target\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"4671a160-3b7d-535d-a8ad-816573bdbf7e\", \"target_node_id\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relationship_name\": \"is_a\"}}, {\"source\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target\": \"6aa08a11-b0e1-560b-8d55-0653d70f4cc2\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target_node_id\": \"6aa08a11-b0e1-560b-8d55-0653d70f4cc2\", \"relationship_name\": \"contains\"}}, {\"source\": \"6aa08a11-b0e1-560b-8d55-0653d70f4cc2\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6aa08a11-b0e1-560b-8d55-0653d70f4cc2\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"6aa08a11-b0e1-560b-8d55-0653d70f4cc2\", \"target\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6aa08a11-b0e1-560b-8d55-0653d70f4cc2\", \"target_node_id\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relationship_name\": \"is_a\"}}, {\"source\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target\": \"60095433-e631-5ecf-939c-1c3a3a6c8d82\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target_node_id\": \"60095433-e631-5ecf-939c-1c3a3a6c8d82\", \"relationship_name\": \"contains\"}}, {\"source\": \"60095433-e631-5ecf-939c-1c3a3a6c8d82\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"60095433-e631-5ecf-939c-1c3a3a6c8d82\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"60095433-e631-5ecf-939c-1c3a3a6c8d82\", \"target\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"60095433-e631-5ecf-939c-1c3a3a6c8d82\", \"target_node_id\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relationship_name\": \"is_a\"}}, {\"source\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"target_node_id\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target_node_id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"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 11:55:10\", \"source_node_id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target_node_id\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relationship_name\": \"is_a\"}}, {\"source\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target_node_id\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"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 11:55:10\", \"source_node_id\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"target_node_id\": \"54c17410-0d01-5596-be63-17324d8dc8f5\", \"relationship_name\": \"is_a\"}}, {\"source\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target\": \"abcdc7e7-a2d0-580e-b478-2214f0aca5e8\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target_node_id\": \"abcdc7e7-a2d0-580e-b478-2214f0aca5e8\", \"relationship_name\": \"contains\"}}, {\"source\": \"abcdc7e7-a2d0-580e-b478-2214f0aca5e8\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"abcdc7e7-a2d0-580e-b478-2214f0aca5e8\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"abcdc7e7-a2d0-580e-b478-2214f0aca5e8\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"abcdc7e7-a2d0-580e-b478-2214f0aca5e8\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target\": \"622d030a-0ba7-5309-916f-b741eaeeadbe\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target_node_id\": \"622d030a-0ba7-5309-916f-b741eaeeadbe\", \"relationship_name\": \"contains\"}}, {\"source\": \"622d030a-0ba7-5309-916f-b741eaeeadbe\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"622d030a-0ba7-5309-916f-b741eaeeadbe\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"622d030a-0ba7-5309-916f-b741eaeeadbe\", \"target\": \"c68d093f-a7b4-5412-9bc6-04597773a8b5\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"622d030a-0ba7-5309-916f-b741eaeeadbe\", \"target_node_id\": \"c68d093f-a7b4-5412-9bc6-04597773a8b5\", \"relationship_name\": \"is_a\"}}, {\"source\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target_node_id\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"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 11:55:10\", \"source_node_id\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"target_node_id\": \"70e6943e-fc90-56e8-a10a-21b9b9391441\", \"relationship_name\": \"is_a\"}}, {\"source\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target\": \"31b7b4aa-50b4-5cdb-bc3b-0d266d67f136\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target_node_id\": \"31b7b4aa-50b4-5cdb-bc3b-0d266d67f136\", \"relationship_name\": \"contains\"}}, {\"source\": \"31b7b4aa-50b4-5cdb-bc3b-0d266d67f136\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"31b7b4aa-50b4-5cdb-bc3b-0d266d67f136\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"31b7b4aa-50b4-5cdb-bc3b-0d266d67f136\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"31b7b4aa-50b4-5cdb-bc3b-0d266d67f136\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target\": \"555c90d6-201d-578a-9fff-eb3a12ae97d3\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target_node_id\": \"555c90d6-201d-578a-9fff-eb3a12ae97d3\", \"relationship_name\": \"contains\"}}, {\"source\": \"555c90d6-201d-578a-9fff-eb3a12ae97d3\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"555c90d6-201d-578a-9fff-eb3a12ae97d3\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"555c90d6-201d-578a-9fff-eb3a12ae97d3\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"555c90d6-201d-578a-9fff-eb3a12ae97d3\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target\": \"ee739881-740c-5cba-8a4e-e163b0494025\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target_node_id\": \"ee739881-740c-5cba-8a4e-e163b0494025\", \"relationship_name\": \"contains\"}}, {\"source\": \"ee739881-740c-5cba-8a4e-e163b0494025\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"ee739881-740c-5cba-8a4e-e163b0494025\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"ee739881-740c-5cba-8a4e-e163b0494025\", \"target\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"ee739881-740c-5cba-8a4e-e163b0494025\", \"target_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relationship_name\": \"is_a\"}}, {\"source\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"target_node_id\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target_node_id\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"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 11:55:10\", \"source_node_id\": \"511424ac-8eed-54a8-89b6-a07b09c2f6c6\", \"target_node_id\": \"54c17410-0d01-5596-be63-17324d8dc8f5\", \"relationship_name\": \"is_a\"}}, {\"source\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target_node_id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"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 11:55:10\", \"source_node_id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target_node_id\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"target\": \"7391ab9a-d827-5471-9b04-8cfd1994f783\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"target_node_id\": \"7391ab9a-d827-5471-9b04-8cfd1994f783\", \"relationship_name\": \"is_a\"}}, {\"source\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target\": \"a6d135f0-e1b3-5387-837a-4628db693f14\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target_node_id\": \"a6d135f0-e1b3-5387-837a-4628db693f14\", \"relationship_name\": \"contains\"}}, {\"source\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target_node_id\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"relationship_name\": \"contains\"}}, {\"source\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target\": \"cf64ea2e-0fdc-5c2a-bdbd-7008b48cebaf\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target_node_id\": \"cf64ea2e-0fdc-5c2a-bdbd-7008b48cebaf\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"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 11:55:10\", \"source_node_id\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"target_node_id\": \"c173fcdb-8139-5426-b0b1-dd5013704063\", \"relationship_name\": \"is_a\"}}, {\"source\": \"cf64ea2e-0fdc-5c2a-bdbd-7008b48cebaf\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cf64ea2e-0fdc-5c2a-bdbd-7008b48cebaf\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target_node_id\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"relationship_name\": \"contains\"}}, {\"source\": \"cf64ea2e-0fdc-5c2a-bdbd-7008b48cebaf\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"cf64ea2e-0fdc-5c2a-bdbd-7008b48cebaf\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target\": \"4e98f9f2-8469-5d1d-b104-694efd7a1423\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target_node_id\": \"4e98f9f2-8469-5d1d-b104-694efd7a1423\", \"relationship_name\": \"contains\"}}, {\"source\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"4e98f9f2-8469-5d1d-b104-694efd7a1423\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"4e98f9f2-8469-5d1d-b104-694efd7a1423\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target_node_id\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"4e98f9f2-8469-5d1d-b104-694efd7a1423\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"4e98f9f2-8469-5d1d-b104-694efd7a1423\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target\": \"fb3d7655-8d0f-51cb-8c04-1a0f6aa1eb96\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target_node_id\": \"fb3d7655-8d0f-51cb-8c04-1a0f6aa1eb96\", \"relationship_name\": \"contains\"}}, {\"source\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relationship_name\": \"contains\"}}, {\"source\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target\": \"d6afb0c2-4164-5622-ae37-cc40479ada3a\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target_node_id\": \"d6afb0c2-4164-5622-ae37-cc40479ada3a\", \"relationship_name\": \"contains\"}}, {\"source\": \"fb3d7655-8d0f-51cb-8c04-1a0f6aa1eb96\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"fb3d7655-8d0f-51cb-8c04-1a0f6aa1eb96\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"d6afb0c2-4164-5622-ae37-cc40479ada3a\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"d6afb0c2-4164-5622-ae37-cc40479ada3a\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"fb3d7655-8d0f-51cb-8c04-1a0f6aa1eb96\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"fb3d7655-8d0f-51cb-8c04-1a0f6aa1eb96\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"d6afb0c2-4164-5622-ae37-cc40479ada3a\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"d6afb0c2-4164-5622-ae37-cc40479ada3a\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target\": \"de6f76f9-5daf-5b57-8c7c-14bab7b2a823\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target_node_id\": \"de6f76f9-5daf-5b57-8c7c-14bab7b2a823\", \"relationship_name\": \"contains\"}}, {\"source\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target\": \"35a6dc80-4e60-59bc-81df-737f5599ba85\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target_node_id\": \"35a6dc80-4e60-59bc-81df-737f5599ba85\", \"relationship_name\": \"contains\"}}, {\"source\": \"de6f76f9-5daf-5b57-8c7c-14bab7b2a823\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"de6f76f9-5daf-5b57-8c7c-14bab7b2a823\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"de6f76f9-5daf-5b57-8c7c-14bab7b2a823\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"de6f76f9-5daf-5b57-8c7c-14bab7b2a823\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target\": \"6904c5a7-9be3-5a14-92cd-062d42be3f9f\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target_node_id\": \"6904c5a7-9be3-5a14-92cd-062d42be3f9f\", \"relationship_name\": \"contains\"}}, {\"source\": \"6904c5a7-9be3-5a14-92cd-062d42be3f9f\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6904c5a7-9be3-5a14-92cd-062d42be3f9f\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"6904c5a7-9be3-5a14-92cd-062d42be3f9f\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"6904c5a7-9be3-5a14-92cd-062d42be3f9f\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target\": \"109f56ad-10e5-566e-a190-b9563577cd26\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target_node_id\": \"109f56ad-10e5-566e-a190-b9563577cd26\", \"relationship_name\": \"contains\"}}, {\"source\": \"109f56ad-10e5-566e-a190-b9563577cd26\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"109f56ad-10e5-566e-a190-b9563577cd26\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"109f56ad-10e5-566e-a190-b9563577cd26\", \"target\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"109f56ad-10e5-566e-a190-b9563577cd26\", \"target_node_id\": \"fce67ae1-b0fd-56ac-82ae-f798e99387ad\", \"relationship_name\": \"is_a\"}}, {\"source\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relation\": \"is_part_of\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"target_node_id\": \"0e3b3446-ba35-5c74-a491-eac47acc6d98\", \"relationship_name\": \"is_part_of\"}}, {\"source\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relation\": \"applies_to\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"ontology_valid\": false, \"target_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"relationship_name\": \"applies_to\"}}, {\"source\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target\": \"479a2785-79a0-50c3-ac03-214899bcaecf\", \"relation\": \"has_pr_number\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"ontology_valid\": false, \"target_node_id\": \"479a2785-79a0-50c3-ac03-214899bcaecf\", \"relationship_name\": \"has_pr_number\"}}, {\"source\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"relation\": \"modifies\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"ontology_valid\": false, \"target_node_id\": \"62a86a36-c234-5d73-951c-8341f0781b68\", \"relationship_name\": \"modifies\"}}, {\"source\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target\": \"38a596c1-8f33-525d-bc4e-fab926efde68\", \"relation\": \"addresses\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"ontology_valid\": false, \"target_node_id\": \"38a596c1-8f33-525d-bc4e-fab926efde68\", \"relationship_name\": \"addresses\"}}, {\"source\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"relation\": \"updates_component\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"ontology_valid\": false, \"target_node_id\": \"ff28d9e1-b040-576c-a872-69dcf7f4cacf\", \"relationship_name\": \"updates_component\"}}, {\"source\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target\": \"b632ce2d-bcfd-5f0d-a880-2128c6d6dd96\", \"relation\": \"changes_process\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"ontology_valid\": false, \"target_node_id\": \"b632ce2d-bcfd-5f0d-a880-2128c6d6dd96\", \"relationship_name\": \"changes_process\"}}, {\"source\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target\": \"fb90d891-e2b0-53f6-b389-c96f685a0af1\", \"relation\": \"notes\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"ontology_valid\": false, \"target_node_id\": \"fb90d891-e2b0-53f6-b389-c96f685a0af1\", \"relationship_name\": \"notes\"}}, {\"source\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target\": \"d085fa79-190b-5a4f-963c-8f2e9c950ea2\", \"relation\": \"provides\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"ontology_valid\": false, \"target_node_id\": \"d085fa79-190b-5a4f-963c-8f2e9c950ea2\", \"relationship_name\": \"provides\"}}, {\"source\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"target\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relation\": \"date_of_pr\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"141aa520-c976-556e-9990-43d8c9ca6ea6\", \"ontology_valid\": false, \"target_node_id\": \"d61d99ac-b291-5666-9748-3e80e1c8b56a\", \"relationship_name\": \"date_of_pr\"}}, {\"source\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"target\": \"6388df2d-1882-5d4f-b870-d0a2fb4f0bb3\", \"relation\": \"references\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"ontology_valid\": false, \"target_node_id\": \"6388df2d-1882-5d4f-b870-d0a2fb4f0bb3\", \"relationship_name\": \"references\"}}, {\"source\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"target\": \"19df58d4-b1a8-5618-8a11-a00ce7766a27\", \"relation\": \"references\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"ontology_valid\": false, \"target_node_id\": \"19df58d4-b1a8-5618-8a11-a00ce7766a27\", \"relationship_name\": \"references\"}}, {\"source\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"target\": \"05e3f55c-af49-56fc-a9c5-fd923df5ac12\", \"relation\": \"uses\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"ontology_valid\": false, \"target_node_id\": \"05e3f55c-af49-56fc-a9c5-fd923df5ac12\", \"relationship_name\": \"uses\"}}, {\"source\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"target\": \"8254047d-6bcd-5747-b993-d27d0b20712f\", \"relation\": \"uses\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"ontology_valid\": false, \"target_node_id\": \"8254047d-6bcd-5747-b993-d27d0b20712f\", \"relationship_name\": \"uses\"}}, {\"source\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"target\": \"fb222ca1-605f-5e52-ac1e-70ab5dab4b46\", \"relation\": \"uses\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"ontology_valid\": false, \"target_node_id\": \"fb222ca1-605f-5e52-ac1e-70ab5dab4b46\", \"relationship_name\": \"uses\"}}, {\"source\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"target\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"relation\": \"collects\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"b6354e28-a7f8-5566-84ee-f40582f59708\", \"ontology_valid\": false, \"target_node_id\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"relationship_name\": \"collects\"}}, {\"source\": \"3ad21abe-aa18-5eda-93f3-851a52032f75\", \"target\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"relation\": \"adds_field\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"3ad21abe-aa18-5eda-93f3-851a52032f75\", \"ontology_valid\": false, \"target_node_id\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"relationship_name\": \"adds_field\"}}, {\"source\": \"3ad21abe-aa18-5eda-93f3-851a52032f75\", \"target\": \"fb222ca1-605f-5e52-ac1e-70ab5dab4b46\", \"relation\": \"adds_field\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"3ad21abe-aa18-5eda-93f3-851a52032f75\", \"ontology_valid\": false, \"target_node_id\": \"fb222ca1-605f-5e52-ac1e-70ab5dab4b46\", \"relationship_name\": \"adds_field\"}}, {\"source\": \"6388df2d-1882-5d4f-b870-d0a2fb4f0bb3\", \"target\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"relation\": \"can_reference_module\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"6388df2d-1882-5d4f-b870-d0a2fb4f0bb3\", \"ontology_valid\": false, \"target_node_id\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"relationship_name\": \"can_reference_module\"}}, {\"source\": \"19df58d4-b1a8-5618-8a11-a00ce7766a27\", \"target\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"relation\": \"can_reference_module\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"19df58d4-b1a8-5618-8a11-a00ce7766a27\", \"ontology_valid\": false, \"target_node_id\": \"c78a9c1d-9cab-595f-a516-fb7e4f812db4\", \"relationship_name\": \"can_reference_module\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"161c8390-d401-5ad4-83af-4e7fd015787c\", \"relation\": \"has_pr\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"ontology_valid\": false, \"target_node_id\": \"161c8390-d401-5ad4-83af-4e7fd015787c\", \"relationship_name\": \"has_pr\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"4671a160-3b7d-535d-a8ad-816573bdbf7e\", \"relation\": \"has_pr\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"ontology_valid\": false, \"target_node_id\": \"4671a160-3b7d-535d-a8ad-816573bdbf7e\", \"relationship_name\": \"has_pr\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"6aa08a11-b0e1-560b-8d55-0653d70f4cc2\", \"relation\": \"has_pr\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"ontology_valid\": false, \"target_node_id\": \"6aa08a11-b0e1-560b-8d55-0653d70f4cc2\", \"relationship_name\": \"has_pr\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"60095433-e631-5ecf-939c-1c3a3a6c8d82\", \"relation\": \"has_pr\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"ontology_valid\": false, \"target_node_id\": \"60095433-e631-5ecf-939c-1c3a3a6c8d82\", \"relationship_name\": \"has_pr\"}}, {\"source\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target\": \"abcdc7e7-a2d0-580e-b478-2214f0aca5e8\", \"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\": \"abcdc7e7-a2d0-580e-b478-2214f0aca5e8\", \"relationship_name\": \"modifies_file\"}}, {\"source\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target\": \"622d030a-0ba7-5309-916f-b741eaeeadbe\", \"relation\": \"adds_test_case\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"ontology_valid\": false, \"target_node_id\": \"622d030a-0ba7-5309-916f-b741eaeeadbe\", \"relationship_name\": \"adds_test_case\"}}, {\"source\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target\": \"ce101bc8-df05-5042-a79a-a38d8566457d\", \"relation\": \"references_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\": \"references_issue\"}}, {\"source\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"target\": \"ee739881-740c-5cba-8a4e-e163b0494025\", \"relation\": \"merged_on\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"81ea9442-3589-5bc6-995c-21abec5914ab\", \"ontology_valid\": false, \"target_node_id\": \"ee739881-740c-5cba-8a4e-e163b0494025\", \"relationship_name\": \"merged_on\"}}, {\"source\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"target\": \"31b7b4aa-50b4-5cdb-bc3b-0d266d67f136\", \"relation\": \"modifies_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"15d901bf-627e-5618-9bb1-ab76d51afd3e\", \"ontology_valid\": false, \"target_node_id\": \"31b7b4aa-50b4-5cdb-bc3b-0d266d67f136\", \"relationship_name\": \"modifies_file\"}}, {\"source\": \"555c90d6-201d-578a-9fff-eb3a12ae97d3\", \"target\": \"ee739881-740c-5cba-8a4e-e163b0494025\", \"relation\": \"committed_on\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"555c90d6-201d-578a-9fff-eb3a12ae97d3\", \"ontology_valid\": false, \"target_node_id\": \"ee739881-740c-5cba-8a4e-e163b0494025\", \"relationship_name\": \"committed_on\"}}, {\"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\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"relation\": \"modifies\", \"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\"}}, {\"source\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"target\": \"a6d135f0-e1b3-5387-837a-4628db693f14\", \"relation\": \"modifies\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"c5d0e4a5-57fc-5820-90a1-c587ba1c3b62\", \"ontology_valid\": false, \"target_node_id\": \"a6d135f0-e1b3-5387-837a-4628db693f14\", \"relationship_name\": \"modifies\"}}, {\"source\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"target\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"relation\": \"documents_change_in\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"377b12c0-6f73-5894-9a96-c19cce23a0b5\", \"ontology_valid\": false, \"target_node_id\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"relationship_name\": \"documents_change_in\"}}, {\"source\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"target\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"relation\": \"defined_by\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"ontology_valid\": false, \"target_node_id\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"relationship_name\": \"defined_by\"}}, {\"source\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"target\": \"73da2292-a404-5e28-aba2-8b9ecbc277d5\", \"relation\": \"returns_when_used_in_function_or_comprehension\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"ontology_valid\": false, \"target_node_id\": \"73da2292-a404-5e28-aba2-8b9ecbc277d5\", \"relationship_name\": \"returns_when_used_in_function_or_comprehension\"}}, {\"source\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"target\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"relation\": \"implements\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"ontology_valid\": false, \"target_node_id\": \"7168e84f-120a-5851-a9b1-cb6b6a956229\", \"relationship_name\": \"implements\"}}, {\"source\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"target\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"relation\": \"self\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"ontology_valid\": false, \"target_node_id\": \"5e4a5935-ea1d-5a61-b385-dbcc04aadd20\", \"relationship_name\": \"self\"}}, {\"source\": \"4e98f9f2-8469-5d1d-b104-694efd7a1423\", \"target\": \"d6afb0c2-4164-5622-ae37-cc40479ada3a\", \"relation\": \"added_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"4e98f9f2-8469-5d1d-b104-694efd7a1423\", \"ontology_valid\": false, \"target_node_id\": \"d6afb0c2-4164-5622-ae37-cc40479ada3a\", \"relationship_name\": \"added_file\"}}, {\"source\": \"fb3d7655-8d0f-51cb-8c04-1a0f6aa1eb96\", \"target\": \"35a6dc80-4e60-59bc-81df-737f5599ba85\", \"relation\": \"modified_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"fb3d7655-8d0f-51cb-8c04-1a0f6aa1eb96\", \"ontology_valid\": false, \"target_node_id\": \"35a6dc80-4e60-59bc-81df-737f5599ba85\", \"relationship_name\": \"modified_file\"}}, {\"source\": \"de6f76f9-5daf-5b57-8c7c-14bab7b2a823\", \"target\": \"cf64ea2e-0fdc-5c2a-bdbd-7008b48cebaf\", \"relation\": \"modified_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"de6f76f9-5daf-5b57-8c7c-14bab7b2a823\", \"ontology_valid\": false, \"target_node_id\": \"cf64ea2e-0fdc-5c2a-bdbd-7008b48cebaf\", \"relationship_name\": \"modified_file\"}}, {\"source\": \"6904c5a7-9be3-5a14-92cd-062d42be3f9f\", \"target\": \"cf64ea2e-0fdc-5c2a-bdbd-7008b48cebaf\", \"relation\": \"reverted_change_on_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"6904c5a7-9be3-5a14-92cd-062d42be3f9f\", \"ontology_valid\": false, \"target_node_id\": \"cf64ea2e-0fdc-5c2a-bdbd-7008b48cebaf\", \"relationship_name\": \"reverted_change_on_file\"}}, {\"source\": \"109f56ad-10e5-566e-a190-b9563577cd26\", \"target\": \"35a6dc80-4e60-59bc-81df-737f5599ba85\", \"relation\": \"reverted_change_on_file\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"109f56ad-10e5-566e-a190-b9563577cd26\", \"ontology_valid\": false, \"target_node_id\": \"35a6dc80-4e60-59bc-81df-737f5599ba85\", \"relationship_name\": \"reverted_change_on_file\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"4e98f9f2-8469-5d1d-b104-694efd7a1423\", \"relation\": \"has_commit\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"ontology_valid\": false, \"target_node_id\": \"4e98f9f2-8469-5d1d-b104-694efd7a1423\", \"relationship_name\": \"has_commit\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"fb3d7655-8d0f-51cb-8c04-1a0f6aa1eb96\", \"relation\": \"has_commit\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"ontology_valid\": false, \"target_node_id\": \"fb3d7655-8d0f-51cb-8c04-1a0f6aa1eb96\", \"relationship_name\": \"has_commit\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"de6f76f9-5daf-5b57-8c7c-14bab7b2a823\", \"relation\": \"has_commit\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"ontology_valid\": false, \"target_node_id\": \"de6f76f9-5daf-5b57-8c7c-14bab7b2a823\", \"relationship_name\": \"has_commit\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"6904c5a7-9be3-5a14-92cd-062d42be3f9f\", \"relation\": \"has_commit\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"ontology_valid\": false, \"target_node_id\": \"6904c5a7-9be3-5a14-92cd-062d42be3f9f\", \"relationship_name\": \"has_commit\"}}, {\"source\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"target\": \"109f56ad-10e5-566e-a190-b9563577cd26\", \"relation\": \"has_commit\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"source_node_id\": \"49d95d69-8f36-5209-add2-b47f3c1a4c64\", \"ontology_valid\": false, \"target_node_id\": \"109f56ad-10e5-566e-a190-b9563577cd26\", \"relationship_name\": \"has_commit\"}}, {\"source\": \"a4dddaf1-d485-550e-a9a8-b2c03c21f4bf\", \"target\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:19\", \"source_node_id\": \"a4dddaf1-d485-550e-a9a8-b2c03c21f4bf\", \"target_node_id\": \"cfac008a-590d-532e-bc8e-42ae7b8bfb5f\", \"relationship_name\": \"made_from\"}}, {\"source\": \"42fa2f93-dfe4-58e3-a023-a7e1c42985de\", \"target\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:19\", \"source_node_id\": \"42fa2f93-dfe4-58e3-a023-a7e1c42985de\", \"target_node_id\": \"8bc13664-b755-5997-9481-00eeaafd79a9\", \"relationship_name\": \"made_from\"}}, {\"source\": \"9f1d41c6-2ce8-5565-a636-37c62662b0e5\", \"target\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:19\", \"source_node_id\": \"9f1d41c6-2ce8-5565-a636-37c62662b0e5\", \"target_node_id\": \"5c165f64-31ec-5e3e-b9a7-4ee3366ca562\", \"relationship_name\": \"made_from\"}}, {\"source\": \"85d5304e-3012-5a03-ba2b-32c0cf00a00b\", \"target\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:19\", \"source_node_id\": \"85d5304e-3012-5a03-ba2b-32c0cf00a00b\", \"target_node_id\": \"6922515f-8e8d-5ab5-8e69-a91551553f1e\", \"relationship_name\": \"made_from\"}}, {\"source\": \"bf7bc50d-208e-54ab-9981-cdc0bbecc6fd\", \"target\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:19\", \"source_node_id\": \"bf7bc50d-208e-54ab-9981-cdc0bbecc6fd\", \"target_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"relationship_name\": \"made_from\"}}, {\"source\": \"6ef1c3e1-d2ea-5ad4-9120-fdf0c8db691b\", \"target\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"relation\": \"made_from\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:19\", \"source_node_id\": \"6ef1c3e1-d2ea-5ad4-9120-fdf0c8db691b\", \"target_node_id\": \"28dae116-2846-5652-ab2e-aae37913d3fe\", \"relationship_name\": \"made_from\"}}, {\"source\": \"35a6dc80-4e60-59bc-81df-737f5599ba85\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"35a6dc80-4e60-59bc-81df-737f5599ba85\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"35a6dc80-4e60-59bc-81df-737f5599ba85\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"35a6dc80-4e60-59bc-81df-737f5599ba85\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"a6d135f0-e1b3-5387-837a-4628db693f14\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"a6d135f0-e1b3-5387-837a-4628db693f14\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"a6d135f0-e1b3-5387-837a-4628db693f14\", \"target\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"a6d135f0-e1b3-5387-837a-4628db693f14\", \"target_node_id\": \"6b8d3127-518d-57e3-a2b8-3a0748c5c73c\", \"relationship_name\": \"is_a\"}}, {\"source\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target_node_id\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"relationship_name\": \"contains\"}}, {\"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 11:55:10\", \"source_node_id\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"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 11:55:10\", \"source_node_id\": \"3be05098-9848-5ae3-86d0-61ad5690d32f\", \"target_node_id\": \"c173fcdb-8139-5426-b0b1-dd5013704063\", \"relationship_name\": \"is_a\"}}, {\"source\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target_node_id\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"relationship_name\": \"contains\"}}, {\"source\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"target\": \"36152967-e061-549d-975f-c91c1378deb9\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"82ee3c48-a1eb-53b3-a4a5-22cf3012a0ee\", \"target_node_id\": \"36152967-e061-549d-975f-c91c1378deb9\", \"relationship_name\": \"is_a\"}}, {\"source\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target\": \"73da2292-a404-5e28-aba2-8b9ecbc277d5\", \"relation\": \"contains\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"eb0f80da-2855-5f96-acb7-171d9c33f470\", \"target_node_id\": \"73da2292-a404-5e28-aba2-8b9ecbc277d5\", \"relationship_name\": \"contains\"}}, {\"source\": \"73da2292-a404-5e28-aba2-8b9ecbc277d5\", \"target\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relation\": \"belongs_to_set\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"73da2292-a404-5e28-aba2-8b9ecbc277d5\", \"target_node_id\": \"addd828f-90d1-5016-a5d9-5130986d98e8\", \"relationship_name\": \"belongs_to_set\"}}, {\"source\": \"73da2292-a404-5e28-aba2-8b9ecbc277d5\", \"target\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relation\": \"is_a\", \"weight\": null, \"all_weights\": {}, \"relationship_type\": null, \"edge_info\": {\"updated_at\": \"2025-09-07 11:55:10\", \"source_node_id\": \"73da2292-a404-5e28-aba2-8b9ecbc277d5\", \"target_node_id\": \"dd9713b7-dc20-5101-aad0-1c4216811147\", \"relationship_name\": \"is_a\"}}];\\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": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 7
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T11:55:51.971412Z",
"start_time": "2025-09-07T11:55:51.966222Z"
}
},
"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 0x17bb3cef0>"
],
"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": 8
},
{
"metadata": {},
"cell_type": "markdown",
"source": [
"**Why visualization matters:** Knowledge graphs reveal hidden patterns in data. In this case, patterins in Guido's contributions to 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": "Now we'll add 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:56:24.445525Z",
"start_time": "2025-09-07T11:56:03.584840Z"
}
},
"cell_type": "code",
"source": [
"await cognee.add(\"file://data/copilot_conversations.json\", node_set=[\"developer_data\"])\n",
"await cognee.add(\"file://data/my_developer_rules.md\", node_set=[\"developer_data\"])\n",
"await cognee.add(\"file://data/zen_principles.md\", node_set=[\"principles_data\"])\n",
"await cognee.add(\"file://data/pep_style_guide.md\", node_set=[\"principles_data\"])\n",
"\n",
"await cognee.cognify()"
],
"id": "5315318324968f0f",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"\u001B[2m2025-09-07T11:56:03.636275\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run started: `f5ca7c7d-08ef-584f-a745-891dcc728073`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.637065\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `resolve_data_directories`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.637392\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `ingest_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.652328\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `ingest_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.652727\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `resolve_data_directories`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.653007\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run completed: `f5ca7c7d-08ef-584f-a745-891dcc728073`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.711636\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run started: `f5ca7c7d-08ef-584f-a745-891dcc728073`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.712201\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `resolve_data_directories`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.712555\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `ingest_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.723866\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `ingest_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.724268\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `resolve_data_directories`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.724611\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run completed: `f5ca7c7d-08ef-584f-a745-891dcc728073`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.755905\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run started: `f5ca7c7d-08ef-584f-a745-891dcc728073`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.756284\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `resolve_data_directories`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.756685\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `ingest_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.767895\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `ingest_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.768252\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `resolve_data_directories`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.768520\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run completed: `f5ca7c7d-08ef-584f-a745-891dcc728073`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.801806\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run started: `f5ca7c7d-08ef-584f-a745-891dcc728073`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.802166\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `resolve_data_directories`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.802468\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `ingest_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.812704\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `ingest_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.813054\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `resolve_data_directories`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.813379\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run completed: `f5ca7c7d-08ef-584f-a745-891dcc728073`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.820869\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-07T11:56:03.838218\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run started: `7233180e-8575-54d0-bee4-700ba5f5de42`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.838593\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `classify_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.838956\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `check_permissions_on_dataset`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.840133\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run started: `7233180e-8575-54d0-bee4-700ba5f5de42`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.840463\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `classify_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.840788\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `check_permissions_on_dataset`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.841272\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run started: `7233180e-8575-54d0-bee4-700ba5f5de42`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.841545\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `classify_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.841774\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `check_permissions_on_dataset`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.842389\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run started: `7233180e-8575-54d0-bee4-700ba5f5de42`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.842624\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `classify_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.843063\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `check_permissions_on_dataset`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.856804\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task started: `extract_chunks_from_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.862163\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task started: `extract_chunks_from_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.864341\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task started: `extract_chunks_from_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.867652\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task started: `extract_chunks_from_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.878616\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `extract_graph_from_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.905587\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `extract_graph_from_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.915328\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `extract_graph_from_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:03.940779\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `extract_graph_from_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:07.294325\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'document' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:07.295957\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'assistant guidelines' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:07.296933\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'spec.md' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:09.092344\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 80 nodes and 214 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:09.774410\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'concept' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:09.775032\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'the zen of python' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:09.775519\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'person' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:09.775956\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'tim peters' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:09.776405\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'principles' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:09.776843\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'modern python tie-ins' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:09.777435\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'quick review checklist' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:10.061598\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `summarize_text`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:11.577685\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 88 nodes and 226 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:12.551947\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `summarize_text`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:12.894396\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_data_points`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.937846\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'styleguide' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.939242\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'pep 8 style guide' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.940158\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'concept' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.941087\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'code layout' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.941932\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'imports' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.942672\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'whitespace' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.943424\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'naming' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.944069\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'comments and docstrings' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.944700\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'type hints' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.945319\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'tooling' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.945917\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'common violations' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.946485\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'codeexample' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.947083\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'hanging indent example' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.947625\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'imports example' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.948310\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'whitespace example' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.948788\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'docstring example' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.990684\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'concept' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.991329\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'async/await patterns' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.991704\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'library' in category 'classes'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.992055\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'aiohttp' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.992374\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'semaphore' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.992681\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'context manager' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.992975\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'pydantic' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.993285\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'dataclass' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.993583\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'fastapi' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.993908\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'pytest-asyncio' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.994174\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'performance optimization' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.994529\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'error handling' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.994733\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'tcpconnector' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.995023\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'retry logic' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.995271\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'html parsing' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:13.995562\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mNo close match found for 'sqlalchemy' in category 'individuals'\u001B[0m [\u001B[0m\u001B[1m\u001B[34mOntologyAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:14.912139\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 89 nodes and 231 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:15.661925\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_data_points`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:15.816155\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_data_points`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:15.816765\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `summarize_text`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:15.817045\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `extract_graph_from_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:15.817451\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task completed: `extract_chunks_from_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:15.817758\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `check_permissions_on_dataset`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:15.817988\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `classify_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:15.818206\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run completed: `7233180e-8575-54d0-bee4-700ba5f5de42`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:15.884291\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 106 nodes and 260 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:16.096303\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 123 nodes and 287 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:17.216211\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `summarize_text`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:17.273588\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `summarize_text`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:18.281748\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 124 nodes and 312 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:19.288421\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_data_points`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:19.288925\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `summarize_text`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:19.289246\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `extract_graph_from_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:19.289608\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task completed: `extract_chunks_from_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:19.289921\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `check_permissions_on_dataset`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:19.290242\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `classify_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:19.290464\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run completed: `7233180e-8575-54d0-bee4-700ba5f5de42`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:21.079114\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_data_points`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:21.108303\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_data_points`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:23.441693\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 126 nodes and 314 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:23.453053\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 126 nodes and 314 edges in 0.05 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.411975\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_data_points`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.412403\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `summarize_text`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.412745\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `extract_graph_from_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.413023\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task completed: `extract_chunks_from_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.413307\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `check_permissions_on_dataset`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.413565\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `classify_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.413803\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run completed: `7233180e-8575-54d0-bee4-700ba5f5de42`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.429816\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_data_points`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.430172\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `summarize_text`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.430413\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `extract_graph_from_data`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.430683\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task completed: `extract_chunks_from_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.430929\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `check_permissions_on_dataset`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.431204\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `classify_documents`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:56:24.431443\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run completed: `7233180e-8575-54d0-bee4-700ba5f5de42`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n"
]
},
{
"data": {
"text/plain": [
"{UUID('727f2c35-93eb-57f9-8f66-8856c9ae95e3'): PipelineRunCompleted(status='PipelineRunCompleted', pipeline_run_id=UUID('7cef3d5b-e7fe-5fb1-ad08-43ff407c9e44'), dataset_id=UUID('727f2c35-93eb-57f9-8f66-8856c9ae95e3'), dataset_name='main_dataset', payload=None, data_ingestion_info=[{'run_info': PipelineRunCompleted(status='PipelineRunCompleted', pipeline_run_id=UUID('7cef3d5b-e7fe-5fb1-ad08-43ff407c9e44'), dataset_id=UUID('727f2c35-93eb-57f9-8f66-8856c9ae95e3'), dataset_name='main_dataset', payload=None, data_ingestion_info=None), 'data_id': UUID('06812f34-2873-557f-86c9-debcc5b618c9')}, {'run_info': PipelineRunAlreadyCompleted(status='PipelineRunAlreadyCompleted', pipeline_run_id=UUID('7cef3d5b-e7fe-5fb1-ad08-43ff407c9e44'), dataset_id=UUID('727f2c35-93eb-57f9-8f66-8856c9ae95e3'), dataset_name='main_dataset', payload=None, data_ingestion_info=None), 'data_id': UUID('0e3b3446-ba35-5c74-a491-eac47acc6d98')}, {'run_info': PipelineRunCompleted(status='PipelineRunCompleted', pipeline_run_id=UUID('7cef3d5b-e7fe-5fb1-ad08-43ff407c9e44'), dataset_id=UUID('727f2c35-93eb-57f9-8f66-8856c9ae95e3'), dataset_name='main_dataset', payload=None, data_ingestion_info=None), 'data_id': UUID('27467b8e-9b7c-5ca1-9b2e-0d2ca315446f')}, {'run_info': PipelineRunCompleted(status='PipelineRunCompleted', pipeline_run_id=UUID('7cef3d5b-e7fe-5fb1-ad08-43ff407c9e44'), dataset_id=UUID('727f2c35-93eb-57f9-8f66-8856c9ae95e3'), dataset_name='main_dataset', payload=None, data_ingestion_info=None), 'data_id': UUID('460f2065-b267-56f7-a1c0-c7515d326dac')}, {'run_info': PipelineRunCompleted(status='PipelineRunCompleted', pipeline_run_id=UUID('7cef3d5b-e7fe-5fb1-ad08-43ff407c9e44'), dataset_id=UUID('727f2c35-93eb-57f9-8f66-8856c9ae95e3'), dataset_name='main_dataset', payload=None, data_ingestion_info=None), 'data_id': UUID('c20e772c-9313-57af-974b-2068cdfe19e8')}])}"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 9
},
{
"metadata": {},
"cell_type": "markdown",
"source": "",
"id": "98b9b613d6d11bc5"
},
{
"metadata": {
"ExecuteTime": {
"end_time": "2025-09-07T12:02:50.808174Z",
"start_time": "2025-09-07T12:02:47.323752Z"
}
},
"cell_type": "code",
"source": [
"results = await cognee.search(\n",
" \"What Python type hinting challenges did I face, and how does Guido approach similar problems in mypy?\",\n",
" query_type=cognee.SearchType.GRAPH_COMPLETION\n",
")\n",
"print(results)"
],
"id": "98b69c45db2fca3",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"\u001B[2m2025-09-07T12:02:47.514797\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 158 nodes and 379 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T12:02:47.517739\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mGraph projection completed: 158 nodes, 379 edges in 0.03s\u001B[0m [\u001B[0m\u001B[1m\u001B[34mCogneeGraph\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T12:02:48.187870\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": [
"['Acknowledged.']\n"
]
}
],
"execution_count": 14
},
{
"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": {
"ExecuteTime": {
"end_time": "2025-09-07T11:59:45.337944Z",
"start_time": "2025-09-07T11:57:54.805696Z"
}
},
"cell_type": "code",
"source": "await cognee.memify()",
"id": "20234960f7566b15",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"\u001B[2m2025-09-07T11:57:54.862996\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 126 nodes and 314 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:57:54.865110\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mGraph projection completed: 126 nodes, 314 edges in 0.03s\u001B[0m [\u001B[0m\u001B[1m\u001B[34mCogneeGraph\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:57:54.886755\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run started: `af2e3872-55fb-5cbb-b0dc-0a13d0b9b1bd`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:57:54.887389\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task started: `extract_subgraph_chunks`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:57:54.887914\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:04.375679\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 131 nodes and 318 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:05.428516\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 131 nodes and 322 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:06.414586\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:06.415131\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:06.431621\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 5 nodes and 4 edges for NodeSet in 0.01 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:13.285793\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 134 nodes and 325 edges in 0.06 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:14.299334\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 134 nodes and 328 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:15.255634\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:15.256386\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:15.278329\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 8 nodes and 7 edges for NodeSet in 0.01 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:24.608953\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 139 nodes and 333 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:25.817327\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 139 nodes and 338 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:26.805980\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:26.806649\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:26.822555\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 13 nodes and 12 edges for NodeSet in 0.01 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:35.652805\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 142 nodes and 341 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:36.686147\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 142 nodes and 344 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:37.699798\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:37.700712\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:37.718775\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 16 nodes and 15 edges for NodeSet in 0.01 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:51.576721\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 145 nodes and 347 edges in 0.07 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:52.568566\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 145 nodes and 350 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:53.516969\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:53.517455\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:58:53.542532\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 19 nodes and 18 edges for NodeSet in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:08.426235\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 148 nodes and 353 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:09.560436\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 148 nodes and 356 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:10.503615\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:10.504130\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:10.513761\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 22 nodes and 21 edges for NodeSet in 0.01 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:16.601704\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 151 nodes and 359 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:17.605849\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 151 nodes and 362 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:18.869401\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:18.870007\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:18.882199\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 25 nodes and 24 edges for NodeSet in 0.01 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:24.709820\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 151 nodes and 362 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:25.731473\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 151 nodes and 365 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:26.769884\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:26.770412\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:26.782453\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 25 nodes and 24 edges for NodeSet in 0.01 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:33.591001\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 154 nodes and 368 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:35.111361\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 154 nodes and 371 edges in 0.02 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:35.719330\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:35.719937\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task started: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:35.732641\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 28 nodes and 27 edges for NodeSet in 0.01 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:43.575467\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 158 nodes and 375 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:44.732779\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 158 nodes and 379 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:45.326267\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mCoroutine task completed: `add_rule_associations`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:45.326932\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mAsync Generator task completed: `extract_subgraph_chunks`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_base\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T11:59:45.327231\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mPipeline run completed: `af2e3872-55fb-5cbb-b0dc-0a13d0b9b1bd`\u001B[0m [\u001B[0m\u001B[1m\u001B[34mrun_tasks_with_telemetry()\u001B[0m]\u001B[0m\n"
]
},
{
"data": {
"text/plain": [
"{UUID('727f2c35-93eb-57f9-8f66-8856c9ae95e3'): PipelineRunCompleted(status='PipelineRunCompleted', pipeline_run_id=UUID('85d185c7-8cf8-5e85-9894-7938a80c9acf'), dataset_id=UUID('727f2c35-93eb-57f9-8f66-8856c9ae95e3'), dataset_name='main_dataset', payload=None, data_ingestion_info=[{'run_info': PipelineRunCompleted(status='PipelineRunCompleted', pipeline_run_id=UUID('85d185c7-8cf8-5e85-9894-7938a80c9acf'), dataset_id=UUID('727f2c35-93eb-57f9-8f66-8856c9ae95e3'), dataset_name='main_dataset', payload=None, data_ingestion_info=None)}])}"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"execution_count": 12
},
{
"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": {
"ExecuteTime": {
"end_time": "2025-09-07T12:03:12.333024Z",
"start_time": "2025-09-07T12:03:09.975414Z"
}
},
"cell_type": "code",
"source": [
"# Search for connections between your async patterns and Python philosophy\n",
"results = await cognee.search(\n",
" \"How does my AsyncWebScraper implementation align with Python's design principles?\",\n",
" query_type=cognee.SearchType.GRAPH_COMPLETION\n",
")\n",
"print(\"Python Pattern Analysis:\", results)"
],
"id": "518fa9b17a604657",
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\n",
"\u001B[2m2025-09-07T12:03:10.069706\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mRetrieved 158 nodes and 379 edges in 0.03 seconds\u001B[0m [\u001B[0m\u001B[1m\u001B[34mNeo4jAdapter\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T12:03:10.073335\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mGraph projection completed: 158 nodes, 379 edges in 0.04s\u001B[0m [\u001B[0m\u001B[1m\u001B[34mCogneeGraph\u001B[0m]\u001B[0m\n",
"\n",
"\u001B[2m2025-09-07T12:03:10.606712\u001B[0m [\u001B[32m\u001B[1minfo \u001B[0m] \u001B[1mVector collection retrieval completed: Retrieved distances from 6 collections in 0.07s\u001B[0m [\u001B[0m\u001B[1m\u001B[34mcognee.shared.logging_utils\u001B[0m]\u001B[0m\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Python Pattern Analysis: ['Analyzing alignment of AsyncWebScraper with Python design principles...']\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"/var/folders/b6/fdg52thn3h309cbg6kv5nryc0000gn/T/ipykernel_78432/1153209151.py:2: RuntimeWarning: coroutine 'search' was never awaited\n",
" results = await cognee.search(\n",
"RuntimeWarning: Enable tracemalloc to get the object allocation traceback\n"
]
}
],
"execution_count": 16
},
{
"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
}