{
  "built_at_commit": "8d81f84a85f25c657f501e2b1561b319d6009f37",
  "edges": [
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/api/models.py",
      "evidence": [
        {
          "end_line": 9,
          "file": "app/api/admin.py",
          "start_line": 9
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api/admin.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/api/models.py#app.api.models.IngestResponse",
      "evidence": [
        {
          "end_line": 9,
          "file": "app/api/admin.py",
          "start_line": 9
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/admin.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 10,
          "file": "app/api/admin.py",
          "start_line": 10
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api/admin.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 10,
          "file": "app/api/admin.py",
          "start_line": 10
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/admin.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/ingestion/crawler.py",
      "evidence": [
        {
          "end_line": 11,
          "file": "app/api/admin.py",
          "start_line": 11
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api/admin.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.IngestReport",
      "evidence": [
        {
          "end_line": 11,
          "file": "app/api/admin.py",
          "start_line": 11
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/admin.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor",
      "evidence": [
        {
          "end_line": 11,
          "file": "app/api/admin.py",
          "start_line": 11
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/admin.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.load_topics",
      "evidence": [
        {
          "end_line": 11,
          "file": "app/api/admin.py",
          "start_line": 11
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/admin.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/tracing.py",
      "evidence": [
        {
          "end_line": 40,
          "file": "app/api/admin.py",
          "start_line": 40
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api/admin.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/tracing.py#app.services.tracing.langfuse_client",
      "evidence": [
        {
          "end_line": 40,
          "file": "app/api/admin.py",
          "start_line": 40
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/admin.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare",
        "sites": "3"
      },
      "context": "call",
      "dst": "app/api/admin.py#app.api.admin._merge",
      "evidence": [
        {
          "end_line": 53,
          "file": "app/api/admin.py",
          "start_line": 53
        },
        {
          "end_line": 57,
          "file": "app/api/admin.py",
          "start_line": 57
        },
        {
          "end_line": 59,
          "file": "app/api/admin.py",
          "start_line": 59
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/admin.py#app.api.admin.ingest"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/models.py#app.api.models.IngestResponse",
      "evidence": [
        {
          "end_line": 65,
          "file": "app/api/admin.py",
          "start_line": 65
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/admin.py#app.api.admin.ingest"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 31,
          "file": "app/api/admin.py",
          "start_line": 31
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/admin.py#app.api.admin.ingest"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.IngestReport",
      "evidence": [
        {
          "end_line": 37,
          "file": "app/api/admin.py",
          "start_line": 37
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/admin.py#app.api.admin.ingest"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor",
      "evidence": [
        {
          "end_line": 36,
          "file": "app/api/admin.py",
          "start_line": 36
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/admin.py#app.api.admin.ingest"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.load_topics",
      "evidence": [
        {
          "end_line": 57,
          "file": "app/api/admin.py",
          "start_line": 57
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/admin.py#app.api.admin.ingest"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/tracing.py#app.services.tracing.langfuse_client",
      "evidence": [
        {
          "end_line": 42,
          "file": "app/api/admin.py",
          "start_line": 42
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/admin.py#app.api.admin.ingest"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/api/models.py",
      "evidence": [
        {
          "end_line": 27,
          "file": "app/api/chat.py",
          "start_line": 27
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api/chat.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/api/models.py#app.api.models.ChatRequest",
      "evidence": [
        {
          "end_line": 27,
          "file": "app/api/chat.py",
          "start_line": 27
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/chat.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 28,
          "file": "app/api/chat.py",
          "start_line": 28
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api/chat.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 28,
          "file": "app/api/chat.py",
          "start_line": 28
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/chat.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/evaluation.py",
      "evidence": [
        {
          "end_line": 185,
          "file": "app/api/chat.py",
          "start_line": 185
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api/chat.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/evaluation.py#app.services.evaluation.evaluate_and_score",
      "evidence": [
        {
          "end_line": 185,
          "file": "app/api/chat.py",
          "start_line": 185
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/chat.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/tracing.py",
      "evidence": [
        {
          "end_line": 29,
          "file": "app/api/chat.py",
          "start_line": 29
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api/chat.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/tracing.py#app.services.tracing.attach_citations",
      "evidence": [
        {
          "end_line": 29,
          "file": "app/api/chat.py",
          "start_line": 29
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/chat.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/tracing.py#app.services.tracing.make_chat_handler",
      "evidence": [
        {
          "end_line": 29,
          "file": "app/api/chat.py",
          "start_line": 29
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/chat.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation.evaluate_and_score",
      "evidence": [
        {
          "end_line": 191,
          "file": "app/api/chat.py",
          "start_line": 191
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/chat.py#app.api.chat._schedule_scoring"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/chat.py#app.api.chat._resolve_skill",
      "evidence": [
        {
          "end_line": 98,
          "file": "app/api/chat.py",
          "start_line": 98
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/chat.py#app.api.chat.chat"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/chat.py#app.api.chat._within_rate_limit",
      "evidence": [
        {
          "end_line": 95,
          "file": "app/api/chat.py",
          "start_line": 95
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/chat.py#app.api.chat.chat"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/chat.py#app.api.chat.chat.event_stream",
      "evidence": [
        {
          "end_line": 179,
          "file": "app/api/chat.py",
          "start_line": 179
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/chat.py#app.api.chat.chat"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/tracing.py#app.services.tracing.make_chat_handler",
      "evidence": [
        {
          "end_line": 110,
          "file": "app/api/chat.py",
          "start_line": 110
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/chat.py#app.api.chat.chat"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/chat.py#app.api.chat._schedule_scoring",
      "evidence": [
        {
          "end_line": 177,
          "file": "app/api/chat.py",
          "start_line": 177
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/chat.py#app.api.chat.chat.event_stream"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 176,
          "file": "app/api/chat.py",
          "start_line": 176
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/chat.py#app.api.chat.chat.event_stream"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/tracing.py#app.services.tracing.attach_citations",
      "evidence": [
        {
          "end_line": 166,
          "file": "app/api/chat.py",
          "start_line": 166
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/chat.py#app.api.chat.chat.event_stream"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/api/models.py",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/api/conversations.py",
          "start_line": 19
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api/conversations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/api/models.py#app.api.models.ConversationBucket",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/api/conversations.py",
          "start_line": 19
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/conversations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/api/models.py#app.api.models.ConversationDetail",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/api/conversations.py",
          "start_line": 19
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/conversations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/api/models.py#app.api.models.ConversationListResponse",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/api/conversations.py",
          "start_line": 19
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/conversations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/api/models.py#app.api.models.ConversationMessage",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/api/conversations.py",
          "start_line": 19
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/conversations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/api/models.py#app.api.models.ConversationSummary",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/api/conversations.py",
          "start_line": 19
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/conversations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 26,
          "file": "app/api/conversations.py",
          "start_line": 26
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api/conversations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 26,
          "file": "app/api/conversations.py",
          "start_line": 26
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/conversations.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/conversations.py#app.api.conversations._first_user_question",
      "evidence": [
        {
          "end_line": 91,
          "file": "app/api/conversations.py",
          "start_line": 91
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations._summary"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/conversations.py#app.api.conversations._split_thread",
      "evidence": [
        {
          "end_line": 84,
          "file": "app/api/conversations.py",
          "start_line": 84
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations._summary"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/models.py#app.api.models.ConversationSummary",
      "evidence": [
        {
          "end_line": 87,
          "file": "app/api/conversations.py",
          "start_line": 87
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations._summary"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/conversations.py#app.api.conversations._first_user_question",
      "evidence": [
        {
          "end_line": 158,
          "file": "app/api/conversations.py",
          "start_line": 158
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations.get_conversation"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/conversations.py#app.api.conversations._split_thread",
      "evidence": [
        {
          "end_line": 142,
          "file": "app/api/conversations.py",
          "start_line": 142
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations.get_conversation"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/models.py#app.api.models.ConversationDetail",
      "evidence": [
        {
          "end_line": 154,
          "file": "app/api/conversations.py",
          "start_line": 154
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations.get_conversation"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/models.py#app.api.models.ConversationMessage",
      "evidence": [
        {
          "end_line": 146,
          "file": "app/api/conversations.py",
          "start_line": 146
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations.get_conversation"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/conversations.py#app.api.conversations._bucket_for",
      "evidence": [
        {
          "end_line": 119,
          "file": "app/api/conversations.py",
          "start_line": 119
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations.list_conversations"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/conversations.py#app.api.conversations._summary",
      "evidence": [
        {
          "end_line": 105,
          "file": "app/api/conversations.py",
          "start_line": 105
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations.list_conversations"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/models.py#app.api.models.ConversationBucket",
      "evidence": [
        {
          "end_line": 122,
          "file": "app/api/conversations.py",
          "start_line": 122
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations.list_conversations"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/models.py#app.api.models.ConversationListResponse",
      "evidence": [
        {
          "end_line": 126,
          "file": "app/api/conversations.py",
          "start_line": 126
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations.list_conversations"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 101,
          "file": "app/api/conversations.py",
          "start_line": 101
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/conversations.py#app.api.conversations.list_conversations"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/api/models.py",
      "evidence": [
        {
          "end_line": 7,
          "file": "app/api/skills.py",
          "start_line": 7
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api/skills.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/api/models.py#app.api.models.SkillInfo",
      "evidence": [
        {
          "end_line": 7,
          "file": "app/api/skills.py",
          "start_line": 7
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/api/skills.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/api/models.py#app.api.models.SkillInfo",
      "evidence": [
        {
          "end_line": 16,
          "file": "app/api/skills.py",
          "start_line": 16
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/api/skills.py#app.api.skills.list_skills"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.Settings",
      "evidence": [
        {
          "end_line": 117,
          "file": "app/config.py",
          "start_line": 117
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/config.py#app.config.get_settings"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 30,
          "file": "app/eval/offline.py",
          "start_line": 30
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 30,
          "file": "app/eval/offline.py",
          "start_line": 30
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/eval/offline.py#app.eval.offline.main",
      "evidence": [
        {
          "end_line": 209,
          "file": "app/eval/offline.py",
          "start_line": 209
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/main.py",
      "evidence": [
        {
          "end_line": 31,
          "file": "app/eval/offline.py",
          "start_line": 31
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/main.py#app.main.build_runtime",
      "evidence": [
        {
          "end_line": 31,
          "file": "app/eval/offline.py",
          "start_line": 31
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/evaluation.py",
      "evidence": [
        {
          "end_line": 37,
          "file": "app/eval/offline.py",
          "start_line": 32
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/evaluation.py#app.services.evaluation._metric_name",
      "evidence": [
        {
          "end_line": 37,
          "file": "app/eval/offline.py",
          "start_line": 32
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/evaluation.py#app.services.evaluation.build_judge",
      "evidence": [
        {
          "end_line": 37,
          "file": "app/eval/offline.py",
          "start_line": 32
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/evaluation.py#app.services.evaluation.offline_metrics",
      "evidence": [
        {
          "end_line": 37,
          "file": "app/eval/offline.py",
          "start_line": 32
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/evaluation.py#app.services.evaluation.score_test_case",
      "evidence": [
        {
          "end_line": 37,
          "file": "app/eval/offline.py",
          "start_line": 32
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/tracing.py",
      "evidence": [
        {
          "end_line": 38,
          "file": "app/eval/offline.py",
          "start_line": 38
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/tracing.py#app.services.tracing.langfuse_client",
      "evidence": [
        {
          "end_line": 38,
          "file": "app/eval/offline.py",
          "start_line": 38
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/tracing.py#app.services.tracing.make_chat_handler",
      "evidence": [
        {
          "end_line": 38,
          "file": "app/eval/offline.py",
          "start_line": 38
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/eval/offline.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/tracing.py#app.services.tracing.make_chat_handler",
      "evidence": [
        {
          "end_line": 76,
          "file": "app/eval/offline.py",
          "start_line": 76
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline._run_graph"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/eval/offline.py#app.eval.offline.run",
      "evidence": [
        {
          "end_line": 205,
          "file": "app/eval/offline.py",
          "start_line": 205
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.main"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 144,
          "file": "app/eval/offline.py",
          "start_line": 144
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.run"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/eval/offline.py#app.eval.offline._ensure_dataset",
      "evidence": [
        {
          "end_line": 161,
          "file": "app/eval/offline.py",
          "start_line": 161
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.run"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/eval/offline.py#app.eval.offline._load_golden",
      "evidence": [
        {
          "end_line": 147,
          "file": "app/eval/offline.py",
          "start_line": 147
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.run"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/eval/offline.py#app.eval.offline._print_summary",
      "evidence": [
        {
          "end_line": 197,
          "file": "app/eval/offline.py",
          "start_line": 197
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.run"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/eval/offline.py#app.eval.offline._run_graph",
      "evidence": [
        {
          "end_line": 169,
          "file": "app/eval/offline.py",
          "start_line": 169
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.run"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/main.py#app.main.build_runtime",
      "evidence": [
        {
          "end_line": 164,
          "file": "app/eval/offline.py",
          "start_line": 164
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.run"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation._metric_name",
      "evidence": [
        {
          "end_line": 157,
          "file": "app/eval/offline.py",
          "start_line": 157
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.run"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation.build_judge",
      "evidence": [
        {
          "end_line": 155,
          "file": "app/eval/offline.py",
          "start_line": 155
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.run"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation.offline_metrics",
      "evidence": [
        {
          "end_line": 156,
          "file": "app/eval/offline.py",
          "start_line": 156
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.run"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation.score_test_case",
      "evidence": [
        {
          "end_line": 180,
          "file": "app/eval/offline.py",
          "start_line": 180
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.run"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/tracing.py#app.services.tracing.langfuse_client",
      "evidence": [
        {
          "end_line": 159,
          "file": "app/eval/offline.py",
          "start_line": 159
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/eval/offline.py#app.eval.offline.run"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/graph/nodes.py",
      "evidence": [
        {
          "end_line": 12,
          "file": "app/graph/build.py",
          "start_line": 12
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/graph/nodes.py#app.graph.nodes.RagNodes",
      "evidence": [
        {
          "end_line": 12,
          "file": "app/graph/build.py",
          "start_line": 12
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/graph/nodes.py#app.graph.nodes.route_after_grade",
      "evidence": [
        {
          "end_line": 12,
          "file": "app/graph/build.py",
          "start_line": 12
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/graph/nodes.py#app.graph.nodes.route_reflect",
      "evidence": [
        {
          "end_line": 12,
          "file": "app/graph/build.py",
          "start_line": 12
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/graph/state.py",
      "evidence": [
        {
          "end_line": 13,
          "file": "app/graph/build.py",
          "start_line": 13
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/graph/state.py#app.graph.state.GraphState",
      "evidence": [
        {
          "end_line": 13,
          "file": "app/graph/build.py",
          "start_line": 13
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/milvus_store.py",
      "evidence": [
        {
          "end_line": 14,
          "file": "app/graph/build.py",
          "start_line": 14
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore",
      "evidence": [
        {
          "end_line": 14,
          "file": "app/graph/build.py",
          "start_line": 14
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/reranker.py",
      "evidence": [
        {
          "end_line": 15,
          "file": "app/graph/build.py",
          "start_line": 15
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/reranker.py#app.services.reranker.Reranker",
      "evidence": [
        {
          "end_line": 15,
          "file": "app/graph/build.py",
          "start_line": 15
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/websearch.py",
      "evidence": [
        {
          "end_line": 16,
          "file": "app/graph/build.py",
          "start_line": 16
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService",
      "evidence": [
        {
          "end_line": 16,
          "file": "app/graph/build.py",
          "start_line": 16
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/skills/registry.py",
      "evidence": [
        {
          "end_line": 17,
          "file": "app/graph/build.py",
          "start_line": 17
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/skills/registry.py#app.skills.registry.SkillRegistry",
      "evidence": [
        {
          "end_line": 17,
          "file": "app/graph/build.py",
          "start_line": 17
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/build.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare",
        "sites": "12"
      },
      "context": "call",
      "dst": "app/graph/build.py#app.graph.build._timed",
      "evidence": [
        {
          "end_line": 58,
          "file": "app/graph/build.py",
          "start_line": 58
        },
        {
          "end_line": 59,
          "file": "app/graph/build.py",
          "start_line": 59
        },
        {
          "end_line": 60,
          "file": "app/graph/build.py",
          "start_line": 60
        },
        {
          "end_line": 61,
          "file": "app/graph/build.py",
          "start_line": 61
        },
        {
          "end_line": 62,
          "file": "app/graph/build.py",
          "start_line": 62
        },
        {
          "end_line": 63,
          "file": "app/graph/build.py",
          "start_line": 63
        },
        {
          "end_line": 64,
          "file": "app/graph/build.py",
          "start_line": 64
        },
        {
          "end_line": 65,
          "file": "app/graph/build.py",
          "start_line": 65
        },
        {
          "end_line": 66,
          "file": "app/graph/build.py",
          "start_line": 66
        },
        {
          "end_line": 67,
          "file": "app/graph/build.py",
          "start_line": 67
        },
        {
          "end_line": 68,
          "file": "app/graph/build.py",
          "start_line": 68
        },
        {
          "end_line": 69,
          "file": "app/graph/build.py",
          "start_line": 69
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/build.py#app.graph.build.build_graph"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes.RagNodes",
      "evidence": [
        {
          "end_line": 55,
          "file": "app/graph/build.py",
          "start_line": 55
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/build.py#app.graph.build.build_graph"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 17,
          "file": "app/graph/nodes.py",
          "start_line": 17
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 17,
          "file": "app/graph/nodes.py",
          "start_line": 17
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/graph/__init__.py",
      "evidence": [
        {
          "end_line": 18,
          "file": "app/graph/nodes.py",
          "start_line": 18
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/graph/prompts.py",
      "evidence": [
        {
          "end_line": 18,
          "file": "app/graph/nodes.py",
          "start_line": 18
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/graph/state.py",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/graph/nodes.py",
          "start_line": 20
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/graph/state.py#app.graph.state.Document",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/graph/nodes.py",
          "start_line": 20
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/graph/state.py#app.graph.state.GraphState",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/graph/nodes.py",
          "start_line": 20
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/citations.py",
      "evidence": [
        {
          "end_line": 19,
          "file": "app/graph/nodes.py",
          "start_line": 19
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/citations.py#app.services.citations.citation_link",
      "evidence": [
        {
          "end_line": 19,
          "file": "app/graph/nodes.py",
          "start_line": 19
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/milvus_store.py",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/graph/nodes.py",
          "start_line": 21
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/graph/nodes.py",
          "start_line": 21
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.source_filter",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/graph/nodes.py",
          "start_line": 21
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/ollama_llm.py",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/graph/nodes.py",
          "start_line": 22
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/ollama_llm.py#app.services.ollama_llm.build_chat_llm",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/graph/nodes.py",
          "start_line": 22
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/ollama_llm.py#app.services.ollama_llm.build_embeddings",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/graph/nodes.py",
          "start_line": 22
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/reranker.py",
      "evidence": [
        {
          "end_line": 23,
          "file": "app/graph/nodes.py",
          "start_line": 23
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/reranker.py#app.services.reranker.RerankCandidate",
      "evidence": [
        {
          "end_line": 23,
          "file": "app/graph/nodes.py",
          "start_line": 23
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/reranker.py#app.services.reranker.Reranker",
      "evidence": [
        {
          "end_line": 23,
          "file": "app/graph/nodes.py",
          "start_line": 23
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/websearch.py",
      "evidence": [
        {
          "end_line": 24,
          "file": "app/graph/nodes.py",
          "start_line": 24
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService",
      "evidence": [
        {
          "end_line": 24,
          "file": "app/graph/nodes.py",
          "start_line": 24
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/skills/registry.py",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/graph/nodes.py",
          "start_line": 25
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/skills/registry.py#app.skills.registry.SkillRegistry",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/graph/nodes.py",
          "start_line": 25
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/graph/nodes.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 44,
          "file": "app/graph/nodes.py",
          "start_line": 44
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.__init__"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare",
        "sites": "2"
      },
      "context": "call",
      "dst": "app/services/ollama_llm.py#app.services.ollama_llm.build_chat_llm",
      "evidence": [
        {
          "end_line": 50,
          "file": "app/graph/nodes.py",
          "start_line": 50
        },
        {
          "end_line": 51,
          "file": "app/graph/nodes.py",
          "start_line": 51
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.__init__"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/ollama_llm.py#app.services.ollama_llm.build_embeddings",
      "evidence": [
        {
          "end_line": 49,
          "file": "app/graph/nodes.py",
          "start_line": 49
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.__init__"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/citations.py#app.services.citations.citation_link",
      "evidence": [
        {
          "end_line": 181,
          "file": "app/graph/nodes.py",
          "start_line": 181
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.build_context._add"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes._status",
      "evidence": [
        {
          "end_line": 83,
          "file": "app/graph/nodes.py",
          "start_line": 83
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.contextualize"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes._status",
      "evidence": [
        {
          "end_line": 209,
          "file": "app/graph/nodes.py",
          "start_line": 209
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.generate"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes._status",
      "evidence": [
        {
          "end_line": 128,
          "file": "app/graph/nodes.py",
          "start_line": 128
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.grade_documents"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes._status",
      "evidence": [
        {
          "end_line": 252,
          "file": "app/graph/nodes.py",
          "start_line": 252
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.prepare_regen"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes._status",
      "evidence": [
        {
          "end_line": 226,
          "file": "app/graph/nodes.py",
          "start_line": 226
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.reflect"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes.RagNodes._rerank",
      "evidence": [
        {
          "end_line": 124,
          "file": "app/graph/nodes.py",
          "start_line": 124
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.rerank_vector"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes._status",
      "evidence": [
        {
          "end_line": 119,
          "file": "app/graph/nodes.py",
          "start_line": 119
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.rerank_vector"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/reranker.py#app.services.reranker.RerankCandidate",
      "evidence": [
        {
          "end_line": 123,
          "file": "app/graph/nodes.py",
          "start_line": 123
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.rerank_vector"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes._status",
      "evidence": [
        {
          "end_line": 98,
          "file": "app/graph/nodes.py",
          "start_line": 98
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.retrieve_vector"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.source_filter",
      "evidence": [
        {
          "end_line": 102,
          "file": "app/graph/nodes.py",
          "start_line": 102
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.retrieve_vector"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes._status",
      "evidence": [
        {
          "end_line": 256,
          "file": "app/graph/nodes.py",
          "start_line": 256
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.rewrite_query"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes.RagNodes._rerank",
      "evidence": [
        {
          "end_line": 167,
          "file": "app/graph/nodes.py",
          "start_line": 167
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.web_search"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/nodes.py#app.graph.nodes._status",
      "evidence": [
        {
          "end_line": 144,
          "file": "app/graph/nodes.py",
          "start_line": 144
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.web_search"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/reranker.py#app.services.reranker.RerankCandidate",
      "evidence": [
        {
          "end_line": 156,
          "file": "app/graph/nodes.py",
          "start_line": 156
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.RagNodes.web_search"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 279,
          "file": "app/graph/nodes.py",
          "start_line": 279
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.route_after_grade"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 304,
          "file": "app/graph/nodes.py",
          "start_line": 304
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#app.graph.nodes.route_reflect"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/cache.py",
      "evidence": [
        {
          "end_line": 18,
          "file": "app/ingestion/crawler.py",
          "start_line": 18
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/cache.py#app.services.cache.CacheService",
      "evidence": [
        {
          "end_line": 18,
          "file": "app/ingestion/crawler.py",
          "start_line": 18
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/milvus_store.py",
      "evidence": [
        {
          "end_line": 19,
          "file": "app/ingestion/crawler.py",
          "start_line": 19
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore",
      "evidence": [
        {
          "end_line": 19,
          "file": "app/ingestion/crawler.py",
          "start_line": 19
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.content_hash",
      "evidence": [
        {
          "end_line": 19,
          "file": "app/ingestion/crawler.py",
          "start_line": 19
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/ollama_llm.py",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/ingestion/crawler.py",
          "start_line": 20
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/ollama_llm.py#app.services.ollama_llm.build_embeddings",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/ingestion/crawler.py",
          "start_line": 20
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/websearch.py",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/ingestion/crawler.py",
          "start_line": 21
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/ingestion/crawler.py",
          "start_line": 21
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/skills/registry.py",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/ingestion/crawler.py",
          "start_line": 22
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/skills/registry.py#app.skills.registry.Skill",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/ingestion/crawler.py",
          "start_line": 22
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/skills/registry.py#app.skills.registry.parse_frontmatter",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/ingestion/crawler.py",
          "start_line": 22
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/ollama_llm.py#app.services.ollama_llm.build_embeddings",
      "evidence": [
        {
          "end_line": 83,
          "file": "app/ingestion/crawler.py",
          "start_line": 83
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.__init__"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.chunk_text",
      "evidence": [
        {
          "end_line": 105,
          "file": "app/ingestion/crawler.py",
          "start_line": 105
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor._upsert_doc"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.content_hash",
      "evidence": [
        {
          "end_line": 98,
          "file": "app/ingestion/crawler.py",
          "start_line": 98
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor._upsert_doc"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor._upsert_doc",
      "evidence": [
        {
          "end_line": 185,
          "file": "app/ingestion/crawler.py",
          "start_line": 185
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_references"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler._host",
      "evidence": [
        {
          "end_line": 176,
          "file": "app/ingestion/crawler.py",
          "start_line": 176
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_references"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/skills/registry.py#app.skills.registry.parse_frontmatter",
      "evidence": [
        {
          "end_line": 167,
          "file": "app/ingestion/crawler.py",
          "start_line": 167
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_references"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.IngestReport",
      "evidence": [
        {
          "end_line": 198,
          "file": "app/ingestion/crawler.py",
          "start_line": 198
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_skill"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_references",
      "evidence": [
        {
          "end_line": 200,
          "file": "app/ingestion/crawler.py",
          "start_line": 200
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_skill"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_topic",
      "evidence": [
        {
          "end_line": 206,
          "file": "app/ingestion/crawler.py",
          "start_line": 206
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_skill"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor._upsert_doc",
      "evidence": [
        {
          "end_line": 149,
          "file": "app/ingestion/crawler.py",
          "start_line": 149
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_topic"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler._host",
      "evidence": [
        {
          "end_line": 156,
          "file": "app/ingestion/crawler.py",
          "start_line": 156
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_topic"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.IngestReport",
      "evidence": [
        {
          "end_line": 218,
          "file": "app/ingestion/crawler.py",
          "start_line": 218
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.run"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_topic",
      "evidence": [
        {
          "end_line": 221,
          "file": "app/ingestion/crawler.py",
          "start_line": 221
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.run"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 20
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 20
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/ingestion/crawler.py",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 21
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.IngestReport",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 21
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 21
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.load_topics",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 21
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main",
      "evidence": [
        {
          "end_line": 89,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 89
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/cache.py",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 22
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/cache.py#app.services.cache.CacheService",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 22
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/milvus_store.py",
      "evidence": [
        {
          "end_line": 23,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 23
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore",
      "evidence": [
        {
          "end_line": 23,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 23
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/tracing.py",
      "evidence": [
        {
          "end_line": 50,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 50
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/tracing.py#app.services.tracing.langfuse_client",
      "evidence": [
        {
          "end_line": 50,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 50
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/websearch.py",
      "evidence": [
        {
          "end_line": 24,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 24
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService",
      "evidence": [
        {
          "end_line": 24,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 24
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/skills/registry.py",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 25
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/skills/registry.py#app.skills.registry.SkillRegistry",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 25
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 41,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 41
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.IngestReport",
      "evidence": [
        {
          "end_line": 48,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 48
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor",
      "evidence": [
        {
          "end_line": 46,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 46
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare",
        "sites": "2"
      },
      "context": "call",
      "dst": "app/ingestion/crawler.py#app.ingestion.crawler.load_topics",
      "evidence": [
        {
          "end_line": 60,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 60
        },
        {
          "end_line": 70,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 70
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare",
        "sites": "4"
      },
      "context": "call",
      "dst": "app/ingestion/run_ingest.py#app.ingestion.run_ingest._merge",
      "evidence": [
        {
          "end_line": 60,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 60
        },
        {
          "end_line": 65,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 65
        },
        {
          "end_line": 70,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 70
        },
        {
          "end_line": 73,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 73
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "qualified"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache.CacheService.from_url",
      "evidence": [
        {
          "end_line": 42,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 42
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "qualified"
      },
      "context": "call",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.connect",
      "evidence": [
        {
          "end_line": 43,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 43
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/tracing.py#app.services.tracing.langfuse_client",
      "evidence": [
        {
          "end_line": 52,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 52
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService",
      "evidence": [
        {
          "end_line": 44,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 44
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "qualified"
      },
      "context": "call",
      "dst": "app/skills/registry.py#app.skills.registry.SkillRegistry.load",
      "evidence": [
        {
          "end_line": 45,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 45
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/api/__init__.py",
      "evidence": [
        {
          "end_line": 19,
          "file": "app/main.py",
          "start_line": 19
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/api/admin.py",
      "evidence": [
        {
          "end_line": 19,
          "file": "app/main.py",
          "start_line": 19
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/api/chat.py",
      "evidence": [
        {
          "end_line": 19,
          "file": "app/main.py",
          "start_line": 19
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/api/conversations.py",
      "evidence": [
        {
          "end_line": 19,
          "file": "app/main.py",
          "start_line": 19
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/api/skills.py",
      "evidence": [
        {
          "end_line": 19,
          "file": "app/main.py",
          "start_line": 19
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/main.py",
          "start_line": 20
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/main.py",
          "start_line": 20
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/graph/build.py",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/main.py",
          "start_line": 21
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/graph/build.py#app.graph.build.build_graph",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/main.py",
          "start_line": 21
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/main.py#app.main.create_app",
      "evidence": [
        {
          "end_line": 110,
          "file": "app/main.py",
          "start_line": 110
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/cache.py",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/main.py",
          "start_line": 22
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/cache.py#app.services.cache.CacheService",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/main.py",
          "start_line": 22
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/milvus_store.py",
      "evidence": [
        {
          "end_line": 23,
          "file": "app/main.py",
          "start_line": 23
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore",
      "evidence": [
        {
          "end_line": 23,
          "file": "app/main.py",
          "start_line": 23
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/reranker.py",
      "evidence": [
        {
          "end_line": 24,
          "file": "app/main.py",
          "start_line": 24
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/reranker.py#app.services.reranker.Reranker",
      "evidence": [
        {
          "end_line": 24,
          "file": "app/main.py",
          "start_line": 24
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/websearch.py",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/main.py",
          "start_line": 25
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/main.py",
          "start_line": 25
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/skills/registry.py",
      "evidence": [
        {
          "end_line": 26,
          "file": "app/main.py",
          "start_line": 26
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/skills/registry.py#app.skills.registry.SkillRegistry",
      "evidence": [
        {
          "end_line": 26,
          "file": "app/main.py",
          "start_line": 26
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/main.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 49,
          "file": "app/main.py",
          "start_line": 49
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/main.py#app.main.build_runtime"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/build.py#app.graph.build.build_graph",
      "evidence": [
        {
          "end_line": 72,
          "file": "app/main.py",
          "start_line": 72
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/main.py#app.main.build_runtime"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/main.py#app.main.Runtime",
      "evidence": [
        {
          "end_line": 74,
          "file": "app/main.py",
          "start_line": 74
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/main.py#app.main.build_runtime"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "qualified"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache.CacheService.from_url",
      "evidence": [
        {
          "end_line": 58,
          "file": "app/main.py",
          "start_line": 58
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/main.py#app.main.build_runtime"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "qualified"
      },
      "context": "call",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.connect",
      "evidence": [
        {
          "end_line": 56,
          "file": "app/main.py",
          "start_line": 56
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/main.py#app.main.build_runtime"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "qualified"
      },
      "context": "call",
      "dst": "app/services/reranker.py#app.services.reranker.Reranker.load",
      "evidence": [
        {
          "end_line": 53,
          "file": "app/main.py",
          "start_line": 53
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/main.py#app.main.build_runtime"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService",
      "evidence": [
        {
          "end_line": 61,
          "file": "app/main.py",
          "start_line": 61
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/main.py#app.main.build_runtime"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "qualified"
      },
      "context": "call",
      "dst": "app/skills/registry.py#app.skills.registry.SkillRegistry.load",
      "evidence": [
        {
          "end_line": 63,
          "file": "app/main.py",
          "start_line": 63
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/main.py#app.main.build_runtime"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 86,
          "file": "app/main.py",
          "start_line": 86
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/main.py#app.main.lifespan"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/main.py#app.main.build_runtime",
      "evidence": [
        {
          "end_line": 89,
          "file": "app/main.py",
          "start_line": 89
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/main.py#app.main.lifespan"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/services/cache.py",
          "start_line": 20
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/services/cache.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/services/cache.py",
          "start_line": 20
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/services/cache.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 36,
          "file": "app/services/cache.py",
          "start_line": 36
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.__init__"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache._key",
      "evidence": [
        {
          "end_line": 54,
          "file": "app/services/cache.py",
          "start_line": 54
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.check_rate_limit"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache.CacheService.get_json",
      "evidence": [
        {
          "end_line": 74,
          "file": "app/services/cache.py",
          "start_line": 74
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.get_embedding"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache._hash",
      "evidence": [
        {
          "end_line": 62,
          "file": "app/services/cache.py",
          "start_line": 62
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.get_json"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache._key",
      "evidence": [
        {
          "end_line": 62,
          "file": "app/services/cache.py",
          "start_line": 62
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.get_json"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache._hash",
      "evidence": [
        {
          "end_line": 81,
          "file": "app/services/cache.py",
          "start_line": 81
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.get_seen_hash"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache._key",
      "evidence": [
        {
          "end_line": 81,
          "file": "app/services/cache.py",
          "start_line": 81
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.get_seen_hash"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache.CacheService.set_json",
      "evidence": [
        {
          "end_line": 77,
          "file": "app/services/cache.py",
          "start_line": 77
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.set_embedding"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache._hash",
      "evidence": [
        {
          "end_line": 69,
          "file": "app/services/cache.py",
          "start_line": 69
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.set_json"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache._key",
      "evidence": [
        {
          "end_line": 69,
          "file": "app/services/cache.py",
          "start_line": 69
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.set_json"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache._hash",
      "evidence": [
        {
          "end_line": 84,
          "file": "app/services/cache.py",
          "start_line": 84
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.set_seen_hash"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/cache.py#app.services.cache._key",
      "evidence": [
        {
          "end_line": 84,
          "file": "app/services/cache.py",
          "start_line": 84
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/cache.py#app.services.cache.CacheService.set_seen_hash"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare",
        "sites": "2"
      },
      "context": "call",
      "dst": "app/services/citations.py#app.services.citations._encode",
      "evidence": [
        {
          "end_line": 39,
          "file": "app/services/citations.py",
          "start_line": 39
        },
        {
          "end_line": 44,
          "file": "app/services/citations.py",
          "start_line": 44
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/citations.py#app.services.citations.build_text_fragment"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/citations.py#app.services.citations.build_text_fragment",
      "evidence": [
        {
          "end_line": 61,
          "file": "app/services/citations.py",
          "start_line": 61
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/citations.py#app.services.citations.citation_link"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 23,
          "file": "app/services/evaluation.py",
          "start_line": 23
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/services/evaluation.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 23,
          "file": "app/services/evaluation.py",
          "start_line": 23
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/services/evaluation.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/ollama_llm.py",
      "evidence": [
        {
          "end_line": 24,
          "file": "app/services/evaluation.py",
          "start_line": 24
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/services/evaluation.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/ollama_llm.py#app.services.ollama_llm.build_eval_llm",
      "evidence": [
        {
          "end_line": 24,
          "file": "app/services/evaluation.py",
          "start_line": 24
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/services/evaluation.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/tracing.py",
      "evidence": [
        {
          "end_line": 204,
          "file": "app/services/evaluation.py",
          "start_line": 204
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/services/evaluation.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/tracing.py#app.services.tracing.langfuse_client",
      "evidence": [
        {
          "end_line": 204,
          "file": "app/services/evaluation.py",
          "start_line": 204
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/services/evaluation.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation.build_judge._LangchainJudge",
      "evidence": [
        {
          "end_line": 74,
          "file": "app/services/evaluation.py",
          "start_line": 74
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/evaluation.py#app.services.evaluation.build_judge"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/ollama_llm.py#app.services.ollama_llm.build_eval_llm",
      "evidence": [
        {
          "end_line": 74,
          "file": "app/services/evaluation.py",
          "start_line": 74
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/evaluation.py#app.services.evaluation.build_judge"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation.build_judge",
      "evidence": [
        {
          "end_line": 206,
          "file": "app/services/evaluation.py",
          "start_line": 206
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/evaluation.py#app.services.evaluation.evaluate_and_score"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation.live_metrics",
      "evidence": [
        {
          "end_line": 214,
          "file": "app/services/evaluation.py",
          "start_line": 214
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/evaluation.py#app.services.evaluation.evaluate_and_score"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation.score_test_case",
      "evidence": [
        {
          "end_line": 213,
          "file": "app/services/evaluation.py",
          "start_line": 213
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/evaluation.py#app.services.evaluation.evaluate_and_score"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/tracing.py#app.services.tracing.langfuse_client",
      "evidence": [
        {
          "end_line": 212,
          "file": "app/services/evaluation.py",
          "start_line": 212
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/evaluation.py#app.services.evaluation.evaluate_and_score"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 119,
          "file": "app/services/evaluation.py",
          "start_line": 119
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/evaluation.py#app.services.evaluation.live_metrics"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation._geval_metrics",
      "evidence": [
        {
          "end_line": 118,
          "file": "app/services/evaluation.py",
          "start_line": 118
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/evaluation.py#app.services.evaluation.live_metrics"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation._geval_metrics",
      "evidence": [
        {
          "end_line": 151,
          "file": "app/services/evaluation.py",
          "start_line": 151
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/evaluation.py#app.services.evaluation.offline_metrics"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/evaluation.py#app.services.evaluation._metric_name",
      "evidence": [
        {
          "end_line": 179,
          "file": "app/services/evaluation.py",
          "start_line": 179
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/evaluation.py#app.services.evaluation.score_test_case"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 16,
          "file": "app/services/milvus_store.py",
          "start_line": 16
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/services/milvus_store.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 16,
          "file": "app/services/milvus_store.py",
          "start_line": 16
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/services/milvus_store.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 80,
          "file": "app/services/milvus_store.py",
          "start_line": 80
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.connect"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore._has_expected_fields",
      "evidence": [
        {
          "end_line": 89,
          "file": "app/services/milvus_store.py",
          "start_line": 89
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.ensure_collection"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.chunk_id",
      "evidence": [
        {
          "end_line": 216,
          "file": "app/services/milvus_store.py",
          "start_line": 216
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.replace_document"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/milvus_store.py#app.services.milvus_store._quote_list",
      "evidence": [
        {
          "end_line": 65,
          "file": "app/services/milvus_store.py",
          "start_line": 65
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/milvus_store.py#app.services.milvus_store.source_filter"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 18,
          "file": "app/services/ollama_llm.py",
          "start_line": 18
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/services/ollama_llm.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 18,
          "file": "app/services/ollama_llm.py",
          "start_line": 18
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/services/ollama_llm.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 27,
          "file": "app/services/ollama_llm.py",
          "start_line": 27
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/ollama_llm.py#app.services.ollama_llm.build_chat_llm"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 78,
          "file": "app/services/ollama_llm.py",
          "start_line": 78
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/ollama_llm.py#app.services.ollama_llm.build_embeddings"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 56,
          "file": "app/services/ollama_llm.py",
          "start_line": 56
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/ollama_llm.py#app.services.ollama_llm.build_eval_llm"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 12,
          "file": "app/services/reranker.py",
          "start_line": 12
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/services/reranker.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 12,
          "file": "app/services/reranker.py",
          "start_line": 12
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/services/reranker.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 37,
          "file": "app/services/reranker.py",
          "start_line": 37
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/reranker.py#app.services.reranker.Reranker.load"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 12,
          "file": "app/services/tracing.py",
          "start_line": 12
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/services/tracing.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 12,
          "file": "app/services/tracing.py",
          "start_line": 12
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/services/tracing.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/tracing.py#app.services.tracing.langfuse_client",
      "evidence": [
        {
          "end_line": 66,
          "file": "app/services/tracing.py",
          "start_line": 66
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/tracing.py#app.services.tracing.attach_citations"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 89,
          "file": "app/services/tracing.py",
          "start_line": 89
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/tracing.py#app.services.tracing.langfuse_client"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/tracing.py#app.services.tracing.tracing_enabled",
      "evidence": [
        {
          "end_line": 84,
          "file": "app/services/tracing.py",
          "start_line": 84
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/tracing.py#app.services.tracing.langfuse_client"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 33,
          "file": "app/services/tracing.py",
          "start_line": 33
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/tracing.py#app.services.tracing.make_chat_handler"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/tracing.py#app.services.tracing.tracing_enabled",
      "evidence": [
        {
          "end_line": 28,
          "file": "app/services/tracing.py",
          "start_line": 28
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/tracing.py#app.services.tracing.make_chat_handler"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 18,
          "file": "app/services/tracing.py",
          "start_line": 18
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/tracing.py#app.services.tracing.tracing_enabled"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/services/websearch.py",
          "start_line": 25
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/services/websearch.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/services/websearch.py",
          "start_line": 25
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/services/websearch.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/cache.py",
      "evidence": [
        {
          "end_line": 26,
          "file": "app/services/websearch.py",
          "start_line": 26
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/services/websearch.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/cache.py#app.services.cache.CacheService",
      "evidence": [
        {
          "end_line": 26,
          "file": "app/services/websearch.py",
          "start_line": 26
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/services/websearch.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 40,
          "file": "app/services/websearch.py",
          "start_line": 40
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/websearch.py#app.services.websearch.WebSearchService.__init__"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService._host_allowed",
      "evidence": [
        {
          "end_line": 117,
          "file": "app/services/websearch.py",
          "start_line": 117
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/websearch.py#app.services.websearch.WebSearchService._fetch_and_extract"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService._ddg_search",
      "evidence": [
        {
          "end_line": 150,
          "file": "app/services/websearch.py",
          "start_line": 150
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/websearch.py#app.services.websearch.WebSearchService.search"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService._domains",
      "evidence": [
        {
          "end_line": 149,
          "file": "app/services/websearch.py",
          "start_line": 149
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/websearch.py#app.services.websearch.WebSearchService.search"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService._host_allowed",
      "evidence": [
        {
          "end_line": 152,
          "file": "app/services/websearch.py",
          "start_line": 152
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/websearch.py#app.services.websearch.WebSearchService.search"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/websearch.py#app.services.websearch.WebDocument",
      "evidence": [
        {
          "end_line": 162,
          "file": "app/services/websearch.py",
          "start_line": 162
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/websearch.py#app.services.websearch.WebSearchService.search._build"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "self"
      },
      "context": "call",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService._fetch_and_extract",
      "evidence": [
        {
          "end_line": 157,
          "file": "app/services/websearch.py",
          "start_line": 157
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/services/websearch.py#app.services.websearch.WebSearchService.search._build"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/skills/registry.py",
      "evidence": [
        {
          "end_line": 3,
          "file": "app/skills/__init__.py",
          "start_line": 3
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/skills/__init__.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/skills/registry.py#app.skills.registry.Skill",
      "evidence": [
        {
          "end_line": 3,
          "file": "app/skills/__init__.py",
          "start_line": 3
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/skills/__init__.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/skills/registry.py#app.skills.registry.SkillRegistry",
      "evidence": [
        {
          "end_line": 3,
          "file": "app/skills/__init__.py",
          "start_line": 3
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/skills/__init__.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/skills/registry.py",
          "start_line": 21
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/skills/registry.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/skills/registry.py",
          "start_line": 21
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "app/skills/registry.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/config.py#app.config.get_settings",
      "evidence": [
        {
          "end_line": 71,
          "file": "app/skills/registry.py",
          "start_line": 71
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/skills/registry.py#app.skills.registry.SkillRegistry.load"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/skills/registry.py#app.skills.registry.Skill",
      "evidence": [
        {
          "end_line": 88,
          "file": "app/skills/registry.py",
          "start_line": 88
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/skills/registry.py#app.skills.registry.SkillRegistry.load"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/skills/registry.py#app.skills.registry._resolve_skills_dir",
      "evidence": [
        {
          "end_line": 72,
          "file": "app/skills/registry.py",
          "start_line": 72
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "app/skills/registry.py#app.skills.registry.SkillRegistry.load"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "depends_on",
      "dst": "docker-compose.yml#service.milvus-standalone",
      "evidence": [
        {
          "end_line": 86,
          "file": "docker-compose.yml",
          "start_line": 86
        }
      ],
      "kind": "depends_on",
      "resolution": "resolved",
      "src": "docker-compose.yml#service.api"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "depends_on",
      "dst": "docker-compose.yml#service.redis",
      "evidence": [
        {
          "end_line": 88,
          "file": "docker-compose.yml",
          "start_line": 88
        }
      ],
      "kind": "depends_on",
      "resolution": "resolved",
      "src": "docker-compose.yml#service.api"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "depends_on",
      "dst": "docker-compose.yml#service.milvus-standalone",
      "evidence": [
        {
          "end_line": 98,
          "file": "docker-compose.yml",
          "start_line": 98
        }
      ],
      "kind": "depends_on",
      "resolution": "resolved",
      "src": "docker-compose.yml#service.attu"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "depends_on",
      "dst": "docker-compose.yml#service.langfuse-db",
      "evidence": [
        {
          "end_line": 143,
          "file": "docker-compose.yml",
          "start_line": 143
        }
      ],
      "kind": "depends_on",
      "resolution": "resolved",
      "src": "docker-compose.yml#service.langfuse"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "depends_on",
      "dst": "docker-compose.yml#service.etcd",
      "evidence": [
        {
          "end_line": 47,
          "file": "docker-compose.yml",
          "start_line": 47
        }
      ],
      "kind": "depends_on",
      "resolution": "resolved",
      "src": "docker-compose.yml#service.milvus-standalone"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "depends_on",
      "dst": "docker-compose.yml#service.minio",
      "evidence": [
        {
          "end_line": 48,
          "file": "docker-compose.yml",
          "start_line": 48
        }
      ],
      "kind": "depends_on",
      "resolution": "resolved",
      "src": "docker-compose.yml#service.milvus-standalone"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "scripts/download_models.py#scripts.download_models.main",
      "evidence": [
        {
          "end_line": 50,
          "file": "scripts/download_models.py",
          "start_line": 50
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "scripts/download_models.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/graph/build.py",
      "evidence": [
        {
          "end_line": 23,
          "file": "scripts/export_graph.py",
          "start_line": 23
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "scripts/export_graph.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/graph/build.py#app.graph.build.build_graph",
      "evidence": [
        {
          "end_line": 23,
          "file": "scripts/export_graph.py",
          "start_line": 23
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "scripts/export_graph.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/skills/registry.py",
      "evidence": [
        {
          "end_line": 24,
          "file": "scripts/export_graph.py",
          "start_line": 24
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "scripts/export_graph.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/skills/registry.py#app.skills.registry.SkillRegistry",
      "evidence": [
        {
          "end_line": 24,
          "file": "scripts/export_graph.py",
          "start_line": 24
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "scripts/export_graph.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "scripts/export_graph.py#scripts.export_graph.main",
      "evidence": [
        {
          "end_line": 50,
          "file": "scripts/export_graph.py",
          "start_line": 50
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "scripts/export_graph.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/graph/build.py#app.graph.build.build_graph",
      "evidence": [
        {
          "end_line": 34,
          "file": "scripts/export_graph.py",
          "start_line": 34
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "scripts/export_graph.py#scripts.export_graph.main"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "qualified"
      },
      "context": "call",
      "dst": "app/skills/registry.py#app.skills.registry.SkillRegistry.load",
      "evidence": [
        {
          "end_line": 33,
          "file": "scripts/export_graph.py",
          "start_line": 33
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "scripts/export_graph.py#scripts.export_graph.main"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/citations.py",
      "evidence": [
        {
          "end_line": 7,
          "file": "tests/test_citations.py",
          "start_line": 7
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "tests/test_citations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/citations.py#app.services.citations.build_text_fragment",
      "evidence": [
        {
          "end_line": 7,
          "file": "tests/test_citations.py",
          "start_line": 7
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "tests/test_citations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/citations.py#app.services.citations.citation_link",
      "evidence": [
        {
          "end_line": 7,
          "file": "tests/test_citations.py",
          "start_line": 7
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "tests/test_citations.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/citations.py#app.services.citations.citation_link",
      "evidence": [
        {
          "end_line": 56,
          "file": "tests/test_citations.py",
          "start_line": 56
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_citations.py#tests.test_citations.test_citation_link_highlights_scraped_sources"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/citations.py#app.services.citations.citation_link",
      "evidence": [
        {
          "end_line": 71,
          "file": "tests/test_citations.py",
          "start_line": 71
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_citations.py#tests.test_citations.test_citation_link_reference_quote_is_truncated"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/citations.py#app.services.citations.citation_link",
      "evidence": [
        {
          "end_line": 63,
          "file": "tests/test_citations.py",
          "start_line": 63
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_citations.py#tests.test_citations.test_citation_link_reference_uses_plain_url"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/citations.py#app.services.citations.build_text_fragment",
      "evidence": [
        {
          "end_line": 48,
          "file": "tests/test_citations.py",
          "start_line": 48
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_citations.py#tests.test_citations.test_empty_text_returns_plain_url"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/citations.py#app.services.citations.build_text_fragment",
      "evidence": [
        {
          "end_line": 23,
          "file": "tests/test_citations.py",
          "start_line": 23
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_citations.py#tests.test_citations.test_long_text_uses_start_end_range"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/citations.py#app.services.citations.build_text_fragment",
      "evidence": [
        {
          "end_line": 13,
          "file": "tests/test_citations.py",
          "start_line": 13
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_citations.py#tests.test_citations.test_short_text_uses_single_term"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/citations.py#app.services.citations.build_text_fragment",
      "evidence": [
        {
          "end_line": 32,
          "file": "tests/test_citations.py",
          "start_line": 32
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_citations.py#tests.test_citations.test_special_characters_are_percent_encoded"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/citations.py#app.services.citations.build_text_fragment",
      "evidence": [
        {
          "end_line": 42,
          "file": "tests/test_citations.py",
          "start_line": 42
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_citations.py#tests.test_citations.test_whitespace_is_normalised"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "import",
      "dst": "app/services/websearch.py",
      "evidence": [
        {
          "end_line": 23,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 23
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "tests/test_websearch_allowlist.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "reference",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService",
      "evidence": [
        {
          "end_line": 23,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 23
        }
      ],
      "kind": "references",
      "resolution": "resolved",
      "src": "tests/test_websearch_allowlist.py"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService",
      "evidence": [
        {
          "end_line": 30,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 30
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist._service_with_transport"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "app/services/websearch.py#app.services.websearch.WebSearchService",
      "evidence": [
        {
          "end_line": 92,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 92
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist.test_host_allowed_rejects_lookalike_domains"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist._service_with_transport",
      "evidence": [
        {
          "end_line": 57,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 57
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist.test_redirect_to_off_allowlist_host_is_dropped"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist._service_with_transport",
      "evidence": [
        {
          "end_line": 70,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 70
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist.test_same_host_redirect_is_kept_with_final_url"
    },
    {
      "arity": 1,
      "attrs": {
        "shape": "bare"
      },
      "context": "call",
      "dst": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist._service_with_transport",
      "evidence": [
        {
          "end_line": 84,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 84
        }
      ],
      "kind": "calls",
      "resolution": "resolved",
      "src": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist.test_subdomain_of_allowlisted_host_is_allowed"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "route",
      "dst": "app/api/conversations.py#app.api.conversations.list_conversations#route:GET /conversations",
      "evidence": [
        {
          "end_line": 97,
          "file": "app/api/conversations.py",
          "start_line": 97
        }
      ],
      "kind": "exposes",
      "resolution": "resolved",
      "src": "app/api/conversations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "route",
      "dst": "app/api/conversations.py#app.api.conversations.get_conversation#route:GET /conversations/{thread_id:path}",
      "evidence": [
        {
          "end_line": 129,
          "file": "app/api/conversations.py",
          "start_line": 129
        }
      ],
      "kind": "exposes",
      "resolution": "resolved",
      "src": "app/api/conversations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "route",
      "dst": "app/api/chat.py#app.api.chat.health#route:GET /health",
      "evidence": [
        {
          "end_line": 69,
          "file": "app/api/chat.py",
          "start_line": 69
        }
      ],
      "kind": "exposes",
      "resolution": "resolved",
      "src": "app/api/chat.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "route",
      "dst": "app/api/skills.py#app.api.skills.list_skills#route:GET /skills",
      "evidence": [
        {
          "end_line": 12,
          "file": "app/api/skills.py",
          "start_line": 12
        }
      ],
      "kind": "exposes",
      "resolution": "resolved",
      "src": "app/api/skills.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "route",
      "dst": "app/api/admin.py#app.api.admin.ingest#route:POST /admin/ingest",
      "evidence": [
        {
          "end_line": 25,
          "file": "app/api/admin.py",
          "start_line": 25
        }
      ],
      "kind": "exposes",
      "resolution": "resolved",
      "src": "app/api/admin.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "route",
      "dst": "app/api/chat.py#app.api.chat.chat#route:POST /chat",
      "evidence": [
        {
          "end_line": 84,
          "file": "app/api/chat.py",
          "start_line": 84
        }
      ],
      "kind": "exposes",
      "resolution": "resolved",
      "src": "app/api/chat.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "store",
      "dst": "ext:database:SQLite",
      "evidence": [
        {
          "end_line": 13,
          "file": "app/api/conversations.py",
          "start_line": 13
        }
      ],
      "kind": "depends_on",
      "resolution": "resolved",
      "src": "app/api/conversations.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "store",
      "dst": "ext:database:Redis",
      "evidence": [
        {
          "end_line": 18,
          "file": "app/services/cache.py",
          "start_line": 18
        }
      ],
      "kind": "depends_on",
      "resolution": "resolved",
      "src": "app/services/cache.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "store",
      "dst": "ext:database:Milvus",
      "evidence": [
        {
          "end_line": 14,
          "file": "app/services/milvus_store.py",
          "start_line": 14
        }
      ],
      "kind": "depends_on",
      "resolution": "resolved",
      "src": "app/services/milvus_store.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "cloud",
      "dst": "ext:cloud:OpenAI API",
      "evidence": [
        {
          "end_line": 31,
          "file": "app/services/ollama_llm.py",
          "start_line": 31
        }
      ],
      "kind": "depends_on",
      "resolution": "resolved",
      "src": "app/services/ollama_llm.py"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/__init__.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/__init__.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/__init__.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/api/admin.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/admin.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/api/admin.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/api/chat.py",
      "evidence": [
        {
          "end_line": 13,
          "file": "app/api/chat.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/api/chat.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/api/conversations.py",
      "evidence": [
        {
          "end_line": 8,
          "file": "app/api/conversations.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/api/conversations.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/api/models.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/models.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/api/models.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/api/skills.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/skills.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/api/skills.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/config.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/config.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/eval/__init__.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/eval/__init__.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/eval/__init__.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/eval/offline.py",
      "evidence": [
        {
          "end_line": 17,
          "file": "app/eval/offline.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/eval/offline.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/graph/build.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/build.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/graph/build.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/graph/nodes.py",
      "evidence": [
        {
          "end_line": 8,
          "file": "app/graph/nodes.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/graph/nodes.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/graph/prompts.py",
      "evidence": [
        {
          "end_line": 7,
          "file": "app/graph/prompts.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/graph/prompts.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/graph/state.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/state.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/graph/state.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/ingestion/crawler.py",
      "evidence": [
        {
          "end_line": 7,
          "file": "app/ingestion/crawler.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/ingestion/crawler.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/ingestion/run_ingest.py",
      "evidence": [
        {
          "end_line": 10,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/ingestion/run_ingest.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/main.py",
      "evidence": [
        {
          "end_line": 6,
          "file": "app/main.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/main.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/cache.py",
      "evidence": [
        {
          "end_line": 10,
          "file": "app/services/cache.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/cache.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/cache.py#app.services.cache.CacheService",
      "evidence": [
        {
          "end_line": 32,
          "file": "app/services/cache.py",
          "start_line": 32
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/cache.py#rationale:32:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/citations.py",
      "evidence": [
        {
          "end_line": 10,
          "file": "app/services/citations.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/citations.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/evaluation.py",
      "evidence": [
        {
          "end_line": 15,
          "file": "app/services/evaluation.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/evaluation.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/milvus_store.py",
      "evidence": [
        {
          "end_line": 7,
          "file": "app/services/milvus_store.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/milvus_store.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore",
      "evidence": [
        {
          "end_line": 71,
          "file": "app/services/milvus_store.py",
          "start_line": 71
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/milvus_store.py#rationale:71:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/ollama_llm.py",
      "evidence": [
        {
          "end_line": 11,
          "file": "app/services/ollama_llm.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/ollama_llm.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/reranker.py",
      "evidence": [
        {
          "end_line": 6,
          "file": "app/services/reranker.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/reranker.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/reranker.py#app.services.reranker.RerankCandidate",
      "evidence": [
        {
          "end_line": 17,
          "file": "app/services/reranker.py",
          "start_line": 17
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/reranker.py#rationale:17:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/reranker.py#app.services.reranker.Reranker",
      "evidence": [
        {
          "end_line": 24,
          "file": "app/services/reranker.py",
          "start_line": 24
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/reranker.py#rationale:24:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/tracing.py",
      "evidence": [
        {
          "end_line": 6,
          "file": "app/services/tracing.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/tracing.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/services/websearch.py",
      "evidence": [
        {
          "end_line": 13,
          "file": "app/services/websearch.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/services/websearch.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/skills/__init__.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/skills/__init__.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/skills/__init__.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "app/skills/registry.py",
      "evidence": [
        {
          "end_line": 12,
          "file": "app/skills/registry.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "app/skills/registry.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "scripts/download_models.py",
      "evidence": [
        {
          "end_line": 10,
          "file": "scripts/download_models.py",
          "start_line": 2
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "scripts/download_models.py#rationale:2:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "rationale",
      "dst": "scripts/export_graph.py",
      "evidence": [
        {
          "end_line": 13,
          "file": "scripts/export_graph.py",
          "start_line": 1
        }
      ],
      "kind": "rationale_for",
      "resolution": "resolved",
      "src": "scripts/export_graph.py#rationale:1:docstring"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/__init__.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/__init__.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/config.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/config.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/main.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/main.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/api/__init__.py",
      "evidence": [
        {
          "end_line": 0,
          "file": "app/api/__init__.py",
          "start_line": 0
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/api"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/api/admin.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/admin.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/api"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/api/chat.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/chat.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/api"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/api/conversations.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/conversations.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/api"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/api/models.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/models.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/api"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/api/skills.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/skills.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/api"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/eval/__init__.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/eval/__init__.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/eval"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/eval/offline.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/eval/offline.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/eval"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/graph/__init__.py",
      "evidence": [
        {
          "end_line": 0,
          "file": "app/graph/__init__.py",
          "start_line": 0
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/graph"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/graph/build.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/build.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/graph"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/graph/nodes.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/nodes.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/graph"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/graph/prompts.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/prompts.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/graph"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/graph/state.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/state.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/graph"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/ingestion/__init__.py",
      "evidence": [
        {
          "end_line": 0,
          "file": "app/ingestion/__init__.py",
          "start_line": 0
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/ingestion"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/ingestion/crawler.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/ingestion/crawler.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/ingestion"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/ingestion/run_ingest.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/ingestion"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/services/__init__.py",
      "evidence": [
        {
          "end_line": 0,
          "file": "app/services/__init__.py",
          "start_line": 0
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/services"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/services/cache.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/cache.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/services"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/services/citations.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/citations.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/services"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/services/evaluation.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/evaluation.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/services"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/services/milvus_store.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/milvus_store.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/services"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/services/ollama_llm.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/ollama_llm.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/services"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/services/reranker.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/reranker.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/services"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/services/tracing.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/tracing.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/services"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/services/websearch.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/websearch.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/services"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/skills/__init__.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/skills/__init__.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/skills"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "app/skills/registry.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "app/skills/registry.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "app/skills"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "scripts/download_models.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "scripts/download_models.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "scripts"
    },
    {
      "arity": 1,
      "attrs": {},
      "context": "contain",
      "dst": "scripts/export_graph.py",
      "evidence": [
        {
          "end_line": 1,
          "file": "scripts/export_graph.py",
          "start_line": 1
        }
      ],
      "kind": "contains",
      "resolution": "resolved",
      "src": "scripts"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "1"
      },
      "context": "import",
      "dst": "app/api",
      "evidence": [
        {
          "end_line": 19,
          "file": "app/main.py",
          "start_line": 19
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "1"
      },
      "context": "import",
      "dst": "app/graph",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/main.py",
          "start_line": 21
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "4"
      },
      "context": "import",
      "dst": "app/services",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/main.py",
          "start_line": 22
        },
        {
          "end_line": 23,
          "file": "app/main.py",
          "start_line": 23
        },
        {
          "end_line": 24,
          "file": "app/main.py",
          "start_line": 24
        },
        {
          "end_line": 25,
          "file": "app/main.py",
          "start_line": 25
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "1"
      },
      "context": "import",
      "dst": "app/skills",
      "evidence": [
        {
          "end_line": 26,
          "file": "app/main.py",
          "start_line": 26
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "3"
      },
      "context": "import",
      "dst": "app",
      "evidence": [
        {
          "end_line": 10,
          "file": "app/api/admin.py",
          "start_line": 10
        },
        {
          "end_line": 28,
          "file": "app/api/chat.py",
          "start_line": 28
        },
        {
          "end_line": 26,
          "file": "app/api/conversations.py",
          "start_line": 26
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "1"
      },
      "context": "import",
      "dst": "app/ingestion",
      "evidence": [
        {
          "end_line": 11,
          "file": "app/api/admin.py",
          "start_line": 11
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "3"
      },
      "context": "import",
      "dst": "app/services",
      "evidence": [
        {
          "end_line": 40,
          "file": "app/api/admin.py",
          "start_line": 40
        },
        {
          "end_line": 29,
          "file": "app/api/chat.py",
          "start_line": 29
        },
        {
          "end_line": 185,
          "file": "app/api/chat.py",
          "start_line": 185
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/api"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "2"
      },
      "context": "import",
      "dst": "app",
      "evidence": [
        {
          "end_line": 30,
          "file": "app/eval/offline.py",
          "start_line": 30
        },
        {
          "end_line": 31,
          "file": "app/eval/offline.py",
          "start_line": 31
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/eval"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "2"
      },
      "context": "import",
      "dst": "app/services",
      "evidence": [
        {
          "end_line": 37,
          "file": "app/eval/offline.py",
          "start_line": 32
        },
        {
          "end_line": 38,
          "file": "app/eval/offline.py",
          "start_line": 38
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/eval"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "1"
      },
      "context": "import",
      "dst": "app",
      "evidence": [
        {
          "end_line": 17,
          "file": "app/graph/nodes.py",
          "start_line": 17
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "8"
      },
      "context": "import",
      "dst": "app/services",
      "evidence": [
        {
          "end_line": 14,
          "file": "app/graph/build.py",
          "start_line": 14
        },
        {
          "end_line": 15,
          "file": "app/graph/build.py",
          "start_line": 15
        },
        {
          "end_line": 16,
          "file": "app/graph/build.py",
          "start_line": 16
        },
        {
          "end_line": 19,
          "file": "app/graph/nodes.py",
          "start_line": 19
        },
        {
          "end_line": 21,
          "file": "app/graph/nodes.py",
          "start_line": 21
        },
        {
          "end_line": 22,
          "file": "app/graph/nodes.py",
          "start_line": 22
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "2"
      },
      "context": "import",
      "dst": "app/skills",
      "evidence": [
        {
          "end_line": 17,
          "file": "app/graph/build.py",
          "start_line": 17
        },
        {
          "end_line": 25,
          "file": "app/graph/nodes.py",
          "start_line": 25
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/graph"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "1"
      },
      "context": "import",
      "dst": "app",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 20
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "8"
      },
      "context": "import",
      "dst": "app/services",
      "evidence": [
        {
          "end_line": 18,
          "file": "app/ingestion/crawler.py",
          "start_line": 18
        },
        {
          "end_line": 19,
          "file": "app/ingestion/crawler.py",
          "start_line": 19
        },
        {
          "end_line": 20,
          "file": "app/ingestion/crawler.py",
          "start_line": 20
        },
        {
          "end_line": 21,
          "file": "app/ingestion/crawler.py",
          "start_line": 21
        },
        {
          "end_line": 22,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 22
        },
        {
          "end_line": 23,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 23
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "2"
      },
      "context": "import",
      "dst": "app/skills",
      "evidence": [
        {
          "end_line": 22,
          "file": "app/ingestion/crawler.py",
          "start_line": 22
        },
        {
          "end_line": 25,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 25
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/ingestion"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "7"
      },
      "context": "import",
      "dst": "app",
      "evidence": [
        {
          "end_line": 20,
          "file": "app/services/cache.py",
          "start_line": 20
        },
        {
          "end_line": 23,
          "file": "app/services/evaluation.py",
          "start_line": 23
        },
        {
          "end_line": 16,
          "file": "app/services/milvus_store.py",
          "start_line": 16
        },
        {
          "end_line": 18,
          "file": "app/services/ollama_llm.py",
          "start_line": 18
        },
        {
          "end_line": 12,
          "file": "app/services/reranker.py",
          "start_line": 12
        },
        {
          "end_line": 12,
          "file": "app/services/tracing.py",
          "start_line": 12
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/services"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "1"
      },
      "context": "import",
      "dst": "app",
      "evidence": [
        {
          "end_line": 21,
          "file": "app/skills/registry.py",
          "start_line": 21
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "app/skills"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "1"
      },
      "context": "import",
      "dst": "app/graph",
      "evidence": [
        {
          "end_line": 23,
          "file": "scripts/export_graph.py",
          "start_line": 23
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "scripts"
    },
    {
      "arity": 1,
      "attrs": {
        "weight": "1"
      },
      "context": "import",
      "dst": "app/skills",
      "evidence": [
        {
          "end_line": 24,
          "file": "scripts/export_graph.py",
          "start_line": 24
        }
      ],
      "kind": "imports",
      "resolution": "resolved",
      "src": "scripts"
    }
  ],
  "hyperedges": [],
  "module_deps": [
    [
      "app",
      "app/api"
    ],
    [
      "app",
      "app/graph"
    ],
    [
      "app",
      "app/services"
    ],
    [
      "app",
      "app/skills"
    ],
    [
      "app/api",
      "app"
    ],
    [
      "app/api",
      "app/ingestion"
    ],
    [
      "app/api",
      "app/services"
    ],
    [
      "app/eval",
      "app"
    ],
    [
      "app/eval",
      "app/services"
    ],
    [
      "app/graph",
      "app"
    ],
    [
      "app/graph",
      "app/services"
    ],
    [
      "app/graph",
      "app/skills"
    ],
    [
      "app/ingestion",
      "app"
    ],
    [
      "app/ingestion",
      "app/services"
    ],
    [
      "app/ingestion",
      "app/skills"
    ],
    [
      "app/services",
      "app"
    ],
    [
      "app/skills",
      "app"
    ],
    [
      "scripts",
      "app/graph"
    ],
    [
      "scripts",
      "app/skills"
    ]
  ],
  "modules": [
    "",
    "app",
    "app/api",
    "app/eval",
    "app/graph",
    "app/ingestion",
    "app/services",
    "app/skills",
    "scripts"
  ],
  "nodes": [
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/__init__.py",
          "start_line": 1
        }
      ],
      "id": "app/__init__.py",
      "kind": "module",
      "label": "__init__.py",
      "lang": "python",
      "qualified_name": "app/__init__.py"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 0,
          "file": "app/api/__init__.py",
          "start_line": 0
        }
      ],
      "id": "app/api/__init__.py",
      "kind": "module",
      "label": "__init__.py",
      "lang": "python",
      "qualified_name": "app/api/__init__.py"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/admin.py",
          "start_line": 1
        }
      ],
      "id": "app/api/admin.py",
      "kind": "module",
      "label": "admin.py",
      "lang": "python",
      "qualified_name": "app/api/admin.py"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 22,
          "file": "app/api/admin.py",
          "start_line": 16
        }
      ],
      "id": "app/api/admin.py#app.api.admin._merge",
      "kind": "function",
      "label": "_merge",
      "lang": "python",
      "qualified_name": "app.api.admin._merge"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 65,
          "file": "app/api/admin.py",
          "start_line": 26
        }
      ],
      "id": "app/api/admin.py#app.api.admin.ingest",
      "kind": "function",
      "label": "ingest",
      "lang": "python",
      "qualified_name": "app.api.admin.ingest"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/chat.py",
          "start_line": 1
        }
      ],
      "id": "app/api/chat.py",
      "kind": "module",
      "label": "chat.py",
      "lang": "python",
      "qualified_name": "app/api/chat.py"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 53,
          "file": "app/api/chat.py",
          "start_line": 38
        }
      ],
      "id": "app/api/chat.py#app.api.chat._resolve_skill",
      "kind": "function",
      "label": "_resolve_skill",
      "lang": "python",
      "qualified_name": "app.api.chat._resolve_skill"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 196,
          "file": "app/api/chat.py",
          "start_line": 182
        }
      ],
      "id": "app/api/chat.py#app.api.chat._schedule_scoring",
      "kind": "function",
      "label": "_schedule_scoring",
      "lang": "python",
      "qualified_name": "app.api.chat._schedule_scoring"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 66,
          "file": "app/api/chat.py",
          "start_line": 56
        }
      ],
      "id": "app/api/chat.py#app.api.chat._within_rate_limit",
      "kind": "function",
      "label": "_within_rate_limit",
      "lang": "python",
      "qualified_name": "app.api.chat._within_rate_limit"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 179,
          "file": "app/api/chat.py",
          "start_line": 85
        }
      ],
      "id": "app/api/chat.py#app.api.chat.chat",
      "kind": "function",
      "label": "chat",
      "lang": "python",
      "qualified_name": "app.api.chat.chat"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 177,
          "file": "app/api/chat.py",
          "start_line": 121
        }
      ],
      "id": "app/api/chat.py#app.api.chat.chat.event_stream",
      "kind": "function",
      "label": "event_stream",
      "lang": "python",
      "qualified_name": "app.api.chat.chat.event_stream"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 81,
          "file": "app/api/chat.py",
          "start_line": 70
        }
      ],
      "id": "app/api/chat.py#app.api.chat.health",
      "kind": "function",
      "label": "health",
      "lang": "python",
      "qualified_name": "app.api.chat.health"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/conversations.py",
          "start_line": 1
        }
      ],
      "id": "app/api/conversations.py",
      "kind": "module",
      "label": "conversations.py",
      "lang": "python",
      "qualified_name": "app/api/conversations.py"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 73,
          "file": "app/api/conversations.py",
          "start_line": 66
        }
      ],
      "id": "app/api/conversations.py#app.api.conversations._bucket_for",
      "kind": "function",
      "label": "_bucket_for",
      "lang": "python",
      "qualified_name": "app.api.conversations._bucket_for"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 63,
          "file": "app/api/conversations.py",
          "start_line": 56
        }
      ],
      "id": "app/api/conversations.py#app.api.conversations._distinct_thread_ids",
      "kind": "function",
      "label": "_distinct_thread_ids",
      "lang": "python",
      "qualified_name": "app.api.conversations._distinct_thread_ids"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 53,
          "file": "app/api/conversations.py",
          "start_line": 48
        }
      ],
      "id": "app/api/conversations.py#app.api.conversations._first_user_question",
      "kind": "function",
      "label": "_first_user_question",
      "lang": "python",
      "qualified_name": "app.api.conversations._first_user_question"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 45,
          "file": "app/api/conversations.py",
          "start_line": 42
        }
      ],
      "id": "app/api/conversations.py#app.api.conversations._split_thread",
      "kind": "function",
      "label": "_split_thread",
      "lang": "python",
      "qualified_name": "app.api.conversations._split_thread"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 94,
          "file": "app/api/conversations.py",
          "start_line": 76
        }
      ],
      "id": "app/api/conversations.py#app.api.conversations._summary",
      "kind": "function",
      "label": "_summary",
      "lang": "python",
      "qualified_name": "app.api.conversations._summary"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 162,
          "file": "app/api/conversations.py",
          "start_line": 130
        }
      ],
      "id": "app/api/conversations.py#app.api.conversations.get_conversation",
      "kind": "function",
      "label": "get_conversation",
      "lang": "python",
      "qualified_name": "app.api.conversations.get_conversation"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 126,
          "file": "app/api/conversations.py",
          "start_line": 98
        }
      ],
      "id": "app/api/conversations.py#app.api.conversations.list_conversations",
      "kind": "function",
      "label": "list_conversations",
      "lang": "python",
      "qualified_name": "app.api.conversations.list_conversations"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/models.py",
          "start_line": 1
        }
      ],
      "id": "app/api/models.py",
      "kind": "module",
      "label": "models.py",
      "lang": "python",
      "qualified_name": "app/api/models.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 27,
          "file": "app/api/models.py",
          "start_line": 8
        }
      ],
      "id": "app/api/models.py#app.api.models.ChatRequest",
      "kind": "class",
      "label": "ChatRequest",
      "lang": "python",
      "qualified_name": "app.api.models.ChatRequest"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 47,
          "file": "app/api/models.py",
          "start_line": 45
        }
      ],
      "id": "app/api/models.py#app.api.models.ConversationBucket",
      "kind": "class",
      "label": "ConversationBucket",
      "lang": "python",
      "qualified_name": "app.api.models.ConversationBucket"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 68,
          "file": "app/api/models.py",
          "start_line": 59
        }
      ],
      "id": "app/api/models.py#app.api.models.ConversationDetail",
      "kind": "class",
      "label": "ConversationDetail",
      "lang": "python",
      "qualified_name": "app.api.models.ConversationDetail"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 51,
          "file": "app/api/models.py",
          "start_line": 50
        }
      ],
      "id": "app/api/models.py#app.api.models.ConversationListResponse",
      "kind": "class",
      "label": "ConversationListResponse",
      "lang": "python",
      "qualified_name": "app.api.models.ConversationListResponse"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 56,
          "file": "app/api/models.py",
          "start_line": 54
        }
      ],
      "id": "app/api/models.py#app.api.models.ConversationMessage",
      "kind": "class",
      "label": "ConversationMessage",
      "lang": "python",
      "qualified_name": "app.api.models.ConversationMessage"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 42,
          "file": "app/api/models.py",
          "start_line": 36
        }
      ],
      "id": "app/api/models.py#app.api.models.ConversationSummary",
      "kind": "class",
      "label": "ConversationSummary",
      "lang": "python",
      "qualified_name": "app.api.models.ConversationSummary"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 78,
          "file": "app/api/models.py",
          "start_line": 71
        }
      ],
      "id": "app/api/models.py#app.api.models.IngestResponse",
      "kind": "class",
      "label": "IngestResponse",
      "lang": "python",
      "qualified_name": "app.api.models.IngestResponse"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 33,
          "file": "app/api/models.py",
          "start_line": 30
        }
      ],
      "id": "app/api/models.py#app.api.models.SkillInfo",
      "kind": "class",
      "label": "SkillInfo",
      "lang": "python",
      "qualified_name": "app.api.models.SkillInfo"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/skills.py",
          "start_line": 1
        }
      ],
      "id": "app/api/skills.py",
      "kind": "module",
      "label": "skills.py",
      "lang": "python",
      "qualified_name": "app/api/skills.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 20,
          "file": "app/api/skills.py",
          "start_line": 13
        }
      ],
      "id": "app/api/skills.py#app.api.skills.list_skills",
      "kind": "function",
      "label": "list_skills",
      "lang": "python",
      "qualified_name": "app.api.skills.list_skills"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/config.py",
          "start_line": 1
        }
      ],
      "id": "app/config.py",
      "kind": "module",
      "label": "config.py",
      "lang": "python",
      "qualified_name": "app/config.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 111,
          "file": "app/config.py",
          "start_line": 11
        }
      ],
      "id": "app/config.py#app.config.Settings",
      "kind": "class",
      "label": "Settings",
      "lang": "python",
      "qualified_name": "app.config.Settings"
    },
    {
      "attrs": {
        "class": "Settings",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 111,
          "file": "app/config.py",
          "start_line": 102
        }
      ],
      "id": "app/config.py#app.config.Settings._split_domains",
      "kind": "method",
      "label": "_split_domains",
      "lang": "python",
      "qualified_name": "app.config.Settings._split_domains"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 117,
          "file": "app/config.py",
          "start_line": 115
        }
      ],
      "id": "app/config.py#app.config.get_settings",
      "kind": "function",
      "label": "get_settings",
      "lang": "python",
      "qualified_name": "app.config.get_settings"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/eval/__init__.py",
          "start_line": 1
        }
      ],
      "id": "app/eval/__init__.py",
      "kind": "module",
      "label": "__init__.py",
      "lang": "python",
      "qualified_name": "app/eval/__init__.py"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/eval/offline.py",
          "start_line": 1
        }
      ],
      "id": "app/eval/offline.py",
      "kind": "module",
      "label": "offline.py",
      "lang": "python",
      "qualified_name": "app/eval/offline.py"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 115,
          "file": "app/eval/offline.py",
          "start_line": 94
        }
      ],
      "id": "app/eval/offline.py#app.eval.offline._ensure_dataset",
      "kind": "function",
      "label": "_ensure_dataset",
      "lang": "python",
      "qualified_name": "app.eval.offline._ensure_dataset"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 62,
          "file": "app/eval/offline.py",
          "start_line": 47
        }
      ],
      "id": "app/eval/offline.py#app.eval.offline._load_golden",
      "kind": "function",
      "label": "_load_golden",
      "lang": "python",
      "qualified_name": "app.eval.offline._load_golden"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 140,
          "file": "app/eval/offline.py",
          "start_line": 118
        }
      ],
      "id": "app/eval/offline.py#app.eval.offline._print_summary",
      "kind": "function",
      "label": "_print_summary",
      "lang": "python",
      "qualified_name": "app.eval.offline._print_summary"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 91,
          "file": "app/eval/offline.py",
          "start_line": 65
        }
      ],
      "id": "app/eval/offline.py#app.eval.offline._run_graph",
      "kind": "function",
      "label": "_run_graph",
      "lang": "python",
      "qualified_name": "app.eval.offline._run_graph"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 205,
          "file": "app/eval/offline.py",
          "start_line": 200
        }
      ],
      "id": "app/eval/offline.py#app.eval.offline.main",
      "kind": "function",
      "label": "main",
      "lang": "python",
      "qualified_name": "app.eval.offline.main"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 197,
          "file": "app/eval/offline.py",
          "start_line": 143
        }
      ],
      "id": "app/eval/offline.py#app.eval.offline.run",
      "kind": "function",
      "label": "run",
      "lang": "python",
      "qualified_name": "app.eval.offline.run"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 0,
          "file": "app/graph/__init__.py",
          "start_line": 0
        }
      ],
      "id": "app/graph/__init__.py",
      "kind": "module",
      "label": "__init__.py",
      "lang": "python",
      "qualified_name": "app/graph/__init__.py"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/build.py",
          "start_line": 1
        }
      ],
      "id": "app/graph/build.py",
      "kind": "module",
      "label": "build.py",
      "lang": "python",
      "qualified_name": "app/graph/build.py"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 44,
          "file": "app/graph/build.py",
          "start_line": 22
        }
      ],
      "id": "app/graph/build.py#app.graph.build._timed",
      "kind": "function",
      "label": "_timed",
      "lang": "python",
      "qualified_name": "app.graph.build._timed"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 42,
          "file": "app/graph/build.py",
          "start_line": 30
        }
      ],
      "id": "app/graph/build.py#app.graph.build._timed.wrapper",
      "kind": "function",
      "label": "wrapper",
      "lang": "python",
      "qualified_name": "app.graph.build._timed.wrapper"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 106,
          "file": "app/graph/build.py",
          "start_line": 47
        }
      ],
      "id": "app/graph/build.py#app.graph.build.build_graph",
      "kind": "function",
      "label": "build_graph",
      "lang": "python",
      "qualified_name": "app.graph.build.build_graph"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/nodes.py",
          "start_line": 1
        }
      ],
      "id": "app/graph/nodes.py",
      "kind": "module",
      "label": "nodes.py",
      "lang": "python",
      "qualified_name": "app/graph/nodes.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 274,
          "file": "app/graph/nodes.py",
          "start_line": 36
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes",
      "kind": "class",
      "label": "RagNodes",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 51,
          "file": "app/graph/nodes.py",
          "start_line": 37
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.__init__",
      "kind": "method",
      "label": "__init__",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.__init__"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 62,
          "file": "app/graph/nodes.py",
          "start_line": 53
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes._rerank",
      "kind": "method",
      "label": "_rerank",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes._rerank"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 205,
          "file": "app/graph/nodes.py",
          "start_line": 170
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.build_context",
      "kind": "method",
      "label": "build_context",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.build_context"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 191,
          "file": "app/graph/nodes.py",
          "start_line": 176
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.build_context._add",
      "kind": "method",
      "label": "_add",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.build_context._add"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 95,
          "file": "app/graph/nodes.py",
          "start_line": 65
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.contextualize",
      "kind": "method",
      "label": "contextualize",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.contextualize"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 274,
          "file": "app/graph/nodes.py",
          "start_line": 272
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.finalize",
      "kind": "method",
      "label": "finalize",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.finalize"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 223,
          "file": "app/graph/nodes.py",
          "start_line": 207
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.generate",
      "kind": "method",
      "label": "generate",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.generate"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 270,
          "file": "app/graph/nodes.py",
          "start_line": 269
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.give_up",
      "kind": "method",
      "label": "give_up",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.give_up"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 141,
          "file": "app/graph/nodes.py",
          "start_line": 127
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.grade_documents",
      "kind": "method",
      "label": "grade_documents",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.grade_documents"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 253,
          "file": "app/graph/nodes.py",
          "start_line": 251
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.prepare_regen",
      "kind": "method",
      "label": "prepare_regen",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.prepare_regen"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 249,
          "file": "app/graph/nodes.py",
          "start_line": 225
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.reflect",
      "kind": "method",
      "label": "reflect",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.reflect"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 125,
          "file": "app/graph/nodes.py",
          "start_line": 118
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.rerank_vector",
      "kind": "method",
      "label": "rerank_vector",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.rerank_vector"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 116,
          "file": "app/graph/nodes.py",
          "start_line": 97
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.retrieve_vector",
      "kind": "method",
      "label": "retrieve_vector",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.retrieve_vector"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 267,
          "file": "app/graph/nodes.py",
          "start_line": 255
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.rewrite_query",
      "kind": "method",
      "label": "rewrite_query",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.rewrite_query"
    },
    {
      "attrs": {
        "class": "RagNodes",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 168,
          "file": "app/graph/nodes.py",
          "start_line": 143
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.RagNodes.web_search",
      "kind": "method",
      "label": "web_search",
      "lang": "python",
      "qualified_name": "app.graph.nodes.RagNodes.web_search"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 33,
          "file": "app/graph/nodes.py",
          "start_line": 28
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes._status",
      "kind": "function",
      "label": "_status",
      "lang": "python",
      "qualified_name": "app.graph.nodes._status"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 300,
          "file": "app/graph/nodes.py",
          "start_line": 278
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.route_after_grade",
      "kind": "function",
      "label": "route_after_grade",
      "lang": "python",
      "qualified_name": "app.graph.nodes.route_after_grade"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 309,
          "file": "app/graph/nodes.py",
          "start_line": 303
        }
      ],
      "id": "app/graph/nodes.py#app.graph.nodes.route_reflect",
      "kind": "function",
      "label": "route_reflect",
      "lang": "python",
      "qualified_name": "app.graph.nodes.route_reflect"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/prompts.py",
          "start_line": 1
        }
      ],
      "id": "app/graph/prompts.py",
      "kind": "module",
      "label": "prompts.py",
      "lang": "python",
      "qualified_name": "app/graph/prompts.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 101,
          "file": "app/graph/prompts.py",
          "start_line": 100
        }
      ],
      "id": "app/graph/prompts.py#app.graph.prompts.answer_quality_user",
      "kind": "function",
      "label": "answer_quality_user",
      "lang": "python",
      "qualified_name": "app.graph.prompts.answer_quality_user"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 68,
          "file": "app/graph/prompts.py",
          "start_line": 61
        }
      ],
      "id": "app/graph/prompts.py#app.graph.prompts.generation_user",
      "kind": "function",
      "label": "generation_user",
      "lang": "python",
      "qualified_name": "app.graph.prompts.generation_user"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 91,
          "file": "app/graph/prompts.py",
          "start_line": 90
        }
      ],
      "id": "app/graph/prompts.py#app.graph.prompts.groundedness_user",
      "kind": "function",
      "label": "groundedness_user",
      "lang": "python",
      "qualified_name": "app.graph.prompts.groundedness_user"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 29,
          "file": "app/graph/prompts.py",
          "start_line": 18
        }
      ],
      "id": "app/graph/prompts.py#app.graph.prompts.parse_yes_no",
      "kind": "function",
      "label": "parse_yes_no",
      "lang": "python",
      "qualified_name": "app.graph.prompts.parse_yes_no"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 48,
          "file": "app/graph/prompts.py",
          "start_line": 47
        }
      ],
      "id": "app/graph/prompts.py#app.graph.prompts.relevance_user",
      "kind": "function",
      "label": "relevance_user",
      "lang": "python",
      "qualified_name": "app.graph.prompts.relevance_user"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 112,
          "file": "app/graph/prompts.py",
          "start_line": 111
        }
      ],
      "id": "app/graph/prompts.py#app.graph.prompts.rewrite_user",
      "kind": "function",
      "label": "rewrite_user",
      "lang": "python",
      "qualified_name": "app.graph.prompts.rewrite_user"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/state.py",
          "start_line": 1
        }
      ],
      "id": "app/graph/state.py",
      "kind": "module",
      "label": "state.py",
      "lang": "python",
      "qualified_name": "app/graph/state.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 15,
          "file": "app/graph/state.py",
          "start_line": 11
        }
      ],
      "id": "app/graph/state.py#app.graph.state.Document",
      "kind": "class",
      "label": "Document",
      "lang": "python",
      "qualified_name": "app.graph.state.Document"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 50,
          "file": "app/graph/state.py",
          "start_line": 18
        }
      ],
      "id": "app/graph/state.py#app.graph.state.GraphState",
      "kind": "class",
      "label": "GraphState",
      "lang": "python",
      "qualified_name": "app.graph.state.GraphState"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 0,
          "file": "app/ingestion/__init__.py",
          "start_line": 0
        }
      ],
      "id": "app/ingestion/__init__.py",
      "kind": "module",
      "label": "__init__.py",
      "lang": "python",
      "qualified_name": "app/ingestion/__init__.py"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/ingestion/crawler.py",
          "start_line": 1
        }
      ],
      "id": "app/ingestion/crawler.py",
      "kind": "module",
      "label": "crawler.py",
      "lang": "python",
      "qualified_name": "app/ingestion/crawler.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 49,
          "file": "app/ingestion/crawler.py",
          "start_line": 33
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler.IngestReport",
      "kind": "class",
      "label": "IngestReport",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler.IngestReport"
    },
    {
      "attrs": {
        "class": "IngestReport",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 49,
          "file": "app/ingestion/crawler.py",
          "start_line": 41
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler.IngestReport.as_dict",
      "kind": "method",
      "label": "as_dict",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler.IngestReport.as_dict"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 225,
          "file": "app/ingestion/crawler.py",
          "start_line": 73
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor",
      "kind": "class",
      "label": "Ingestor",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler.Ingestor"
    },
    {
      "attrs": {
        "class": "Ingestor",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 83,
          "file": "app/ingestion/crawler.py",
          "start_line": 74
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.__init__",
      "kind": "method",
      "label": "__init__",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler.Ingestor.__init__"
    },
    {
      "attrs": {
        "class": "Ingestor",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 126,
          "file": "app/ingestion/crawler.py",
          "start_line": 85
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor._upsert_doc",
      "kind": "method",
      "label": "_upsert_doc",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler.Ingestor._upsert_doc"
    },
    {
      "attrs": {
        "class": "Ingestor",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 195,
          "file": "app/ingestion/crawler.py",
          "start_line": 161
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_references",
      "kind": "method",
      "label": "ingest_references",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler.Ingestor.ingest_references"
    },
    {
      "attrs": {
        "class": "Ingestor",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 215,
          "file": "app/ingestion/crawler.py",
          "start_line": 197
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_skill",
      "kind": "method",
      "label": "ingest_skill",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler.Ingestor.ingest_skill"
    },
    {
      "attrs": {
        "class": "Ingestor",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 159,
          "file": "app/ingestion/crawler.py",
          "start_line": 128
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.ingest_topic",
      "kind": "method",
      "label": "ingest_topic",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler.Ingestor.ingest_topic"
    },
    {
      "attrs": {
        "class": "Ingestor",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 225,
          "file": "app/ingestion/crawler.py",
          "start_line": 217
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler.Ingestor.run",
      "kind": "method",
      "label": "run",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler.Ingestor.run"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 29,
          "file": "app/ingestion/crawler.py",
          "start_line": 27
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler._host",
      "kind": "function",
      "label": "_host",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler._host"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 65,
          "file": "app/ingestion/crawler.py",
          "start_line": 52
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler.chunk_text",
      "kind": "function",
      "label": "chunk_text",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler.chunk_text"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 70,
          "file": "app/ingestion/crawler.py",
          "start_line": 68
        }
      ],
      "id": "app/ingestion/crawler.py#app.ingestion.crawler.load_topics",
      "kind": "function",
      "label": "load_topics",
      "lang": "python",
      "qualified_name": "app.ingestion.crawler.load_topics"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 1
        }
      ],
      "id": "app/ingestion/run_ingest.py",
      "kind": "module",
      "label": "run_ingest.py",
      "lang": "python",
      "qualified_name": "app/ingestion/run_ingest.py"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 37,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 31
        }
      ],
      "id": "app/ingestion/run_ingest.py#app.ingestion.run_ingest._merge",
      "kind": "function",
      "label": "_merge",
      "lang": "python",
      "qualified_name": "app.ingestion.run_ingest._merge"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 81,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 40
        }
      ],
      "id": "app/ingestion/run_ingest.py#app.ingestion.run_ingest.main",
      "kind": "function",
      "label": "main",
      "lang": "python",
      "qualified_name": "app.ingestion.run_ingest.main"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/main.py",
          "start_line": 1
        }
      ],
      "id": "app/main.py",
      "kind": "module",
      "label": "main.py",
      "lang": "python",
      "qualified_name": "app/main.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 38,
          "file": "app/main.py",
          "start_line": 32
        }
      ],
      "id": "app/main.py#app.main.Runtime",
      "kind": "class",
      "label": "Runtime",
      "lang": "python",
      "qualified_name": "app.main.Runtime"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 81,
          "file": "app/main.py",
          "start_line": 42
        }
      ],
      "id": "app/main.py#app.main.build_runtime",
      "kind": "function",
      "label": "build_runtime",
      "lang": "python",
      "qualified_name": "app.main.build_runtime"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 107,
          "file": "app/main.py",
          "start_line": 95
        }
      ],
      "id": "app/main.py#app.main.create_app",
      "kind": "function",
      "label": "create_app",
      "lang": "python",
      "qualified_name": "app.main.create_app"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 92,
          "file": "app/main.py",
          "start_line": 85
        }
      ],
      "id": "app/main.py#app.main.lifespan",
      "kind": "function",
      "label": "lifespan",
      "lang": "python",
      "qualified_name": "app.main.lifespan"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 0,
          "file": "app/services/__init__.py",
          "start_line": 0
        }
      ],
      "id": "app/services/__init__.py",
      "kind": "module",
      "label": "__init__.py",
      "lang": "python",
      "qualified_name": "app/services/__init__.py"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/cache.py",
          "start_line": 1
        }
      ],
      "id": "app/services/cache.py",
      "kind": "module",
      "label": "cache.py",
      "lang": "python",
      "qualified_name": "app/services/cache.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 84,
          "file": "app/services/cache.py",
          "start_line": 31
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService",
      "kind": "class",
      "label": "CacheService",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService"
    },
    {
      "attrs": {
        "class": "CacheService",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 36,
          "file": "app/services/cache.py",
          "start_line": 34
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService.__init__",
      "kind": "method",
      "label": "__init__",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService.__init__"
    },
    {
      "attrs": {
        "class": "CacheService",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 58,
          "file": "app/services/cache.py",
          "start_line": 50
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService.check_rate_limit",
      "kind": "method",
      "label": "check_rate_limit",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService.check_rate_limit"
    },
    {
      "attrs": {
        "class": "CacheService",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 47,
          "file": "app/services/cache.py",
          "start_line": 46
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService.close",
      "kind": "method",
      "label": "close",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService.close"
    },
    {
      "attrs": {
        "class": "CacheService",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 41,
          "file": "app/services/cache.py",
          "start_line": 39
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService.from_url",
      "kind": "method",
      "label": "from_url",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService.from_url"
    },
    {
      "attrs": {
        "class": "CacheService",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 74,
          "file": "app/services/cache.py",
          "start_line": 73
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService.get_embedding",
      "kind": "method",
      "label": "get_embedding",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService.get_embedding"
    },
    {
      "attrs": {
        "class": "CacheService",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 63,
          "file": "app/services/cache.py",
          "start_line": 61
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService.get_json",
      "kind": "method",
      "label": "get_json",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService.get_json"
    },
    {
      "attrs": {
        "class": "CacheService",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 81,
          "file": "app/services/cache.py",
          "start_line": 80
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService.get_seen_hash",
      "kind": "method",
      "label": "get_seen_hash",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService.get_seen_hash"
    },
    {
      "attrs": {
        "class": "CacheService",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 44,
          "file": "app/services/cache.py",
          "start_line": 43
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService.ping",
      "kind": "method",
      "label": "ping",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService.ping"
    },
    {
      "attrs": {
        "class": "CacheService",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 77,
          "file": "app/services/cache.py",
          "start_line": 76
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService.set_embedding",
      "kind": "method",
      "label": "set_embedding",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService.set_embedding"
    },
    {
      "attrs": {
        "class": "CacheService",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 70,
          "file": "app/services/cache.py",
          "start_line": 65
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService.set_json",
      "kind": "method",
      "label": "set_json",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService.set_json"
    },
    {
      "attrs": {
        "class": "CacheService",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 84,
          "file": "app/services/cache.py",
          "start_line": 83
        }
      ],
      "id": "app/services/cache.py#app.services.cache.CacheService.set_seen_hash",
      "kind": "method",
      "label": "set_seen_hash",
      "lang": "python",
      "qualified_name": "app.services.cache.CacheService.set_seen_hash"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 28,
          "file": "app/services/cache.py",
          "start_line": 27
        }
      ],
      "id": "app/services/cache.py#app.services.cache._hash",
      "kind": "function",
      "label": "_hash",
      "lang": "python",
      "qualified_name": "app.services.cache._hash"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 24,
          "file": "app/services/cache.py",
          "start_line": 23
        }
      ],
      "id": "app/services/cache.py#app.services.cache._key",
      "kind": "function",
      "label": "_key",
      "lang": "python",
      "qualified_name": "app.services.cache._key"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/citations.py",
          "start_line": 1
        }
      ],
      "id": "app/services/citations.py",
      "kind": "module",
      "label": "citations.py",
      "lang": "python",
      "qualified_name": "app/services/citations.py"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 20,
          "file": "app/services/citations.py",
          "start_line": 17
        }
      ],
      "id": "app/services/citations.py#app.services.citations._encode",
      "kind": "function",
      "label": "_encode",
      "lang": "python",
      "qualified_name": "app.services.citations._encode"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 46,
          "file": "app/services/citations.py",
          "start_line": 23
        }
      ],
      "id": "app/services/citations.py#app.services.citations.build_text_fragment",
      "kind": "function",
      "label": "build_text_fragment",
      "lang": "python",
      "qualified_name": "app.services.citations.build_text_fragment"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 63,
          "file": "app/services/citations.py",
          "start_line": 49
        }
      ],
      "id": "app/services/citations.py#app.services.citations.citation_link",
      "kind": "function",
      "label": "citation_link",
      "lang": "python",
      "qualified_name": "app.services.citations.citation_link"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/evaluation.py",
          "start_line": 1
        }
      ],
      "id": "app/services/evaluation.py",
      "kind": "module",
      "label": "evaluation.py",
      "lang": "python",
      "qualified_name": "app/services/evaluation.py"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 109,
          "file": "app/services/evaluation.py",
          "start_line": 77
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation._geval_metrics",
      "kind": "function",
      "label": "_geval_metrics",
      "lang": "python",
      "qualified_name": "app.services.evaluation._geval_metrics"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 165,
          "file": "app/services/evaluation.py",
          "start_line": 154
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation._metric_name",
      "kind": "function",
      "label": "_metric_name",
      "lang": "python",
      "qualified_name": "app.services.evaluation._metric_name"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 74,
          "file": "app/services/evaluation.py",
          "start_line": 36
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation.build_judge",
      "kind": "function",
      "label": "build_judge",
      "lang": "python",
      "qualified_name": "app.services.evaluation.build_judge"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 72,
          "file": "app/services/evaluation.py",
          "start_line": 40
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation.build_judge._LangchainJudge",
      "kind": "class",
      "label": "_LangchainJudge",
      "lang": "python",
      "qualified_name": "app.services.evaluation.build_judge._LangchainJudge"
    },
    {
      "attrs": {
        "class": "_LangchainJudge",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 42,
          "file": "app/services/evaluation.py",
          "start_line": 41
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation.build_judge._LangchainJudge.__init__",
      "kind": "method",
      "label": "__init__",
      "lang": "python",
      "qualified_name": "app.services.evaluation.build_judge._LangchainJudge.__init__"
    },
    {
      "attrs": {
        "class": "_LangchainJudge",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 69,
          "file": "app/services/evaluation.py",
          "start_line": 61
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation.build_judge._LangchainJudge.a_generate",
      "kind": "method",
      "label": "a_generate",
      "lang": "python",
      "qualified_name": "app.services.evaluation.build_judge._LangchainJudge.a_generate"
    },
    {
      "attrs": {
        "class": "_LangchainJudge",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 59,
          "file": "app/services/evaluation.py",
          "start_line": 52
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation.build_judge._LangchainJudge.generate",
      "kind": "method",
      "label": "generate",
      "lang": "python",
      "qualified_name": "app.services.evaluation.build_judge._LangchainJudge.generate"
    },
    {
      "attrs": {
        "class": "_LangchainJudge",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 72,
          "file": "app/services/evaluation.py",
          "start_line": 71
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation.build_judge._LangchainJudge.get_model_name",
      "kind": "method",
      "label": "get_model_name",
      "lang": "python",
      "qualified_name": "app.services.evaluation.build_judge._LangchainJudge.get_model_name"
    },
    {
      "attrs": {
        "class": "_LangchainJudge",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 45,
          "file": "app/services/evaluation.py",
          "start_line": 44
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation.build_judge._LangchainJudge.load_model",
      "kind": "method",
      "label": "load_model",
      "lang": "python",
      "qualified_name": "app.services.evaluation.build_judge._LangchainJudge.load_model"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 219,
          "file": "app/services/evaluation.py",
          "start_line": 194
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation.evaluate_and_score",
      "kind": "function",
      "label": "evaluate_and_score",
      "lang": "python",
      "qualified_name": "app.services.evaluation.evaluate_and_score"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 126,
          "file": "app/services/evaluation.py",
          "start_line": 112
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation.live_metrics",
      "kind": "function",
      "label": "live_metrics",
      "lang": "python",
      "qualified_name": "app.services.evaluation.live_metrics"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 151,
          "file": "app/services/evaluation.py",
          "start_line": 129
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation.offline_metrics",
      "kind": "function",
      "label": "offline_metrics",
      "lang": "python",
      "qualified_name": "app.services.evaluation.offline_metrics"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 191,
          "file": "app/services/evaluation.py",
          "start_line": 168
        }
      ],
      "id": "app/services/evaluation.py#app.services.evaluation.score_test_case",
      "kind": "function",
      "label": "score_test_case",
      "lang": "python",
      "qualified_name": "app.services.evaluation.score_test_case"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/milvus_store.py",
          "start_line": 1
        }
      ],
      "id": "app/services/milvus_store.py",
      "kind": "module",
      "label": "milvus_store.py",
      "lang": "python",
      "qualified_name": "app/services/milvus_store.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 262,
          "file": "app/services/milvus_store.py",
          "start_line": 70
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore",
      "kind": "class",
      "label": "MilvusStore",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.MilvusStore"
    },
    {
      "attrs": {
        "class": "MilvusStore",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 76,
          "file": "app/services/milvus_store.py",
          "start_line": 73
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.__init__",
      "kind": "method",
      "label": "__init__",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.MilvusStore.__init__"
    },
    {
      "attrs": {
        "class": "MilvusStore",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 133,
          "file": "app/services/milvus_store.py",
          "start_line": 127
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore._has_expected_fields",
      "kind": "method",
      "label": "_has_expected_fields",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.MilvusStore._has_expected_fields"
    },
    {
      "attrs": {
        "class": "MilvusStore",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 84,
          "file": "app/services/milvus_store.py",
          "start_line": 79
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.connect",
      "kind": "method",
      "label": "connect",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.MilvusStore.connect"
    },
    {
      "attrs": {
        "class": "MilvusStore",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 181,
          "file": "app/services/milvus_store.py",
          "start_line": 179
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.count",
      "kind": "method",
      "label": "count",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.MilvusStore.count"
    },
    {
      "attrs": {
        "class": "MilvusStore",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 125,
          "file": "app/services/milvus_store.py",
          "start_line": 87
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.ensure_collection",
      "kind": "method",
      "label": "ensure_collection",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.MilvusStore.ensure_collection"
    },
    {
      "attrs": {
        "class": "MilvusStore",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 234,
          "file": "app/services/milvus_store.py",
          "start_line": 184
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.replace_document",
      "kind": "method",
      "label": "replace_document",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.MilvusStore.replace_document"
    },
    {
      "attrs": {
        "class": "MilvusStore",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 168,
          "file": "app/services/milvus_store.py",
          "start_line": 136
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.search",
      "kind": "method",
      "label": "search",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.MilvusStore.search"
    },
    {
      "attrs": {
        "class": "MilvusStore",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 177,
          "file": "app/services/milvus_store.py",
          "start_line": 170
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.stored_hash",
      "kind": "method",
      "label": "stored_hash",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.MilvusStore.stored_hash"
    },
    {
      "attrs": {
        "class": "MilvusStore",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 262,
          "file": "app/services/milvus_store.py",
          "start_line": 236
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.MilvusStore.touch_last_checked",
      "kind": "method",
      "label": "touch_last_checked",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.MilvusStore.touch_last_checked"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 53,
          "file": "app/services/milvus_store.py",
          "start_line": 51
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store._quote_list",
      "kind": "function",
      "label": "_quote_list",
      "lang": "python",
      "qualified_name": "app.services.milvus_store._quote_list"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 22,
          "file": "app/services/milvus_store.py",
          "start_line": 19
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.chunk_id",
      "kind": "function",
      "label": "chunk_id",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.chunk_id"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 28,
          "file": "app/services/milvus_store.py",
          "start_line": 25
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.content_hash",
      "kind": "function",
      "label": "content_hash",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.content_hash"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 67,
          "file": "app/services/milvus_store.py",
          "start_line": 56
        }
      ],
      "id": "app/services/milvus_store.py#app.services.milvus_store.source_filter",
      "kind": "function",
      "label": "source_filter",
      "lang": "python",
      "qualified_name": "app.services.milvus_store.source_filter"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/ollama_llm.py",
          "start_line": 1
        }
      ],
      "id": "app/services/ollama_llm.py",
      "kind": "module",
      "label": "ollama_llm.py",
      "lang": "python",
      "qualified_name": "app/services/ollama_llm.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 46,
          "file": "app/services/ollama_llm.py",
          "start_line": 21
        }
      ],
      "id": "app/services/ollama_llm.py#app.services.ollama_llm.build_chat_llm",
      "kind": "function",
      "label": "build_chat_llm",
      "lang": "python",
      "qualified_name": "app.services.ollama_llm.build_chat_llm"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 82,
          "file": "app/services/ollama_llm.py",
          "start_line": 76
        }
      ],
      "id": "app/services/ollama_llm.py#app.services.ollama_llm.build_embeddings",
      "kind": "function",
      "label": "build_embeddings",
      "lang": "python",
      "qualified_name": "app.services.ollama_llm.build_embeddings"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 73,
          "file": "app/services/ollama_llm.py",
          "start_line": 49
        }
      ],
      "id": "app/services/ollama_llm.py#app.services.ollama_llm.build_eval_llm",
      "kind": "function",
      "label": "build_eval_llm",
      "lang": "python",
      "qualified_name": "app.services.ollama_llm.build_eval_llm"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/reranker.py",
          "start_line": 1
        }
      ],
      "id": "app/services/reranker.py",
      "kind": "module",
      "label": "reranker.py",
      "lang": "python",
      "qualified_name": "app/services/reranker.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 20,
          "file": "app/services/reranker.py",
          "start_line": 16
        }
      ],
      "id": "app/services/reranker.py#app.services.reranker.RerankCandidate",
      "kind": "class",
      "label": "RerankCandidate",
      "lang": "python",
      "qualified_name": "app.services.reranker.RerankCandidate"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 51,
          "file": "app/services/reranker.py",
          "start_line": 23
        }
      ],
      "id": "app/services/reranker.py#app.services.reranker.Reranker",
      "kind": "class",
      "label": "Reranker",
      "lang": "python",
      "qualified_name": "app.services.reranker.Reranker"
    },
    {
      "attrs": {
        "class": "Reranker",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 33,
          "file": "app/services/reranker.py",
          "start_line": 26
        }
      ],
      "id": "app/services/reranker.py#app.services.reranker.Reranker.__init__",
      "kind": "method",
      "label": "__init__",
      "lang": "python",
      "qualified_name": "app.services.reranker.Reranker.__init__"
    },
    {
      "attrs": {
        "class": "Reranker",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 37,
          "file": "app/services/reranker.py",
          "start_line": 36
        }
      ],
      "id": "app/services/reranker.py#app.services.reranker.Reranker.load",
      "kind": "method",
      "label": "load",
      "lang": "python",
      "qualified_name": "app.services.reranker.Reranker.load"
    },
    {
      "attrs": {
        "class": "Reranker",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 51,
          "file": "app/services/reranker.py",
          "start_line": 39
        }
      ],
      "id": "app/services/reranker.py#app.services.reranker.Reranker.rerank",
      "kind": "method",
      "label": "rerank",
      "lang": "python",
      "qualified_name": "app.services.reranker.Reranker.rerank"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/tracing.py",
          "start_line": 1
        }
      ],
      "id": "app/services/tracing.py",
      "kind": "module",
      "label": "tracing.py",
      "lang": "python",
      "qualified_name": "app/services/tracing.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 79,
          "file": "app/services/tracing.py",
          "start_line": 47
        }
      ],
      "id": "app/services/tracing.py#app.services.tracing.attach_citations",
      "kind": "function",
      "label": "attach_citations",
      "lang": "python",
      "qualified_name": "app.services.tracing.attach_citations"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 97,
          "file": "app/services/tracing.py",
          "start_line": 82
        }
      ],
      "id": "app/services/tracing.py#app.services.tracing.langfuse_client",
      "kind": "function",
      "label": "langfuse_client",
      "lang": "python",
      "qualified_name": "app.services.tracing.langfuse_client"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 44,
          "file": "app/services/tracing.py",
          "start_line": 22
        }
      ],
      "id": "app/services/tracing.py#app.services.tracing.make_chat_handler",
      "kind": "function",
      "label": "make_chat_handler",
      "lang": "python",
      "qualified_name": "app.services.tracing.make_chat_handler"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 19,
          "file": "app/services/tracing.py",
          "start_line": 17
        }
      ],
      "id": "app/services/tracing.py#app.services.tracing.tracing_enabled",
      "kind": "function",
      "label": "tracing_enabled",
      "lang": "python",
      "qualified_name": "app.services.tracing.tracing_enabled"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/websearch.py",
          "start_line": 1
        }
      ],
      "id": "app/services/websearch.py",
      "kind": "module",
      "label": "websearch.py",
      "lang": "python",
      "qualified_name": "app/services/websearch.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 35,
          "file": "app/services/websearch.py",
          "start_line": 32
        }
      ],
      "id": "app/services/websearch.py#app.services.websearch.WebDocument",
      "kind": "class",
      "label": "WebDocument",
      "lang": "python",
      "qualified_name": "app.services.websearch.WebDocument"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 169,
          "file": "app/services/websearch.py",
          "start_line": 38
        }
      ],
      "id": "app/services/websearch.py#app.services.websearch.WebSearchService",
      "kind": "class",
      "label": "WebSearchService",
      "lang": "python",
      "qualified_name": "app.services.websearch.WebSearchService"
    },
    {
      "attrs": {
        "class": "WebSearchService",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 41,
          "file": "app/services/websearch.py",
          "start_line": 39
        }
      ],
      "id": "app/services/websearch.py#app.services.websearch.WebSearchService.__init__",
      "kind": "method",
      "label": "__init__",
      "lang": "python",
      "qualified_name": "app.services.websearch.WebSearchService.__init__"
    },
    {
      "attrs": {
        "class": "WebSearchService",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 88,
          "file": "app/services/websearch.py",
          "start_line": 50
        }
      ],
      "id": "app/services/websearch.py#app.services.websearch.WebSearchService._ddg_search",
      "kind": "method",
      "label": "_ddg_search",
      "lang": "python",
      "qualified_name": "app.services.websearch.WebSearchService._ddg_search"
    },
    {
      "attrs": {
        "class": "WebSearchService",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 67,
          "file": "app/services/websearch.py",
          "start_line": 63
        }
      ],
      "id": "app/services/websearch.py#app.services.websearch.WebSearchService._ddg_search._run",
      "kind": "method",
      "label": "_run",
      "lang": "python",
      "qualified_name": "app.services.websearch.WebSearchService._ddg_search._run"
    },
    {
      "attrs": {
        "class": "WebSearchService",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 44,
          "file": "app/services/websearch.py",
          "start_line": 43
        }
      ],
      "id": "app/services/websearch.py#app.services.websearch.WebSearchService._domains",
      "kind": "method",
      "label": "_domains",
      "lang": "python",
      "qualified_name": "app.services.websearch.WebSearchService._domains"
    },
    {
      "attrs": {
        "class": "WebSearchService",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 135,
          "file": "app/services/websearch.py",
          "start_line": 90
        }
      ],
      "id": "app/services/websearch.py#app.services.websearch.WebSearchService._fetch_and_extract",
      "kind": "method",
      "label": "_fetch_and_extract",
      "lang": "python",
      "qualified_name": "app.services.websearch.WebSearchService._fetch_and_extract"
    },
    {
      "attrs": {
        "class": "WebSearchService",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 48,
          "file": "app/services/websearch.py",
          "start_line": 46
        }
      ],
      "id": "app/services/websearch.py#app.services.websearch.WebSearchService._host_allowed",
      "kind": "method",
      "label": "_host_allowed",
      "lang": "python",
      "qualified_name": "app.services.websearch.WebSearchService._host_allowed"
    },
    {
      "attrs": {
        "class": "WebSearchService",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 169,
          "file": "app/services/websearch.py",
          "start_line": 137
        }
      ],
      "id": "app/services/websearch.py#app.services.websearch.WebSearchService.search",
      "kind": "method",
      "label": "search",
      "lang": "python",
      "qualified_name": "app.services.websearch.WebSearchService.search"
    },
    {
      "attrs": {
        "class": "WebSearchService",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 166,
          "file": "app/services/websearch.py",
          "start_line": 155
        }
      ],
      "id": "app/services/websearch.py#app.services.websearch.WebSearchService.search._build",
      "kind": "method",
      "label": "_build",
      "lang": "python",
      "qualified_name": "app.services.websearch.WebSearchService.search._build"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/skills/__init__.py",
          "start_line": 1
        }
      ],
      "id": "app/skills/__init__.py",
      "kind": "module",
      "label": "__init__.py",
      "lang": "python",
      "qualified_name": "app/skills/__init__.py"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "app/skills/registry.py",
          "start_line": 1
        }
      ],
      "id": "app/skills/registry.py",
      "kind": "module",
      "label": "registry.py",
      "lang": "python",
      "qualified_name": "app/skills/registry.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 36,
          "file": "app/skills/registry.py",
          "start_line": 25
        }
      ],
      "id": "app/skills/registry.py#app.skills.registry.Skill",
      "kind": "class",
      "label": "Skill",
      "lang": "python",
      "qualified_name": "app.skills.registry.Skill"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 116,
          "file": "app/skills/registry.py",
          "start_line": 65
        }
      ],
      "id": "app/skills/registry.py#app.skills.registry.SkillRegistry",
      "kind": "class",
      "label": "SkillRegistry",
      "lang": "python",
      "qualified_name": "app.skills.registry.SkillRegistry"
    },
    {
      "attrs": {
        "class": "SkillRegistry",
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 67,
          "file": "app/skills/registry.py",
          "start_line": 66
        }
      ],
      "id": "app/skills/registry.py#app.skills.registry.SkillRegistry.__init__",
      "kind": "method",
      "label": "__init__",
      "lang": "python",
      "qualified_name": "app.skills.registry.SkillRegistry.__init__"
    },
    {
      "attrs": {
        "class": "SkillRegistry",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 113,
          "file": "app/skills/registry.py",
          "start_line": 112
        }
      ],
      "id": "app/skills/registry.py#app.skills.registry.SkillRegistry.all",
      "kind": "method",
      "label": "all",
      "lang": "python",
      "qualified_name": "app.skills.registry.SkillRegistry.all"
    },
    {
      "attrs": {
        "class": "SkillRegistry",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 110,
          "file": "app/skills/registry.py",
          "start_line": 107
        }
      ],
      "id": "app/skills/registry.py#app.skills.registry.SkillRegistry.get",
      "kind": "method",
      "label": "get",
      "lang": "python",
      "qualified_name": "app.skills.registry.SkillRegistry.get"
    },
    {
      "attrs": {
        "class": "SkillRegistry",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 105,
          "file": "app/skills/registry.py",
          "start_line": 70
        }
      ],
      "id": "app/skills/registry.py#app.skills.registry.SkillRegistry.load",
      "kind": "method",
      "label": "load",
      "lang": "python",
      "qualified_name": "app.skills.registry.SkillRegistry.load"
    },
    {
      "attrs": {
        "class": "SkillRegistry",
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 116,
          "file": "app/skills/registry.py",
          "start_line": 115
        }
      ],
      "id": "app/skills/registry.py#app.skills.registry.SkillRegistry.names",
      "kind": "method",
      "label": "names",
      "lang": "python",
      "qualified_name": "app.skills.registry.SkillRegistry.names"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 62,
          "file": "app/skills/registry.py",
          "start_line": 57
        }
      ],
      "id": "app/skills/registry.py#app.skills.registry._resolve_skills_dir",
      "kind": "function",
      "label": "_resolve_skills_dir",
      "lang": "python",
      "qualified_name": "app.skills.registry._resolve_skills_dir"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 50,
          "file": "app/skills/registry.py",
          "start_line": 39
        }
      ],
      "id": "app/skills/registry.py#app.skills.registry.parse_frontmatter",
      "kind": "function",
      "label": "parse_frontmatter",
      "lang": "python",
      "qualified_name": "app.skills.registry.parse_frontmatter"
    },
    {
      "attrs": {
        "build_context": ".",
        "build_line": "69",
        "dockerfile": "Dockerfile",
        "ships": "requirements.txt:20\napp:23\nskills:24"
      },
      "evidence": [
        {
          "end_line": 68,
          "file": "docker-compose.yml",
          "start_line": 68
        }
      ],
      "id": "docker-compose.yml#service.api",
      "kind": "service",
      "label": "api",
      "lang": "compose",
      "qualified_name": "api"
    },
    {
      "attrs": {
        "image": "zilliz/attu:v2.4"
      },
      "evidence": [
        {
          "end_line": 91,
          "file": "docker-compose.yml",
          "start_line": 91
        }
      ],
      "id": "docker-compose.yml#service.attu",
      "kind": "service",
      "label": "attu",
      "lang": "compose",
      "qualified_name": "attu"
    },
    {
      "attrs": {
        "image": "quay.io/coreos/etcd:v3.5.16"
      },
      "evidence": [
        {
          "end_line": 2,
          "file": "docker-compose.yml",
          "start_line": 2
        }
      ],
      "id": "docker-compose.yml#service.etcd",
      "kind": "service",
      "label": "etcd",
      "lang": "compose",
      "qualified_name": "etcd"
    },
    {
      "attrs": {
        "image": "langfuse/langfuse:2"
      },
      "evidence": [
        {
          "end_line": 118,
          "file": "docker-compose.yml",
          "start_line": 118
        }
      ],
      "id": "docker-compose.yml#service.langfuse",
      "kind": "service",
      "label": "langfuse",
      "lang": "compose",
      "qualified_name": "langfuse"
    },
    {
      "attrs": {
        "image": "postgres:16-alpine"
      },
      "evidence": [
        {
          "end_line": 103,
          "file": "docker-compose.yml",
          "start_line": 103
        }
      ],
      "id": "docker-compose.yml#service.langfuse-db",
      "kind": "datastore",
      "label": "langfuse-db",
      "lang": "compose",
      "qualified_name": "langfuse-db"
    },
    {
      "attrs": {
        "image": "milvusdb/milvus:v2.5.3"
      },
      "evidence": [
        {
          "end_line": 35,
          "file": "docker-compose.yml",
          "start_line": 35
        }
      ],
      "id": "docker-compose.yml#service.milvus-standalone",
      "kind": "service",
      "label": "milvus-standalone",
      "lang": "compose",
      "qualified_name": "milvus-standalone"
    },
    {
      "attrs": {
        "image": "minio/minio:RELEASE.2024-12-18T13-15-44Z"
      },
      "evidence": [
        {
          "end_line": 18,
          "file": "docker-compose.yml",
          "start_line": 18
        }
      ],
      "id": "docker-compose.yml#service.minio",
      "kind": "datastore",
      "label": "minio",
      "lang": "compose",
      "qualified_name": "minio"
    },
    {
      "attrs": {
        "image": "redis:7.4-alpine"
      },
      "evidence": [
        {
          "end_line": 56,
          "file": "docker-compose.yml",
          "start_line": 56
        }
      ],
      "id": "docker-compose.yml#service.redis",
      "kind": "datastore",
      "label": "redis",
      "lang": "compose",
      "qualified_name": "redis"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "scripts/download_models.py",
          "start_line": 1
        }
      ],
      "id": "scripts/download_models.py",
      "kind": "module",
      "label": "download_models.py",
      "lang": "python",
      "qualified_name": "scripts/download_models.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 46,
          "file": "scripts/download_models.py",
          "start_line": 24
        }
      ],
      "id": "scripts/download_models.py#scripts.download_models.main",
      "kind": "function",
      "label": "main",
      "lang": "python",
      "qualified_name": "scripts.download_models.main"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "scripts/export_graph.py",
          "start_line": 1
        }
      ],
      "id": "scripts/export_graph.py",
      "kind": "module",
      "label": "export_graph.py",
      "lang": "python",
      "qualified_name": "scripts/export_graph.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 46,
          "file": "scripts/export_graph.py",
          "start_line": 27
        }
      ],
      "id": "scripts/export_graph.py#scripts.export_graph.main",
      "kind": "function",
      "label": "main",
      "lang": "python",
      "qualified_name": "scripts.export_graph.main"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "tests/test_citations.py",
          "start_line": 1
        }
      ],
      "id": "tests/test_citations.py",
      "kind": "module",
      "label": "test_citations.py",
      "lang": "python",
      "qualified_name": "tests/test_citations.py"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 58,
          "file": "tests/test_citations.py",
          "start_line": 53
        }
      ],
      "id": "tests/test_citations.py#tests.test_citations.test_citation_link_highlights_scraped_sources",
      "kind": "function",
      "label": "test_citation_link_highlights_scraped_sources",
      "lang": "python",
      "qualified_name": "tests.test_citations.test_citation_link_highlights_scraped_sources"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 72,
          "file": "tests/test_citations.py",
          "start_line": 69
        }
      ],
      "id": "tests/test_citations.py#tests.test_citations.test_citation_link_reference_quote_is_truncated",
      "kind": "function",
      "label": "test_citation_link_reference_quote_is_truncated",
      "lang": "python",
      "qualified_name": "tests.test_citations.test_citation_link_reference_quote_is_truncated"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 66,
          "file": "tests/test_citations.py",
          "start_line": 61
        }
      ],
      "id": "tests/test_citations.py#tests.test_citations.test_citation_link_reference_uses_plain_url",
      "kind": "function",
      "label": "test_citation_link_reference_uses_plain_url",
      "lang": "python",
      "qualified_name": "tests.test_citations.test_citation_link_reference_uses_plain_url"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 50,
          "file": "tests/test_citations.py",
          "start_line": 47
        }
      ],
      "id": "tests/test_citations.py#tests.test_citations.test_empty_text_returns_plain_url",
      "kind": "function",
      "label": "test_empty_text_returns_plain_url",
      "lang": "python",
      "qualified_name": "tests.test_citations.test_empty_text_returns_plain_url"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 28,
          "file": "tests/test_citations.py",
          "start_line": 21
        }
      ],
      "id": "tests/test_citations.py#tests.test_citations.test_long_text_uses_start_end_range",
      "kind": "function",
      "label": "test_long_text_uses_start_end_range",
      "lang": "python",
      "qualified_name": "tests.test_citations.test_long_text_uses_start_end_range"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 18,
          "file": "tests/test_citations.py",
          "start_line": 12
        }
      ],
      "id": "tests/test_citations.py#tests.test_citations.test_short_text_uses_single_term",
      "kind": "function",
      "label": "test_short_text_uses_single_term",
      "lang": "python",
      "qualified_name": "tests.test_citations.test_short_text_uses_single_term"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 38,
          "file": "tests/test_citations.py",
          "start_line": 31
        }
      ],
      "id": "tests/test_citations.py#tests.test_citations.test_special_characters_are_percent_encoded",
      "kind": "function",
      "label": "test_special_characters_are_percent_encoded",
      "lang": "python",
      "qualified_name": "tests.test_citations.test_special_characters_are_percent_encoded"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 44,
          "file": "tests/test_citations.py",
          "start_line": 41
        }
      ],
      "id": "tests/test_citations.py#tests.test_citations.test_whitespace_is_normalised",
      "kind": "function",
      "label": "test_whitespace_is_normalised",
      "lang": "python",
      "qualified_name": "tests.test_citations.test_whitespace_is_normalised"
    },
    {
      "attrs": {},
      "evidence": [
        {
          "end_line": 1,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 1
        }
      ],
      "id": "tests/test_websearch_allowlist.py",
      "kind": "module",
      "label": "test_websearch_allowlist.py",
      "lang": "python",
      "qualified_name": "tests/test_websearch_allowlist.py"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 47,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 44
        }
      ],
      "id": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist._restore_httpx_client",
      "kind": "function",
      "label": "_restore_httpx_client",
      "lang": "python",
      "qualified_name": "tests.test_websearch_allowlist._restore_httpx_client"
    },
    {
      "attrs": {
        "exported": "false"
      },
      "evidence": [
        {
          "end_line": 40,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 28
        }
      ],
      "id": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist._service_with_transport",
      "kind": "function",
      "label": "_service_with_transport",
      "lang": "python",
      "qualified_name": "tests.test_websearch_allowlist._service_with_transport"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 37,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 35
        }
      ],
      "id": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist._service_with_transport.patched_client",
      "kind": "function",
      "label": "patched_client",
      "lang": "python",
      "qualified_name": "tests.test_websearch_allowlist._service_with_transport.patched_client"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 95,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 91
        }
      ],
      "id": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist.test_host_allowed_rejects_lookalike_domains",
      "kind": "function",
      "label": "test_host_allowed_rejects_lookalike_domains",
      "lang": "python",
      "qualified_name": "tests.test_websearch_allowlist.test_host_allowed_rejects_lookalike_domains"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 60,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 51
        }
      ],
      "id": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist.test_redirect_to_off_allowlist_host_is_dropped",
      "kind": "function",
      "label": "test_redirect_to_off_allowlist_host_is_dropped",
      "lang": "python",
      "qualified_name": "tests.test_websearch_allowlist.test_redirect_to_off_allowlist_host_is_dropped"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 55,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 52
        }
      ],
      "id": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist.test_redirect_to_off_allowlist_host_is_dropped.handler",
      "kind": "function",
      "label": "handler",
      "lang": "python",
      "qualified_name": "tests.test_websearch_allowlist.test_redirect_to_off_allowlist_host_is_dropped.handler"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 76,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 64
        }
      ],
      "id": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist.test_same_host_redirect_is_kept_with_final_url",
      "kind": "function",
      "label": "test_same_host_redirect_is_kept_with_final_url",
      "lang": "python",
      "qualified_name": "tests.test_websearch_allowlist.test_same_host_redirect_is_kept_with_final_url"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 68,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 65
        }
      ],
      "id": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist.test_same_host_redirect_is_kept_with_final_url.handler",
      "kind": "function",
      "label": "handler",
      "lang": "python",
      "qualified_name": "tests.test_websearch_allowlist.test_same_host_redirect_is_kept_with_final_url.handler"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 88,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 80
        }
      ],
      "id": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist.test_subdomain_of_allowlisted_host_is_allowed",
      "kind": "function",
      "label": "test_subdomain_of_allowlisted_host_is_allowed",
      "lang": "python",
      "qualified_name": "tests.test_websearch_allowlist.test_subdomain_of_allowlisted_host_is_allowed"
    },
    {
      "attrs": {
        "exported": "true"
      },
      "evidence": [
        {
          "end_line": 82,
          "file": "tests/test_websearch_allowlist.py",
          "start_line": 81
        }
      ],
      "id": "tests/test_websearch_allowlist.py#tests.test_websearch_allowlist.test_subdomain_of_allowlisted_host_is_allowed.handler",
      "kind": "function",
      "label": "handler",
      "lang": "python",
      "qualified_name": "tests.test_websearch_allowlist.test_subdomain_of_allowlisted_host_is_allowed.handler"
    },
    {
      "attrs": {
        "framework": "fastapi",
        "handler": "app.api.conversations.list_conversations",
        "method": "GET",
        "path": "/conversations"
      },
      "evidence": [
        {
          "end_line": 97,
          "file": "app/api/conversations.py",
          "start_line": 97
        }
      ],
      "id": "app/api/conversations.py#app.api.conversations.list_conversations#route:GET /conversations",
      "kind": "endpoint",
      "label": "GET /conversations",
      "lang": null,
      "qualified_name": "app/api/conversations.py#app.api.conversations.list_conversations#route:GET /conversations"
    },
    {
      "attrs": {
        "framework": "fastapi",
        "handler": "app.api.conversations.get_conversation",
        "method": "GET",
        "path": "/conversations/{thread_id:path}"
      },
      "evidence": [
        {
          "end_line": 129,
          "file": "app/api/conversations.py",
          "start_line": 129
        }
      ],
      "id": "app/api/conversations.py#app.api.conversations.get_conversation#route:GET /conversations/{thread_id:path}",
      "kind": "endpoint",
      "label": "GET /conversations/{thread_id:path}",
      "lang": null,
      "qualified_name": "app/api/conversations.py#app.api.conversations.get_conversation#route:GET /conversations/{thread_id:path}"
    },
    {
      "attrs": {
        "framework": "fastapi",
        "handler": "app.api.chat.health",
        "method": "GET",
        "path": "/health"
      },
      "evidence": [
        {
          "end_line": 69,
          "file": "app/api/chat.py",
          "start_line": 69
        }
      ],
      "id": "app/api/chat.py#app.api.chat.health#route:GET /health",
      "kind": "endpoint",
      "label": "GET /health",
      "lang": null,
      "qualified_name": "app/api/chat.py#app.api.chat.health#route:GET /health"
    },
    {
      "attrs": {
        "framework": "fastapi",
        "handler": "app.api.skills.list_skills",
        "method": "GET",
        "path": "/skills"
      },
      "evidence": [
        {
          "end_line": 12,
          "file": "app/api/skills.py",
          "start_line": 12
        }
      ],
      "id": "app/api/skills.py#app.api.skills.list_skills#route:GET /skills",
      "kind": "endpoint",
      "label": "GET /skills",
      "lang": null,
      "qualified_name": "app/api/skills.py#app.api.skills.list_skills#route:GET /skills"
    },
    {
      "attrs": {
        "framework": "fastapi",
        "handler": "app.api.admin.ingest",
        "method": "POST",
        "path": "/admin/ingest"
      },
      "evidence": [
        {
          "end_line": 25,
          "file": "app/api/admin.py",
          "start_line": 25
        }
      ],
      "id": "app/api/admin.py#app.api.admin.ingest#route:POST /admin/ingest",
      "kind": "endpoint",
      "label": "POST /admin/ingest",
      "lang": null,
      "qualified_name": "app/api/admin.py#app.api.admin.ingest#route:POST /admin/ingest"
    },
    {
      "attrs": {
        "framework": "fastapi",
        "handler": "app.api.chat.chat",
        "method": "POST",
        "path": "/chat"
      },
      "evidence": [
        {
          "end_line": 84,
          "file": "app/api/chat.py",
          "start_line": 84
        }
      ],
      "id": "app/api/chat.py#app.api.chat.chat#route:POST /chat",
      "kind": "endpoint",
      "label": "POST /chat",
      "lang": null,
      "qualified_name": "app/api/chat.py#app.api.chat.chat#route:POST /chat"
    },
    {
      "attrs": {
        "category": "cloud",
        "packages": "langchain_openai"
      },
      "evidence": [
        {
          "end_line": 31,
          "file": "app/services/ollama_llm.py",
          "start_line": 31
        }
      ],
      "id": "ext:cloud:OpenAI API",
      "kind": "resource",
      "label": "OpenAI API",
      "lang": null,
      "qualified_name": "ext:cloud:OpenAI API"
    },
    {
      "attrs": {
        "category": "database",
        "packages": "pymilvus"
      },
      "evidence": [
        {
          "end_line": 14,
          "file": "app/services/milvus_store.py",
          "start_line": 14
        }
      ],
      "id": "ext:database:Milvus",
      "kind": "datastore",
      "label": "Milvus",
      "lang": null,
      "qualified_name": "ext:database:Milvus"
    },
    {
      "attrs": {
        "category": "database",
        "packages": "redis"
      },
      "evidence": [
        {
          "end_line": 18,
          "file": "app/services/cache.py",
          "start_line": 18
        }
      ],
      "id": "ext:database:Redis",
      "kind": "datastore",
      "label": "Redis",
      "lang": null,
      "qualified_name": "ext:database:Redis"
    },
    {
      "attrs": {
        "category": "database",
        "packages": "sqlite3"
      },
      "evidence": [
        {
          "end_line": 13,
          "file": "app/api/conversations.py",
          "start_line": 13
        }
      ],
      "id": "ext:database:SQLite",
      "kind": "datastore",
      "label": "SQLite",
      "lang": null,
      "qualified_name": "ext:database:SQLite"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Adaptive RAG — toggle-driven hybrid retrieval API for regulated finance and legal research."
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/__init__.py",
          "start_line": 1
        }
      ],
      "id": "app/__init__.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Adaptive RAG — toggle-driven hybrid retrieval API for regul…",
      "lang": null,
      "qualified_name": "app/__init__.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Protected admin endpoint to trigger corpus ingestion / refresh on demand."
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/admin.py",
          "start_line": 1
        }
      ],
      "id": "app/api/admin.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Protected admin endpoint to trigger corpus ingestion / refr…",
      "lang": null,
      "qualified_name": "app/api/admin.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Streaming chat endpoint (SSE) and health check."
      },
      "evidence": [
        {
          "end_line": 13,
          "file": "app/api/chat.py",
          "start_line": 1
        }
      ],
      "id": "app/api/chat.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Streaming chat endpoint (SSE) and health check.",
      "lang": null,
      "qualified_name": "app/api/chat.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Conversation history endpoints."
      },
      "evidence": [
        {
          "end_line": 8,
          "file": "app/api/conversations.py",
          "start_line": 1
        }
      ],
      "id": "app/api/conversations.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Conversation history endpoints.",
      "lang": null,
      "qualified_name": "app/api/conversations.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Request/response schemas for the API."
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/models.py",
          "start_line": 1
        }
      ],
      "id": "app/api/models.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Request/response schemas for the API.",
      "lang": null,
      "qualified_name": "app/api/models.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Skill discovery endpoint — powers the frontend '/' menu."
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/skills.py",
          "start_line": 1
        }
      ],
      "id": "app/api/skills.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Skill discovery endpoint — powers the frontend '/' menu.",
      "lang": null,
      "qualified_name": "app/api/skills.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Application settings loaded from the environment / .env file."
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/config.py",
          "start_line": 1
        }
      ],
      "id": "app/config.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Application settings loaded from the environment / .env fil…",
      "lang": null,
      "qualified_name": "app/config.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Offline RAG evaluation harness (golden dataset + DeepEval retrieval metrics)."
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/eval/__init__.py",
          "start_line": 1
        }
      ],
      "id": "app/eval/__init__.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Offline RAG evaluation harness (golden dataset + DeepEval r…",
      "lang": null,
      "qualified_name": "app/eval/__init__.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Offline RAG evaluation against a golden dataset."
      },
      "evidence": [
        {
          "end_line": 17,
          "file": "app/eval/offline.py",
          "start_line": 1
        }
      ],
      "id": "app/eval/offline.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Offline RAG evaluation against a golden dataset.",
      "lang": null,
      "qualified_name": "app/eval/offline.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Assemble and compile the LangGraph state graph."
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/build.py",
          "start_line": 1
        }
      ],
      "id": "app/graph/build.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Assemble and compile the LangGraph state graph.",
      "lang": null,
      "qualified_name": "app/graph/build.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Graph nodes and routing functions for the hybrid RAG pipeline."
      },
      "evidence": [
        {
          "end_line": 8,
          "file": "app/graph/nodes.py",
          "start_line": 1
        }
      ],
      "id": "app/graph/nodes.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Graph nodes and routing functions for the hybrid RAG pipeli…",
      "lang": null,
      "qualified_name": "app/graph/nodes.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Prompts and a robust yes/no parser for the self-reflection graders."
      },
      "evidence": [
        {
          "end_line": 7,
          "file": "app/graph/prompts.py",
          "start_line": 1
        }
      ],
      "id": "app/graph/prompts.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Prompts and a robust yes/no parser for the self-reflection …",
      "lang": null,
      "qualified_name": "app/graph/prompts.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Graph state for the toggle-driven hybrid RAG pipeline."
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/state.py",
          "start_line": 1
        }
      ],
      "id": "app/graph/state.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Graph state for the toggle-driven hybrid RAG pipeline.",
      "lang": null,
      "qualified_name": "app/graph/state.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Topic-driven ingestion with content-hash change detection."
      },
      "evidence": [
        {
          "end_line": 7,
          "file": "app/ingestion/crawler.py",
          "start_line": 1
        }
      ],
      "id": "app/ingestion/crawler.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Topic-driven ingestion with content-hash change detection.",
      "lang": null,
      "qualified_name": "app/ingestion/crawler.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "CLI entrypoint for corpus ingestion / scheduled refresh."
      },
      "evidence": [
        {
          "end_line": 10,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 1
        }
      ],
      "id": "app/ingestion/run_ingest.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "CLI entrypoint for corpus ingestion / scheduled refresh.",
      "lang": null,
      "qualified_name": "app/ingestion/run_ingest.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "FastAPI application: lifespan wiring + routers."
      },
      "evidence": [
        {
          "end_line": 6,
          "file": "app/main.py",
          "start_line": 1
        }
      ],
      "id": "app/main.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "FastAPI application: lifespan wiring + routers.",
      "lang": null,
      "qualified_name": "app/main.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Redis-backed cache, rate limiting and crawl-state helpers."
      },
      "evidence": [
        {
          "end_line": 10,
          "file": "app/services/cache.py",
          "start_line": 1
        }
      ],
      "id": "app/services/cache.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Redis-backed cache, rate limiting and crawl-state helpers.",
      "lang": null,
      "qualified_name": "app/services/cache.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Thin async wrapper around Redis for the app's caching needs."
      },
      "evidence": [
        {
          "end_line": 32,
          "file": "app/services/cache.py",
          "start_line": 32
        }
      ],
      "id": "app/services/cache.py#rationale:32:docstring",
      "kind": "rationale",
      "label": "Thin async wrapper around Redis for the app's caching needs.",
      "lang": null,
      "qualified_name": "app/services/cache.py:32"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Build browser Text Fragment URLs so a citation can highlight its source text."
      },
      "evidence": [
        {
          "end_line": 10,
          "file": "app/services/citations.py",
          "start_line": 1
        }
      ],
      "id": "app/services/citations.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Build browser Text Fragment URLs so a citation can highligh…",
      "lang": null,
      "qualified_name": "app/services/citations.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "RAG/answer evaluation with DeepEval, wired to Langfuse scores."
      },
      "evidence": [
        {
          "end_line": 15,
          "file": "app/services/evaluation.py",
          "start_line": 1
        }
      ],
      "id": "app/services/evaluation.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "RAG/answer evaluation with DeepEval, wired to Langfuse scor…",
      "lang": null,
      "qualified_name": "app/services/evaluation.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Milvus vector store: schema, index, search and change-aware upsert."
      },
      "evidence": [
        {
          "end_line": 7,
          "file": "app/services/milvus_store.py",
          "start_line": 1
        }
      ],
      "id": "app/services/milvus_store.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Milvus vector store: schema, index, search and change-aware…",
      "lang": null,
      "qualified_name": "app/services/milvus_store.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Thin wrapper over MilvusClient for this app's single collection."
      },
      "evidence": [
        {
          "end_line": 71,
          "file": "app/services/milvus_store.py",
          "start_line": 71
        }
      ],
      "id": "app/services/milvus_store.py#rationale:71:docstring",
      "kind": "rationale",
      "label": "Thin wrapper over MilvusClient for this app's single collec…",
      "lang": null,
      "qualified_name": "app/services/milvus_store.py:71"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Chat LLM (Ollama or OpenRouter) and embeddings."
      },
      "evidence": [
        {
          "end_line": 11,
          "file": "app/services/ollama_llm.py",
          "start_line": 1
        }
      ],
      "id": "app/services/ollama_llm.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Chat LLM (Ollama or OpenRouter) and embeddings.",
      "lang": null,
      "qualified_name": "app/services/ollama_llm.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Cross-encoder reranker (BAAI/bge-reranker-v2-m3)."
      },
      "evidence": [
        {
          "end_line": 6,
          "file": "app/services/reranker.py",
          "start_line": 1
        }
      ],
      "id": "app/services/reranker.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Cross-encoder reranker (BAAI/bge-reranker-v2-m3).",
      "lang": null,
      "qualified_name": "app/services/reranker.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "A document considered for ranking, carrying its source metadata through."
      },
      "evidence": [
        {
          "end_line": 17,
          "file": "app/services/reranker.py",
          "start_line": 17
        }
      ],
      "id": "app/services/reranker.py#rationale:17:docstring",
      "kind": "rationale",
      "label": "A document considered for ranking, carrying its source meta…",
      "lang": null,
      "qualified_name": "app/services/reranker.py:17"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Wraps a FlagEmbedding cross-encoder and exposes a simple rerank API."
      },
      "evidence": [
        {
          "end_line": 24,
          "file": "app/services/reranker.py",
          "start_line": 24
        }
      ],
      "id": "app/services/reranker.py#rationale:24:docstring",
      "kind": "rationale",
      "label": "Wraps a FlagEmbedding cross-encoder and exposes a simple re…",
      "lang": null,
      "qualified_name": "app/services/reranker.py:24"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Langfuse tracing helpers (graceful, opt-in)."
      },
      "evidence": [
        {
          "end_line": 6,
          "file": "app/services/tracing.py",
          "start_line": 1
        }
      ],
      "id": "app/services/tracing.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Langfuse tracing helpers (graceful, opt-in).",
      "lang": null,
      "qualified_name": "app/services/tracing.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Allowlisted DuckDuckGo search + page fetch/extraction."
      },
      "evidence": [
        {
          "end_line": 13,
          "file": "app/services/websearch.py",
          "start_line": 1
        }
      ],
      "id": "app/services/websearch.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Allowlisted DuckDuckGo search + page fetch/extraction.",
      "lang": null,
      "qualified_name": "app/services/websearch.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Skill packages: slug-invocable advisory skills layered over the RAG graph."
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/skills/__init__.py",
          "start_line": 1
        }
      ],
      "id": "app/skills/__init__.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Skill packages: slug-invocable advisory skills layered over…",
      "lang": null,
      "qualified_name": "app/skills/__init__.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Skill registry: load ``skills/<name>/`` packages at startup."
      },
      "evidence": [
        {
          "end_line": 12,
          "file": "app/skills/registry.py",
          "start_line": 1
        }
      ],
      "id": "app/skills/registry.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Skill registry: load ``skills/<name>/`` packages at startup.",
      "lang": null,
      "qualified_name": "app/skills/registry.py:1"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Pre-download the reranker model so the API container starts instantly."
      },
      "evidence": [
        {
          "end_line": 10,
          "file": "scripts/download_models.py",
          "start_line": 2
        }
      ],
      "id": "scripts/download_models.py#rationale:2:docstring",
      "kind": "rationale",
      "label": "Pre-download the reranker model so the API container starts…",
      "lang": null,
      "qualified_name": "scripts/download_models.py:2"
    },
    {
      "attrs": {
        "kind": "docstring",
        "text": "Export the compiled LangGraph graph (Mermaid, and optionally PNG)."
      },
      "evidence": [
        {
          "end_line": 13,
          "file": "scripts/export_graph.py",
          "start_line": 1
        }
      ],
      "id": "scripts/export_graph.py#rationale:1:docstring",
      "kind": "rationale",
      "label": "Export the compiled LangGraph graph (Mermaid, and optionall…",
      "lang": null,
      "qualified_name": "scripts/export_graph.py:1"
    },
    {
      "attrs": {
        "files": "3",
        "structural": "directory"
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/__init__.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/config.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/main.py",
          "start_line": 1
        }
      ],
      "id": "app",
      "kind": "module",
      "label": "app",
      "lang": null,
      "qualified_name": "app"
    },
    {
      "attrs": {
        "files": "6",
        "structural": "directory"
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/api/admin.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/api/chat.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/api/conversations.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/api/models.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/api/skills.py",
          "start_line": 1
        },
        {
          "end_line": 0,
          "file": "app/api/__init__.py",
          "start_line": 0
        }
      ],
      "id": "app/api",
      "kind": "module",
      "label": "api",
      "lang": null,
      "qualified_name": "app/api"
    },
    {
      "attrs": {
        "files": "2",
        "structural": "directory"
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/eval/__init__.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/eval/offline.py",
          "start_line": 1
        }
      ],
      "id": "app/eval",
      "kind": "module",
      "label": "eval",
      "lang": null,
      "qualified_name": "app/eval"
    },
    {
      "attrs": {
        "files": "5",
        "structural": "directory"
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/graph/build.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/graph/nodes.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/graph/prompts.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/graph/state.py",
          "start_line": 1
        },
        {
          "end_line": 0,
          "file": "app/graph/__init__.py",
          "start_line": 0
        }
      ],
      "id": "app/graph",
      "kind": "module",
      "label": "graph",
      "lang": null,
      "qualified_name": "app/graph"
    },
    {
      "attrs": {
        "files": "3",
        "structural": "directory"
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/ingestion/crawler.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/ingestion/run_ingest.py",
          "start_line": 1
        },
        {
          "end_line": 0,
          "file": "app/ingestion/__init__.py",
          "start_line": 0
        }
      ],
      "id": "app/ingestion",
      "kind": "module",
      "label": "ingestion",
      "lang": null,
      "qualified_name": "app/ingestion"
    },
    {
      "attrs": {
        "files": "9",
        "structural": "directory"
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/services/cache.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/services/citations.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/services/evaluation.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/services/milvus_store.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/services/ollama_llm.py",
          "start_line": 1
        },
        {
          "end_line": 0,
          "file": "app/services/__init__.py",
          "start_line": 0
        }
      ],
      "id": "app/services",
      "kind": "module",
      "label": "services",
      "lang": null,
      "qualified_name": "app/services"
    },
    {
      "attrs": {
        "files": "2",
        "structural": "directory"
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "app/skills/__init__.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "app/skills/registry.py",
          "start_line": 1
        }
      ],
      "id": "app/skills",
      "kind": "module",
      "label": "skills",
      "lang": null,
      "qualified_name": "app/skills"
    },
    {
      "attrs": {
        "files": "2",
        "structural": "directory"
      },
      "evidence": [
        {
          "end_line": 1,
          "file": "scripts/download_models.py",
          "start_line": 1
        },
        {
          "end_line": 1,
          "file": "scripts/export_graph.py",
          "start_line": 1
        }
      ],
      "id": "scripts",
      "kind": "module",
      "label": "scripts",
      "lang": null,
      "qualified_name": "scripts"
    }
  ],
  "schema": 2,
  "scorecard": {
    "measures": "the share of intra-repository references pinned to a target, not whether the target is correct; a wrong edge counts as resolved",
    "rows": [
      {
        "candidate": 0,
        "external": 137,
        "kind": "calls",
        "lang": "python",
        "pinned_pct": 29.32,
        "resolved": 185,
        "unresolved": 446
      },
      {
        "candidate": 0,
        "external": 101,
        "kind": "imports",
        "lang": "python",
        "pinned_pct": 91.67,
        "resolved": 66,
        "unresolved": 6
      },
      {
        "candidate": 0,
        "external": 12,
        "kind": "inherits",
        "lang": "python",
        "pinned_pct": 0.0,
        "resolved": 0,
        "unresolved": 0
      },
      {
        "candidate": 0,
        "external": 82,
        "kind": "references",
        "lang": "python",
        "pinned_pct": 96.84,
        "resolved": 92,
        "unresolved": 3
      }
    ],
    "unresolved_samples": {
      "python/calls": [
        "member:Path(__file__).resolve",
        "member:into.errors.extend",
        "member:runtime.skills.all",
        "member:runtime.skills.get",
        "qualified:client.trace",
        "qualified:ingestor.ingest_skill",
        "qualified:ingestor.run",
        "qualified:topics_path.is_file",
        "qualified:total.as_dict",
        "qualified:trace.update"
      ],
      "python/imports": [
        "huggingface_hub",
        "pytest",
        "transformers",
        "yaml"
      ],
      "python/references": [
        "huggingface_hub",
        "transformers"
      ]
    }
  },
  "worktree_dirty": false
}
