[
  {
    "id": "g1",
    "symbol": "test_unregister_drops_registration_and_cached_instance",
    "file": "mempalace/tests/test_sources.py",
    "line": 199,
    "callers": [],
    "callees": [
      {
        "name": "register",
        "file": "mempalace/mempalace/sources/registry.py",
        "line": 41
      },
      {
        "name": "get_adapter",
        "file": "mempalace/mempalace/sources/registry.py",
        "line": 111
      },
      {
        "name": "unregister",
        "file": "mempalace/mempalace/sources/registry.py",
        "line": 52
      },
      {
        "name": "available_adapters",
        "file": "mempalace/mempalace/sources/registry.py",
        "line": 96
      }
    ],
    "impact": []
  },
  {
    "id": "g2",
    "symbol": "test_collection_name_from_config",
    "file": "mempalace/tests/test_config_extra.py",
    "line": 74,
    "callers": [],
    "callees": [
      {
        "name": "dumps",
        "file": "",
        "line": 10
      },
      {
        "name": "MempalaceConfig",
        "file": "mempalace/mempalace/config.py",
        "line": 139
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "collection_name",
        "file": "mempalace/mempalace/config.py",
        "line": 175
      }
    ],
    "impact": []
  },
  {
    "id": "g3",
    "symbol": "test_layer3_no_palace",
    "file": "mempalace/tests/test_layers.py",
    "line": 359,
    "callers": [],
    "callees": [
      {
        "name": "Layer3",
        "file": "mempalace/mempalace/layers.py",
        "line": 243
      },
      {
        "name": "search",
        "file": "mempalace/mempalace/layers.py",
        "line": 253
      }
    ],
    "impact": []
  },
  {
    "id": "g4",
    "symbol": "test_claude_code_jsonl_tool_only_user_message_not_counted",
    "file": "mempalace/tests/test_normalize.py",
    "line": 1013,
    "callers": [],
    "callees": [
      {
        "name": "dumps",
        "file": "",
        "line": 10
      },
      {
        "name": "_try_claude_code_jsonl",
        "file": "mempalace/mempalace/normalize.py",
        "line": 173
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "split",
        "file": "",
        "line": 587
      },
      {
        "name": "split",
        "file": "",
        "line": 589
      },
      {
        "name": "startswith",
        "file": "",
        "line": 594
      },
      {
        "name": "strip",
        "file": "",
        "line": 598
      },
      {
        "name": "strip",
        "file": "",
        "line": 600
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": []
  },
  {
    "id": "g5",
    "symbol": "test_get_user_approval_accept_all",
    "file": "mempalace/tests/test_room_detector_local.py",
    "line": 260,
    "callers": [],
    "callees": [
      {
        "name": "get_user_approval",
        "file": "mempalace/mempalace/room_detector_local.py",
        "line": 245
      }
    ],
    "impact": []
  },
  {
    "id": "g6",
    "symbol": "test_validate_transcript_empty_string",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 574,
    "callers": [],
    "callees": [
      {
        "name": "_validate_transcript_path",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 46
      }
    ],
    "impact": []
  },
  {
    "id": "g7",
    "symbol": "dedup_palace",
    "file": "mempalace/mempalace/dedup.py",
    "line": 150,
    "callers": [
      {
        "name": "(module) dedup.py",
        "file": "mempalace/mempalace/dedup.py",
        "line": 1
      },
      {
        "name": "test_dedup_palace_dry_run",
        "file": "mempalace/tests/test_dedup.py",
        "line": 236
      },
      {
        "name": "test_dedup_palace_with_wing",
        "file": "mempalace/tests/test_dedup.py",
        "line": 251
      },
      {
        "name": "test_dedup_palace_no_groups",
        "file": "mempalace/tests/test_dedup.py",
        "line": 264
      }
    ],
    "callees": [
      {
        "name": "_get_palace_path",
        "file": "mempalace/mempalace/dedup.py",
        "line": 41
      },
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      },
      {
        "name": "get_collection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 501
      },
      {
        "name": "ChromaBackend",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 378
      },
      {
        "name": "count",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 369
      },
      {
        "name": "get_source_groups",
        "file": "mempalace/mempalace/dedup.py",
        "line": 51
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "time",
        "file": "",
        "line": 85
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1911
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1915
      },
      {
        "name": "items",
        "file": "",
        "line": 1210
      },
      {
        "name": "enumerate",
        "file": "",
        "line": 1321
      },
      {
        "name": "dedup_source_group",
        "file": "mempalace/mempalace/dedup.py",
        "line": 79
      }
    ],
    "impact": [
      {
        "name": "test_dedup_palace_dry_run",
        "file": "mempalace/tests/test_dedup.py",
        "line": 236
      },
      {
        "name": "(module) dedup.py",
        "file": "mempalace/mempalace/dedup.py",
        "line": 1
      },
      {
        "name": "test_dedup_palace_with_wing",
        "file": "mempalace/tests/test_dedup.py",
        "line": 251
      },
      {
        "name": "test_dedup_palace_no_groups",
        "file": "mempalace/tests/test_dedup.py",
        "line": 264
      }
    ]
  },
  {
    "id": "g8",
    "symbol": "_check_entity_confusion",
    "file": "mempalace/mempalace/fact_checker.py",
    "line": 93,
    "callers": [
      {
        "name": "check_text",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 52
      },
      {
        "name": "test_flags_near_name_when_only_one_mentioned",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 71
      },
      {
        "name": "test_no_false_positive_when_both_names_mentioned",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 81
      },
      {
        "name": "test_no_issues_when_registry_empty",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 88
      },
      {
        "name": "test_no_issues_when_no_mentioned_names",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 92
      },
      {
        "name": "test_registry_dict_shape_is_supported",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 96
      },
      {
        "name": "test_performance_bounded_by_mentioned_names",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 115
      }
    ],
    "callees": [
      {
        "name": "_flatten_names",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 81
      },
      {
        "name": "search",
        "file": "",
        "line": 257
      },
      {
        "name": "search",
        "file": "",
        "line": 259
      },
      {
        "name": "escape",
        "file": "",
        "line": 306
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "set",
        "file": "",
        "line": 1252
      },
      {
        "name": "tuple",
        "file": "",
        "line": 1043
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1911
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1915
      },
      {
        "name": "add",
        "file": "",
        "line": 1257
      },
      {
        "name": "_edit_distance",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 285
      }
    ],
    "impact": [
      {
        "name": "test_current_fact_same_triple_is_not_flagged",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 223
      },
      {
        "name": "test_no_issues_when_no_mentioned_names",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 92
      },
      {
        "name": "test_performance_bounded_by_mentioned_names",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 115
      },
      {
        "name": "test_registry_dict_shape_is_supported",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 96
      },
      {
        "name": "test_registry_confusion_path_isolated_from_kg",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 243
      },
      {
        "name": "test_no_false_positive_when_both_names_mentioned",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 81
      },
      {
        "name": "test_no_issues_when_registry_empty",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 88
      },
      {
        "name": "test_no_false_positive_when_kg_has_no_facts_about_subject",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 200
      },
      {
        "name": "test_flags_near_name_when_only_one_mentioned",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 71
      },
      {
        "name": "(module) fact_checker.py",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 1
      },
      {
        "name": "test_stale_fact_detected",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 205
      },
      {
        "name": "test_relationship_mismatch_detected",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 183
      },
      {
        "name": "test_empty_text_returns_empty_list",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 240
      },
      {
        "name": "check_text",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 52
      },
      {
        "name": "test_missing_palace_does_not_crash",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 229
      }
    ]
  },
  {
    "id": "g9",
    "symbol": "test_dedup_source_group_query_failure_keeps",
    "file": "mempalace/tests/test_dedup.py",
    "line": 183,
    "callers": [],
    "callees": [
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "Exception",
        "file": "",
        "line": 2086
      },
      {
        "name": "dedup_source_group",
        "file": "mempalace/mempalace/dedup.py",
        "line": 79
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": []
  },
  {
    "id": "g10",
    "symbol": "test_get_source_groups_below_min",
    "file": "mempalace/tests/test_dedup.py",
    "line": 33,
    "callers": [],
    "callees": [
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "get_source_groups",
        "file": "mempalace/mempalace/dedup.py",
        "line": 51
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": []
  },
  {
    "id": "g11",
    "symbol": "test_detect_rooms_from_folders_skips_oserror_at_top_level",
    "file": "mempalace/tests/test_room_detector_local.py",
    "line": 62,
    "callers": [],
    "callees": [
      {
        "name": "OSError",
        "file": "",
        "line": 2093
      },
      {
        "name": "object",
        "file": "",
        "line": 385
      },
      {
        "name": "object",
        "file": "",
        "line": 399
      },
      {
        "name": "object",
        "file": "",
        "line": 416
      },
      {
        "name": "detect_rooms_from_folders",
        "file": "mempalace/mempalace/room_detector_local.py",
        "line": 100
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g12",
    "symbol": "mine_convos",
    "file": "mempalace/mempalace/convo_miner.py",
    "line": 366,
    "callers": [
      {
        "name": "cmd_mine",
        "file": "mempalace/mempalace/cli.py",
        "line": 116
      },
      {
        "name": "(module) convo_miner.py",
        "file": "mempalace/mempalace/convo_miner.py",
        "line": 1
      },
      {
        "name": "test_convo_mining",
        "file": "mempalace/tests/test_convo_miner.py",
        "line": 12
      },
      {
        "name": "test_mine_convos_does_not_reprocess_short_files",
        "file": "mempalace/tests/test_convo_miner.py",
        "line": 33
      },
      {
        "name": "test_mine_convos_does_not_reprocess_empty_chunk_files",
        "file": "mempalace/tests/test_convo_miner.py",
        "line": 61
      },
      {
        "name": "test_mine_convos_rebuilds_stale_drawers_after_schema_bump",
        "file": "mempalace/tests/test_convo_miner.py",
        "line": 80
      },
      {
        "name": "test_convo_miner_drawers_have_hall",
        "file": "mempalace/tests/test_hall_detection.py",
        "line": 101
      }
    ],
    "callees": [
      {
        "name": "resolve",
        "file": "",
        "line": 325
      },
      {
        "name": "expanduser",
        "file": "",
        "line": 336
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      },
      {
        "name": "replace",
        "file": "",
        "line": 547
      },
      {
        "name": "replace",
        "file": "",
        "line": 551
      },
      {
        "name": "lower",
        "file": "",
        "line": 534
      },
      {
        "name": "lower",
        "file": "",
        "line": 536
      },
      {
        "name": "name",
        "file": "",
        "line": 70
      },
      {
        "name": "scan_convos",
        "file": "mempalace/mempalace/convo_miner.py",
        "line": 281
      },
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "get_collection",
        "file": "mempalace/mempalace/palace.py",
        "line": 53
      },
      {
        "name": "defaultdict",
        "file": "",
        "line": 401
      },
      {
        "name": "enumerate",
        "file": "",
        "line": 1321
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "file_already_mined",
        "file": "mempalace/mempalace/palace.py",
        "line": 313
      },
      {
        "name": "normalize",
        "file": "mempalace/mempalace/normalize.py",
        "line": 112
      },
      {
        "name": "_register_file",
        "file": "mempalace/mempalace/convo_miner.py",
        "line": 68
      },
      {
        "name": "strip",
        "file": "",
        "line": 598
      },
      {
        "name": "strip",
        "file": "",
        "line": 600
      },
      {
        "name": "extract_memories",
        "file": "mempalace/mempalace/general_extractor.py",
        "line": 363
      },
      {
        "name": "chunk_exchanges",
        "file": "mempalace/mempalace/convo_miner.py",
        "line": 98
      },
      {
        "name": "detect_convo_room",
        "file": "mempalace/mempalace/convo_miner.py",
        "line": 258
      },
      {
        "name": "Counter",
        "file": "",
        "line": 274
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "most_common",
        "file": "",
        "line": 285
      },
      {
        "name": "_file_chunks_locked",
        "file": "mempalace/mempalace/convo_miner.py",
        "line": 309
      },
      {
        "name": "items",
        "file": "",
        "line": 1210
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1911
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1915
      }
    ],
    "impact": [
      {
        "name": "test_mine_convos_rebuilds_stale_drawers_after_schema_bump",
        "file": "mempalace/tests/test_convo_miner.py",
        "line": 80
      },
      {
        "name": "test_mine_convos_does_not_reprocess_short_files",
        "file": "mempalace/tests/test_convo_miner.py",
        "line": 33
      },
      {
        "name": "test_cmd_mine_projects_mode",
        "file": "mempalace/tests/test_cli.py",
        "line": 153
      },
      {
        "name": "test_cmd_mine_convos_mode",
        "file": "mempalace/tests/test_cli.py",
        "line": 182
      },
      {
        "name": "test_convo_miner_drawers_have_hall",
        "file": "mempalace/tests/test_hall_detection.py",
        "line": 101
      },
      {
        "name": "(module) convo_miner.py",
        "file": "mempalace/mempalace/convo_miner.py",
        "line": 1
      },
      {
        "name": "test_cmd_mine_include_ignored_comma_split",
        "file": "mempalace/tests/test_cli.py",
        "line": 210
      },
      {
        "name": "test_mine_convos_does_not_reprocess_empty_chunk_files",
        "file": "mempalace/tests/test_convo_miner.py",
        "line": 61
      },
      {
        "name": "cmd_mine",
        "file": "mempalace/mempalace/cli.py",
        "line": 116
      },
      {
        "name": "test_convo_mining",
        "file": "mempalace/tests/test_convo_miner.py",
        "line": 12
      }
    ]
  },
  {
    "id": "g13",
    "symbol": "test_creates_gitignore_with_both_entries",
    "file": "mempalace/tests/test_init_gitignore_protection.py",
    "line": 24,
    "callers": [],
    "callees": [
      {
        "name": "_git_init",
        "file": "mempalace/tests/test_init_gitignore_protection.py",
        "line": 14
      },
      {
        "name": "_ensure_mempalace_files_gitignored",
        "file": "mempalace/mempalace/cli.py",
        "line": 43
      }
    ],
    "impact": []
  },
  {
    "id": "g14",
    "symbol": "test_claude_ai_not_a_list",
    "file": "mempalace/tests/test_normalize.py",
    "line": 491,
    "callers": [],
    "callees": [
      {
        "name": "_try_claude_ai_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 283
      }
    ],
    "impact": []
  },
  {
    "id": "g15",
    "symbol": "normalize_include_paths",
    "file": "mempalace/mempalace/miner.py",
    "line": 219,
    "callers": [
      {
        "name": "scan_project",
        "file": "mempalace/mempalace/miner.py",
        "line": 684
      },
      {
        "name": "mine",
        "file": "mempalace/mempalace/miner.py",
        "line": 753
      }
    ],
    "callees": [
      {
        "name": "set",
        "file": "",
        "line": 1252
      },
      {
        "name": "strip",
        "file": "",
        "line": 598
      },
      {
        "name": "strip",
        "file": "",
        "line": 600
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "add",
        "file": "",
        "line": 1257
      },
      {
        "name": "as_posix",
        "file": "",
        "line": 92
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      }
    ],
    "impact": [
      {
        "name": "test_mine_files_per_second",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 40
      },
      {
        "name": "test_scan_project_picks_up_jsonl_file",
        "file": "mempalace/tests/test_miner_jsonl_visibility.py",
        "line": 52
      },
      {
        "name": "scan_project",
        "file": "mempalace/mempalace/miner.py",
        "line": 684
      },
      {
        "name": "_setup_palace",
        "file": "mempalace/tests/test_exporter.py",
        "line": 17
      },
      {
        "name": "test_remine_replaces_closets_completely",
        "file": "mempalace/tests/test_closets.py",
        "line": 284
      },
      {
        "name": "test_mine_dry_run_with_tiny_file_no_crash",
        "file": "mempalace/tests/test_miner.py",
        "line": 310
      },
      {
        "name": "test_mine_peak_rss",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 66
      },
      {
        "name": "detect_rooms_local",
        "file": "mempalace/mempalace/room_detector_local.py",
        "line": 304
      },
      {
        "name": "test_scan_project_picks_up_50mb_jsonl",
        "file": "mempalace/tests/test_miner_jsonl_visibility.py",
        "line": 91
      },
      {
        "name": "scanned_files",
        "file": "mempalace/tests/test_miner.py",
        "line": 18
      },
      {
        "name": "mine",
        "file": "mempalace/mempalace/miner.py",
        "line": 753
      },
      {
        "name": "cmd_mine",
        "file": "mempalace/mempalace/cli.py",
        "line": 116
      },
      {
        "name": "test_mined_drawers_have_hall",
        "file": "mempalace/tests/test_hall_detection.py",
        "line": 152
      },
      {
        "name": "test_skip_check_cost",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 138
      },
      {
        "name": "test_project_mining",
        "file": "mempalace/tests/test_miner.py",
        "line": 23
      }
    ]
  },
  {
    "id": "g16",
    "symbol": "test_stop_hook_oserror_on_write",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 395,
    "callers": [],
    "callees": [
      {
        "name": "_write_transcript",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 48
      },
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "OSError",
        "file": "",
        "line": 2093
      },
      {
        "name": "object",
        "file": "",
        "line": 385
      },
      {
        "name": "object",
        "file": "",
        "line": 399
      },
      {
        "name": "object",
        "file": "",
        "line": 416
      },
      {
        "name": "_capture_hook_output",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 115
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g17",
    "symbol": "_get_mine_dir",
    "file": "mempalace/mempalace/hooks_cli.py",
    "line": 141,
    "callers": [
      {
        "name": "_maybe_auto_ingest",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 207
      },
      {
        "name": "_mine_sync",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 221
      },
      {
        "name": "test_get_mine_dir_mempal_dir",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 332
      },
      {
        "name": "test_get_mine_dir_transcript_fallback",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 342
      },
      {
        "name": "test_get_mine_dir_empty",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 350
      }
    ],
    "callees": [
      {
        "name": "get",
        "file": "",
        "line": 717
      },
      {
        "name": "get",
        "file": "",
        "line": 719
      },
      {
        "name": "get",
        "file": "",
        "line": 721
      },
      {
        "name": "isdir",
        "file": "",
        "line": 43
      },
      {
        "name": "expanduser",
        "file": "",
        "line": 336
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      },
      {
        "name": "is_file",
        "file": "",
        "line": 177
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "parent",
        "file": "",
        "line": 138
      }
    ],
    "impact": [
      {
        "name": "hook_precompact",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 315
      },
      {
        "name": "test_get_mine_dir_transcript_fallback",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 342
      },
      {
        "name": "hook_stop",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 255
      },
      {
        "name": "test_maybe_auto_ingest_oserror",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 273
      },
      {
        "name": "test_maybe_auto_ingest_skips_when_mine_running",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 284
      },
      {
        "name": "test_maybe_auto_ingest_with_transcript",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 261
      },
      {
        "name": "test_maybe_auto_ingest_with_env",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 249
      },
      {
        "name": "_maybe_auto_ingest",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 207
      },
      {
        "name": "_mine_sync",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 221
      },
      {
        "name": "test_get_mine_dir_empty",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 350
      },
      {
        "name": "test_maybe_auto_ingest_no_env",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 242
      },
      {
        "name": "test_get_mine_dir_mempal_dir",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 332
      }
    ]
  },
  {
    "id": "g18",
    "symbol": "test_format_tool_use_read_with_range",
    "file": "mempalace/tests/test_normalize.py",
    "line": 141,
    "callers": [],
    "callees": [
      {
        "name": "_format_tool_use",
        "file": "mempalace/mempalace/normalize.py",
        "line": 449
      }
    ],
    "impact": []
  },
  {
    "id": "g19",
    "symbol": "prune_corrupt",
    "file": "mempalace/mempalace/repair.py",
    "line": 158,
    "callers": [
      {
        "name": "(module) repair.py",
        "file": "mempalace/mempalace/repair.py",
        "line": 1
      },
      {
        "name": "test_prune_corrupt_no_file",
        "file": "mempalace/tests/test_repair.py",
        "line": 151
      },
      {
        "name": "test_prune_corrupt_dry_run",
        "file": "mempalace/tests/test_repair.py",
        "line": 157
      },
      {
        "name": "test_prune_corrupt_confirmed",
        "file": "mempalace/tests/test_repair.py",
        "line": 166
      },
      {
        "name": "test_prune_corrupt_delete_failure_fallback",
        "file": "mempalace/tests/test_repair.py",
        "line": 179
      }
    ],
    "callees": [
      {
        "name": "_get_palace_path",
        "file": "mempalace/mempalace/repair.py",
        "line": 41
      },
      {
        "name": "join",
        "file": "",
        "line": 127
      },
      {
        "name": "exists",
        "file": "",
        "line": 40
      },
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      },
      {
        "name": "open",
        "file": "",
        "line": 1716
      },
      {
        "name": "open",
        "file": "",
        "line": 1729
      },
      {
        "name": "open",
        "file": "",
        "line": 1742
      },
      {
        "name": "open",
        "file": "",
        "line": 1753
      },
      {
        "name": "open",
        "file": "",
        "line": 1764
      },
      {
        "name": "open",
        "file": "",
        "line": 1777
      },
      {
        "name": "open",
        "file": "",
        "line": 1790
      },
      {
        "name": "strip",
        "file": "",
        "line": 598
      },
      {
        "name": "strip",
        "file": "",
        "line": 600
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "get_collection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 501
      },
      {
        "name": "ChromaBackend",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 378
      },
      {
        "name": "count",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 369
      },
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "delete",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 360
      }
    ],
    "impact": [
      {
        "name": "test_prune_corrupt_delete_failure_fallback",
        "file": "mempalace/tests/test_repair.py",
        "line": 179
      },
      {
        "name": "test_prune_corrupt_no_file",
        "file": "mempalace/tests/test_repair.py",
        "line": 151
      },
      {
        "name": "(module) repair.py",
        "file": "mempalace/mempalace/repair.py",
        "line": 1
      },
      {
        "name": "test_prune_corrupt_confirmed",
        "file": "mempalace/tests/test_repair.py",
        "line": 166
      },
      {
        "name": "test_prune_corrupt_dry_run",
        "file": "mempalace/tests/test_repair.py",
        "line": 157
      }
    ]
  },
  {
    "id": "g20",
    "symbol": "_quoted_phrases",
    "file": "mempalace/benchmarks/locomo_bench.py",
    "line": 342,
    "callers": [
      {
        "name": "run_benchmark",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 621
      }
    ],
    "callees": [
      {
        "name": "extend",
        "file": "",
        "line": 1127
      },
      {
        "name": "findall",
        "file": "",
        "line": 275
      },
      {
        "name": "findall",
        "file": "",
        "line": 277
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": [
      {
        "name": "run_benchmark",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 621
      },
      {
        "name": "(module) locomo_bench.py",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 1
      }
    ]
  },
  {
    "id": "g21",
    "symbol": "_build_drawer_id",
    "file": "mempalace/mempalace/sources/context.py",
    "line": 128,
    "callers": [
      {
        "name": "test_palace_context_drawer_id_is_sha256_prefix_not_sha1",
        "file": "mempalace/tests/test_sources.py",
        "line": 283
      },
      {
        "name": "upsert_drawer",
        "file": "mempalace/mempalace/sources/context.py",
        "line": 91
      }
    ],
    "callees": [
      {
        "name": "hexdigest",
        "file": "",
        "line": 35
      },
      {
        "name": "sha256",
        "file": "",
        "line": 78
      },
      {
        "name": "encode",
        "file": "",
        "line": 498
      }
    ],
    "impact": [
      {
        "name": "upsert_drawer",
        "file": "mempalace/mempalace/sources/context.py",
        "line": 91
      },
      {
        "name": "test_palace_context_drawer_id_is_sha256_prefix_not_sha1",
        "file": "mempalace/tests/test_sources.py",
        "line": 283
      },
      {
        "name": "test_palace_context_upsert_drawer_stamps_adapter_metadata",
        "file": "mempalace/tests/test_sources.py",
        "line": 253
      }
    ]
  },
  {
    "id": "g22",
    "symbol": "test_restore_stdout_returns_real_stdout",
    "file": "mempalace/tests/test_mcp_stdio_protection.py",
    "line": 44,
    "callers": [],
    "callees": [
      {
        "name": "dedent",
        "file": "",
        "line": 102
      },
      {
        "name": "run",
        "file": "",
        "line": 92
      },
      {
        "name": "run",
        "file": "",
        "line": 126
      },
      {
        "name": "run",
        "file": "",
        "line": 160
      },
      {
        "name": "run",
        "file": "",
        "line": 194
      },
      {
        "name": "run",
        "file": "",
        "line": 229
      },
      {
        "name": "run",
        "file": "",
        "line": 263
      }
    ],
    "impact": []
  },
  {
    "id": "g23",
    "symbol": "test_package_version_matches_pyproject",
    "file": "mempalace/tests/test_version_consistency.py",
    "line": 16,
    "callers": [],
    "callees": [
      {
        "name": "_expected_version",
        "file": "mempalace/tests/test_version_consistency.py",
        "line": 8
      }
    ],
    "impact": []
  },
  {
    "id": "g24",
    "symbol": "get_backend",
    "file": "mempalace/mempalace/backends/registry.py",
    "line": 109,
    "callers": [
      {
        "name": "test_registry_exposes_chroma_by_default",
        "file": "mempalace/tests/test_backends.py",
        "line": 143
      },
      {
        "name": "test_registry_unknown_backend_raises",
        "file": "mempalace/tests/test_backends.py",
        "line": 149
      }
    ],
    "callees": [
      {
        "name": "_discover_entry_points",
        "file": "mempalace/mempalace/backends/registry.py",
        "line": 56
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      },
      {
        "name": "KeyError",
        "file": "",
        "line": 2186
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1911
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1915
      },
      {
        "name": "keys",
        "file": "",
        "line": 1208
      }
    ],
    "impact": [
      {
        "name": "test_registry_unknown_backend_raises",
        "file": "mempalace/tests/test_backends.py",
        "line": 149
      },
      {
        "name": "test_registry_exposes_chroma_by_default",
        "file": "mempalace/tests/test_backends.py",
        "line": 143
      }
    ]
  },
  {
    "id": "g25",
    "symbol": "test_run_instructions_missing_md_file",
    "file": "mempalace/tests/test_instructions_cli.py",
    "line": 37,
    "callers": [],
    "callees": [
      {
        "name": "run_instructions",
        "file": "mempalace/mempalace/instructions_cli.py",
        "line": 16
      }
    ],
    "impact": []
  },
  {
    "id": "g26",
    "symbol": "_load_tunnels",
    "file": "mempalace/mempalace/palace_graph.py",
    "line": 252,
    "callers": [
      {
        "name": "create_tunnel",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 315
      },
      {
        "name": "list_tunnels",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 388
      },
      {
        "name": "delete_tunnel",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 400
      },
      {
        "name": "follow_tunnels",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 409
      },
      {
        "name": "test_load_tunnels_missing_file_returns_empty_list",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 18
      },
      {
        "name": "test_load_tunnels_corrupt_file_returns_empty_list",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 22
      },
      {
        "name": "test_save_and_load_round_trip",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 27
      }
    ],
    "callees": [
      {
        "name": "exists",
        "file": "",
        "line": 40
      },
      {
        "name": "open",
        "file": "",
        "line": 1716
      },
      {
        "name": "open",
        "file": "",
        "line": 1729
      },
      {
        "name": "open",
        "file": "",
        "line": 1742
      },
      {
        "name": "open",
        "file": "",
        "line": 1753
      },
      {
        "name": "open",
        "file": "",
        "line": 1764
      },
      {
        "name": "open",
        "file": "",
        "line": 1777
      },
      {
        "name": "open",
        "file": "",
        "line": 1790
      },
      {
        "name": "load",
        "file": "",
        "line": 50
      },
      {
        "name": "isinstance",
        "file": "",
        "line": 1564
      }
    ],
    "impact": [
      {
        "name": "delete_tunnel",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 400
      },
      {
        "name": "test_create_tunnel",
        "file": "mempalace/tests/test_closets.py",
        "line": 698
      },
      {
        "name": "test_follow_tunnels_returns_connections_even_if_collection_lookup_fails",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 118
      },
      {
        "name": "create_tunnel",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 315
      },
      {
        "name": "test_delete_tunnel",
        "file": "mempalace/tests/test_closets.py",
        "line": 716
      },
      {
        "name": "test_created_at_is_timezone_aware",
        "file": "mempalace/tests/test_closets.py",
        "line": 832
      },
      {
        "name": "list_tunnels",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 388
      },
      {
        "name": "tool_follow_tunnels",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 591
      },
      {
        "name": "test_tunnel_is_symmetric",
        "file": "mempalace/tests/test_closets.py",
        "line": 741
      },
      {
        "name": "test_follow_tunnels_returns_connected_endpoints",
        "file": "mempalace/tests/test_closets.py",
        "line": 728
      },
      {
        "name": "test_follow_tunnels_returns_direction_and_preview",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 86
      },
      {
        "name": "test_atomic_write_leaves_no_stray_tmp_file",
        "file": "mempalace/tests/test_closets.py",
        "line": 797
      },
      {
        "name": "tool_delete_tunnel",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 584
      },
      {
        "name": "tool_create_tunnel",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 542
      },
      {
        "name": "tool_list_tunnels",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 575
      },
      {
        "name": "test_list_tunnels_with_and_without_filter",
        "file": "mempalace/tests/test_closets.py",
        "line": 707
      },
      {
        "name": "test_concurrent_creates_preserve_all_tunnels",
        "file": "mempalace/tests/test_closets.py",
        "line": 806
      },
      {
        "name": "test_follow_tunnels_works_from_either_endpoint",
        "file": "mempalace/tests/test_closets.py",
        "line": 751
      },
      {
        "name": "test_delete_tunnel_removes_saved_tunnel",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 76
      },
      {
        "name": "test_load_tunnels_missing_file_returns_empty_list",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 18
      },
      {
        "name": "follow_tunnels",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 409
      },
      {
        "name": "test_create_tunnel_rejects_empty_names",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 60
      },
      {
        "name": "worker",
        "file": "mempalace/tests/test_closets.py",
        "line": 813
      },
      {
        "name": "test_list_tunnels_filters_by_either_side",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 66
      },
      {
        "name": "test_save_and_load_round_trip",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 27
      },
      {
        "name": "test_create_tunnel_deduplicates_reverse_order_and_updates_label",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 42
      },
      {
        "name": "test_corrupt_tunnel_file_does_not_lose_new_writes",
        "file": "mempalace/tests/test_closets.py",
        "line": 779
      },
      {
        "name": "test_dedup_same_endpoints_updates_label",
        "file": "mempalace/tests/test_closets.py",
        "line": 721
      },
      {
        "name": "test_load_tunnels_corrupt_file_returns_empty_list",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 22
      },
      {
        "name": "test_empty_endpoint_fields_rejected",
        "file": "mempalace/tests/test_closets.py",
        "line": 764
      }
    ]
  },
  {
    "id": "g27",
    "symbol": "build_palace_and_retrieve_palace",
    "file": "mempalace/benchmarks/longmemeval_bench.py",
    "line": 2000,
    "callers": [
      {
        "name": "run_benchmark",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2936
      }
    ],
    "callees": [
      {
        "name": "findall",
        "file": "",
        "line": 275
      },
      {
        "name": "findall",
        "file": "",
        "line": 277
      },
      {
        "name": "sum",
        "file": "",
        "line": 1930
      },
      {
        "name": "sum",
        "file": "",
        "line": 1932
      },
      {
        "name": "sum",
        "file": "",
        "line": 1934
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "strptime",
        "file": "",
        "line": 331
      },
      {
        "name": "int",
        "file": "",
        "line": 255
      },
      {
        "name": "search",
        "file": "",
        "line": 257
      },
      {
        "name": "search",
        "file": "",
        "line": 259
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "set",
        "file": "",
        "line": 1252
      },
      {
        "name": "add",
        "file": "",
        "line": 1257
      },
      {
        "name": "parse_question_date",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2090
      },
      {
        "name": "zip",
        "file": "",
        "line": 1943
      },
      {
        "name": "classify_session_hall",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 1819
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "extract_preferences",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2138
      },
      {
        "name": "classify_question_hall",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 1918
      },
      {
        "name": "extract_keywords",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2079
      },
      {
        "name": "keyword_overlap",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2083
      },
      {
        "name": "abs",
        "file": "",
        "line": 1378
      },
      {
        "name": "days",
        "file": "",
        "line": 212
      },
      {
        "name": "parse_time_offset_days",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2096
      },
      {
        "name": "timedelta",
        "file": "",
        "line": 197
      },
      {
        "name": "enumerate",
        "file": "",
        "line": 1321
      },
      {
        "name": "list",
        "file": "",
        "line": 1120
      },
      {
        "name": "_fresh_collection",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 146
      },
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "min",
        "file": "",
        "line": 1693
      },
      {
        "name": "min",
        "file": "",
        "line": 1697
      },
      {
        "name": "min",
        "file": "",
        "line": 1699
      },
      {
        "name": "min",
        "file": "",
        "line": 1701
      },
      {
        "name": "min",
        "file": "",
        "line": 1703
      },
      {
        "name": "min",
        "file": "",
        "line": 1705
      },
      {
        "name": "hybrid_score",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2226
      },
      {
        "name": "apply_temporal",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2230
      },
      {
        "name": "sort",
        "file": "",
        "line": 1141
      },
      {
        "name": "sort",
        "file": "",
        "line": 1143
      }
    ],
    "impact": [
      {
        "name": "run_benchmark",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2936
      },
      {
        "name": "(module) longmemeval_bench.py",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 1
      }
    ]
  },
  {
    "id": "g28",
    "symbol": "tool_hook_settings",
    "file": "mempalace/mempalace/mcp_server.py",
    "line": 1041,
    "callers": [],
    "callees": [
      {
        "name": "MempalaceConfig",
        "file": "mempalace/mempalace/config.py",
        "line": 139
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "set_hook_setting",
        "file": "mempalace/mempalace/config.py",
        "line": 246
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "hook_silent_save",
        "file": "mempalace/mempalace/config.py",
        "line": 237
      },
      {
        "name": "hook_desktop_toast",
        "file": "mempalace/mempalace/config.py",
        "line": 242
      }
    ],
    "impact": []
  },
  {
    "id": "g29",
    "symbol": "test_slack_json_username_fallback",
    "file": "mempalace/tests/test_normalize.py",
    "line": 797,
    "callers": [],
    "callees": [
      {
        "name": "_try_slack_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 373
      }
    ],
    "impact": []
  },
  {
    "id": "g30",
    "symbol": "test_extract_content_list_of_strings",
    "file": "mempalace/tests/test_normalize.py",
    "line": 87,
    "callers": [],
    "callees": [
      {
        "name": "_extract_content",
        "file": "mempalace/mempalace/normalize.py",
        "line": 415
      }
    ],
    "impact": []
  },
  {
    "id": "g31",
    "symbol": "test_log_writes_to_hook_log",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 223,
    "callers": [],
    "callees": [
      {
        "name": "_log",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 111
      }
    ],
    "impact": []
  },
  {
    "id": "g32",
    "symbol": "test_extract_content_dict",
    "file": "mempalace/tests/test_normalize.py",
    "line": 96,
    "callers": [],
    "callees": [
      {
        "name": "_extract_content",
        "file": "mempalace/mempalace/normalize.py",
        "line": 415
      }
    ],
    "impact": []
  },
  {
    "id": "g33",
    "symbol": "test_slack_json_not_a_list",
    "file": "mempalace/tests/test_normalize.py",
    "line": 755,
    "callers": [],
    "callees": [
      {
        "name": "_try_slack_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 373
      }
    ],
    "impact": []
  },
  {
    "id": "g34",
    "symbol": "test_mcp_command_uses_custom_palace_path_when_provided",
    "file": "mempalace/tests/test_cli.py",
    "line": 344,
    "callers": [],
    "callees": [
      {
        "name": "main",
        "file": "mempalace/mempalace/cli.py",
        "line": 515
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "expanduser",
        "file": "",
        "line": 336
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      }
    ],
    "impact": []
  },
  {
    "id": "g35",
    "symbol": "test_generate_aaak_bootstrap_creates_files",
    "file": "mempalace/tests/test_onboarding.py",
    "line": 141,
    "callers": [],
    "callees": [
      {
        "name": "_generate_aaak_bootstrap",
        "file": "mempalace/mempalace/onboarding.py",
        "line": 266
      }
    ],
    "impact": []
  },
  {
    "id": "g36",
    "symbol": "test_layer1_batch_exception_breaks",
    "file": "mempalace/tests/test_layers.py",
    "line": 204,
    "callers": [],
    "callees": [
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "RuntimeError",
        "file": "",
        "line": 2145
      },
      {
        "name": "Layer1",
        "file": "mempalace/mempalace/layers.py",
        "line": 76
      },
      {
        "name": "generate",
        "file": "mempalace/mempalace/layers.py",
        "line": 92
      }
    ],
    "impact": []
  },
  {
    "id": "g37",
    "symbol": "test_entity_metadata_finds_cyrillic_names",
    "file": "mempalace/tests/test_miner.py",
    "line": 227,
    "callers": [],
    "callees": [
      {
        "name": "property",
        "file": "",
        "line": 1353
      },
      {
        "name": "_extract_entities_for_metadata",
        "file": "mempalace/mempalace/miner.py",
        "line": 501
      }
    ],
    "impact": []
  },
  {
    "id": "g38",
    "symbol": "test_is_true_session_start_no_ctrl_e",
    "file": "mempalace/tests/test_split_mega_files.py",
    "line": 102,
    "callers": [],
    "callees": [
      {
        "name": "is_true_session_start",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 83
      }
    ],
    "impact": []
  },
  {
    "id": "g39",
    "symbol": "_git_init",
    "file": "mempalace/tests/test_init_gitignore_protection.py",
    "line": 14,
    "callers": [
      {
        "name": "test_creates_gitignore_with_both_entries",
        "file": "mempalace/tests/test_init_gitignore_protection.py",
        "line": 24
      },
      {
        "name": "test_appends_only_missing_entries",
        "file": "mempalace/tests/test_init_gitignore_protection.py",
        "line": 33
      },
      {
        "name": "test_idempotent_when_both_already_present",
        "file": "mempalace/tests/test_init_gitignore_protection.py",
        "line": 46
      },
      {
        "name": "test_handles_gitignore_without_trailing_newline",
        "file": "mempalace/tests/test_init_gitignore_protection.py",
        "line": 54
      }
    ],
    "callees": [
      {
        "name": "mkdir",
        "file": "",
        "line": 214
      }
    ],
    "impact": [
      {
        "name": "test_idempotent_when_both_already_present",
        "file": "mempalace/tests/test_init_gitignore_protection.py",
        "line": 46
      },
      {
        "name": "test_creates_gitignore_with_both_entries",
        "file": "mempalace/tests/test_init_gitignore_protection.py",
        "line": 24
      },
      {
        "name": "test_handles_gitignore_without_trailing_newline",
        "file": "mempalace/tests/test_init_gitignore_protection.py",
        "line": 54
      },
      {
        "name": "test_appends_only_missing_entries",
        "file": "mempalace/tests/test_init_gitignore_protection.py",
        "line": 33
      }
    ]
  },
  {
    "id": "g40",
    "symbol": "test_messages_to_transcript_basic",
    "file": "mempalace/tests/test_normalize.py",
    "line": 871,
    "callers": [],
    "callees": [
      {
        "name": "_messages_to_transcript",
        "file": "mempalace/mempalace/normalize.py",
        "line": 559
      }
    ],
    "impact": []
  },
  {
    "id": "g41",
    "symbol": "test_detect_rooms_from_folders_custom_named_dirs",
    "file": "mempalace/tests/test_room_detector_local.py",
    "line": 177,
    "callers": [],
    "callees": [
      {
        "name": "detect_rooms_from_folders",
        "file": "mempalace/mempalace/room_detector_local.py",
        "line": 100
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g42",
    "symbol": "tool_kg_add",
    "file": "mempalace/mempalace/mcp_server.py",
    "line": 855,
    "callers": [
      {
        "name": "test_kg_add",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 623
      }
    ],
    "callees": [
      {
        "name": "sanitize_kg_value",
        "file": "mempalace/mempalace/config.py",
        "line": 50
      },
      {
        "name": "sanitize_name",
        "file": "mempalace/mempalace/config.py",
        "line": 22
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "_wal_log",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 139
      },
      {
        "name": "add_triple",
        "file": "mempalace/mempalace/knowledge_graph.py",
        "line": 149
      }
    ],
    "impact": [
      {
        "name": "test_kg_add",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 623
      }
    ]
  },
  {
    "id": "g43",
    "symbol": "test_count_handles_list_content",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 79,
    "callers": [],
    "callees": [
      {
        "name": "_write_transcript",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 48
      },
      {
        "name": "_count_human_messages",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 65
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g44",
    "symbol": "test_extract_content_mixed_list",
    "file": "mempalace/tests/test_normalize.py",
    "line": 104,
    "callers": [],
    "callees": [
      {
        "name": "_extract_content",
        "file": "mempalace/mempalace/normalize.py",
        "line": 415
      }
    ],
    "impact": []
  },
  {
    "id": "g45",
    "symbol": "test_scan_for_detection_max_files",
    "file": "mempalace/tests/test_entity_detector.py",
    "line": 378,
    "callers": [],
    "callees": [
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "scan_for_detection",
        "file": "mempalace/mempalace/entity_detector.py",
        "line": 549
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": []
  },
  {
    "id": "g46",
    "symbol": "_make_fake_collection",
    "file": "mempalace/tests/test_palace_graph.py",
    "line": 9,
    "callers": [
      {
        "name": "test_empty_collection",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 41
      },
      {
        "name": "test_single_wing_no_edges",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 53
      },
      {
        "name": "test_multi_wing_creates_edges",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 65
      },
      {
        "name": "test_general_room_excluded",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 89
      },
      {
        "name": "test_missing_wing_excluded",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 98
      },
      {
        "name": "test_dates_capped_at_five",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 107
      },
      {
        "name": "_build_col",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 122
      },
      {
        "name": "_build_tunnel_col",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 159
      },
      {
        "name": "test_empty_graph",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 195
      },
      {
        "name": "test_stats_with_data",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 202
      }
    ],
    "callees": [
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      }
    ],
    "impact": [
      {
        "name": "test_traverse_unknown_room",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 140
      },
      {
        "name": "test_find_tunnels_no_match",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 179
      },
      {
        "name": "test_empty_graph",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 195
      },
      {
        "name": "test_empty_collection",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 41
      },
      {
        "name": "test_traverse_known_room",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 131
      },
      {
        "name": "test_stats_with_data",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 202
      },
      {
        "name": "test_multi_wing_creates_edges",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 65
      },
      {
        "name": "test_find_all_tunnels",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 168
      },
      {
        "name": "test_find_tunnels_with_wing_filter",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 174
      },
      {
        "name": "test_missing_wing_excluded",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 98
      },
      {
        "name": "_build_col",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 122
      },
      {
        "name": "test_single_wing_no_edges",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 53
      },
      {
        "name": "test_dates_capped_at_five",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 107
      },
      {
        "name": "test_general_room_excluded",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 89
      },
      {
        "name": "test_traverse_max_hops",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 147
      },
      {
        "name": "_build_tunnel_col",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 159
      },
      {
        "name": "test_find_tunnels_both_wings",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 184
      }
    ]
  },
  {
    "id": "g47",
    "symbol": "build_graph",
    "file": "mempalace/mempalace/palace_graph.py",
    "line": 41,
    "callers": [
      {
        "name": "traverse",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 107
      },
      {
        "name": "find_tunnels",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 169
      },
      {
        "name": "graph_stats",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 201
      },
      {
        "name": "test_empty_collection",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 41
      },
      {
        "name": "test_falsy_collection",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 47
      },
      {
        "name": "test_single_wing_no_edges",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 53
      },
      {
        "name": "test_multi_wing_creates_edges",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 65
      },
      {
        "name": "test_general_room_excluded",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 89
      },
      {
        "name": "test_missing_wing_excluded",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 98
      },
      {
        "name": "test_dates_capped_at_five",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 107
      }
    ],
    "callees": [
      {
        "name": "_get_collection",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 29
      },
      {
        "name": "count",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 369
      },
      {
        "name": "defaultdict",
        "file": "",
        "line": 401
      },
      {
        "name": "set",
        "file": "",
        "line": 1252
      },
      {
        "name": "get",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 307
      },
      {
        "name": "add",
        "file": "",
        "line": 1257
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "items",
        "file": "",
        "line": 1210
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1911
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1915
      },
      {
        "name": "enumerate",
        "file": "",
        "line": 1321
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      }
    ],
    "impact": [
      {
        "name": "test_find_tunnels_no_match",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 179
      },
      {
        "name": "test_empty_graph",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 195
      },
      {
        "name": "test_traverse_known_room",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 131
      },
      {
        "name": "find_tunnels",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 169
      },
      {
        "name": "test_dates_capped_at_five",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 107
      },
      {
        "name": "test_traverse_max_hops",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 147
      },
      {
        "name": "test_find_tunnels_both_wings",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 184
      },
      {
        "name": "test_falsy_collection",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 47
      },
      {
        "name": "test_stats_with_data",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 202
      },
      {
        "name": "test_find_tunnels_with_wing_filter",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 174
      },
      {
        "name": "test_missing_wing_excluded",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 98
      },
      {
        "name": "tool_traverse_graph",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 512
      },
      {
        "name": "tool_find_tunnels",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 521
      },
      {
        "name": "tool_graph_stats",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 534
      },
      {
        "name": "graph_stats",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 201
      },
      {
        "name": "traverse",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 107
      },
      {
        "name": "test_traverse_unknown_room",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 140
      },
      {
        "name": "test_empty_collection",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 41
      },
      {
        "name": "test_multi_wing_creates_edges",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 65
      },
      {
        "name": "test_find_all_tunnels",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 168
      },
      {
        "name": "test_single_wing_no_edges",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 53
      },
      {
        "name": "test_general_room_excluded",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 89
      }
    ]
  },
  {
    "id": "g48",
    "symbol": "test_quick_setup_work_mode",
    "file": "mempalace/tests/test_onboarding.py",
    "line": 111,
    "callers": [],
    "callees": [
      {
        "name": "quick_setup",
        "file": "mempalace/mempalace/onboarding.py",
        "line": 458
      },
      {
        "name": "mode",
        "file": "mempalace/mempalace/entity_registry.py",
        "line": 343
      },
      {
        "name": "people",
        "file": "mempalace/mempalace/entity_registry.py",
        "line": 347
      },
      {
        "name": "projects",
        "file": "mempalace/mempalace/entity_registry.py",
        "line": 351
      }
    ],
    "impact": []
  },
  {
    "id": "g49",
    "symbol": "_load_known_entities_raw",
    "file": "mempalace/mempalace/miner.py",
    "line": 462,
    "callers": [
      {
        "name": "check_text",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 52
      }
    ],
    "callees": [
      {
        "name": "_refresh_known_entities_cache",
        "file": "mempalace/mempalace/miner.py",
        "line": 411
      },
      {
        "name": "dict",
        "file": "",
        "line": 1175
      }
    ],
    "impact": [
      {
        "name": "test_current_fact_same_triple_is_not_flagged",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 223
      },
      {
        "name": "test_registry_confusion_path_isolated_from_kg",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 243
      },
      {
        "name": "test_no_false_positive_when_kg_has_no_facts_about_subject",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 200
      },
      {
        "name": "(module) fact_checker.py",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 1
      },
      {
        "name": "test_stale_fact_detected",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 205
      },
      {
        "name": "test_relationship_mismatch_detected",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 183
      },
      {
        "name": "test_empty_text_returns_empty_list",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 240
      },
      {
        "name": "check_text",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 52
      },
      {
        "name": "test_missing_palace_does_not_crash",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 229
      }
    ]
  },
  {
    "id": "g50",
    "symbol": "test_chroma_collection_delegates_writes",
    "file": "mempalace/tests/test_backends.py",
    "line": 130,
    "callers": [],
    "callees": [
      {
        "name": "_FakeCollection",
        "file": "mempalace/tests/test_backends.py",
        "line": 23
      },
      {
        "name": "ChromaCollection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 180
      },
      {
        "name": "add",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 190
      },
      {
        "name": "upsert",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 198
      },
      {
        "name": "delete",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 360
      },
      {
        "name": "count",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 369
      }
    ],
    "impact": []
  },
  {
    "id": "g51",
    "symbol": "test_extract_people_detects_names_from_content",
    "file": "mempalace/tests/test_split_mega_files.py",
    "line": 48,
    "callers": [],
    "callees": [
      {
        "name": "extract_people",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 134
      }
    ],
    "impact": []
  },
  {
    "id": "g52",
    "symbol": "test_classify_entity_strong_person_needs_two_signal_types",
    "file": "mempalace/tests/test_entity_detector.py",
    "line": 126,
    "callers": [],
    "callees": [
      {
        "name": "classify_entity",
        "file": "mempalace/mempalace/entity_detector.py",
        "line": 294
      }
    ],
    "impact": []
  },
  {
    "id": "g53",
    "symbol": "test_claude_ai_privacy_export_non_dict_items",
    "file": "mempalace/tests/test_normalize.py",
    "line": 513,
    "callers": [],
    "callees": [
      {
        "name": "_try_claude_ai_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 283
      }
    ],
    "impact": []
  },
  {
    "id": "g54",
    "symbol": "_fresh_collection",
    "file": "mempalace/benchmarks/longmemeval_bench.py",
    "line": 146,
    "callers": [
      {
        "name": "build_palace_and_retrieve",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 163
      },
      {
        "name": "build_palace_and_retrieve_aaak",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 244
      },
      {
        "name": "build_palace_and_retrieve_rooms",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 399
      },
      {
        "name": "build_palace_and_retrieve_hybrid",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 485
      },
      {
        "name": "build_palace_and_retrieve_full",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 638
      },
      {
        "name": "build_palace_and_retrieve_hybrid_v2",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 709
      },
      {
        "name": "build_palace_and_retrieve_hybrid_v3",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 994
      },
      {
        "name": "build_palace_and_retrieve_hybrid_v4",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 1339
      },
      {
        "name": "build_palace_and_retrieve_palace",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2000
      },
      {
        "name": "build_palace_and_retrieve_diary",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2445
      }
    ],
    "callees": [],
    "impact": [
      {
        "name": "build_palace_and_retrieve_full",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 638
      },
      {
        "name": "build_palace_and_retrieve_hybrid_v2",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 709
      },
      {
        "name": "build_palace_and_retrieve_aaak",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 244
      },
      {
        "name": "build_palace_and_retrieve_palace",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2000
      },
      {
        "name": "build_palace_and_retrieve",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 163
      },
      {
        "name": "run_benchmark",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2936
      },
      {
        "name": "build_palace_and_retrieve_hybrid_v3",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 994
      },
      {
        "name": "build_palace_and_retrieve_hybrid",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 485
      },
      {
        "name": "build_palace_and_retrieve_rooms",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 399
      },
      {
        "name": "build_palace_and_retrieve_hybrid_v4",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 1339
      },
      {
        "name": "build_palace_and_retrieve_diary",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 2445
      }
    ]
  },
  {
    "id": "g55",
    "symbol": "test_split_into_segments_by_turns",
    "file": "mempalace/tests/test_general_extractor.py",
    "line": 207,
    "callers": [],
    "callees": [
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "_split_into_segments",
        "file": "mempalace/mempalace/general_extractor.py",
        "line": 424
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": []
  },
  {
    "id": "g56",
    "symbol": "_get_collection",
    "file": "mempalace/tests/test_mcp_server.py",
    "line": 24,
    "callers": [
      {
        "name": "test_null_arguments_does_not_hang",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 120
      },
      {
        "name": "test_tools_call_dispatches",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 191
      },
      {
        "name": "test_status_empty_palace",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 234
      },
      {
        "name": "test_add_drawer",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 430
      },
      {
        "name": "test_add_drawer_duplicate_detection",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 446
      },
      {
        "name": "test_add_drawer_shared_header_no_collision",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 460
      },
      {
        "name": "test_diary_write_and_read",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 673
      },
      {
        "name": "test_diary_read_empty",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 692
      },
      {
        "name": "test_diary_write_same_second_shared_prefix_no_collision",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 701
      },
      {
        "name": "test_mtime_change_invalidates_cache",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 750
      },
      {
        "name": "test_inode_change_invalidates_cache",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 771
      },
      {
        "name": "test_missing_db_invalidates_cache",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 793
      },
      {
        "name": "test_reconnect_reports_success",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 832
      }
    ],
    "callees": [],
    "impact": [
      {
        "name": "test_null_arguments_does_not_hang",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 120
      },
      {
        "name": "test_tools_call_dispatches",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 191
      },
      {
        "name": "test_diary_write_and_read",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 673
      },
      {
        "name": "test_missing_db_invalidates_cache",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 793
      },
      {
        "name": "test_diary_read_empty",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 692
      },
      {
        "name": "test_status_empty_palace",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 234
      },
      {
        "name": "test_add_drawer",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 430
      },
      {
        "name": "test_add_drawer_shared_header_no_collision",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 460
      },
      {
        "name": "test_reconnect_reports_success",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 832
      },
      {
        "name": "test_add_drawer_duplicate_detection",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 446
      },
      {
        "name": "test_diary_write_same_second_shared_prefix_no_collision",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 701
      },
      {
        "name": "test_inode_change_invalidates_cache",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 771
      },
      {
        "name": "test_mtime_change_invalidates_cache",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 750
      }
    ]
  },
  {
    "id": "g57",
    "symbol": "test_main_instructions_no_subcommand_prints_help",
    "file": "mempalace/tests/test_cli.py",
    "line": 378,
    "callers": [],
    "callees": [
      {
        "name": "main",
        "file": "mempalace/mempalace/cli.py",
        "line": 515
      }
    ],
    "impact": []
  },
  {
    "id": "g58",
    "symbol": "cmd_mcp",
    "file": "mempalace/mempalace/cli.py",
    "line": 368,
    "callers": [],
    "callees": [
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "expanduser",
        "file": "",
        "line": 336
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      },
      {
        "name": "quote",
        "file": "",
        "line": 27
      },
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      }
    ],
    "impact": []
  },
  {
    "id": "g59",
    "symbol": "_try_slack_json",
    "file": "mempalace/mempalace/normalize.py",
    "line": 373,
    "callers": [
      {
        "name": "test_slack_json_valid",
        "file": "mempalace/tests/test_normalize.py",
        "line": 745
      },
      {
        "name": "test_slack_json_not_a_list",
        "file": "mempalace/tests/test_normalize.py",
        "line": 755
      },
      {
        "name": "test_slack_json_too_few_messages",
        "file": "mempalace/tests/test_normalize.py",
        "line": 760
      },
      {
        "name": "test_slack_json_skips_non_message_types",
        "file": "mempalace/tests/test_normalize.py",
        "line": 766
      },
      {
        "name": "test_slack_json_three_users",
        "file": "mempalace/tests/test_normalize.py",
        "line": 776
      },
      {
        "name": "test_slack_json_empty_text_skipped",
        "file": "mempalace/tests/test_normalize.py",
        "line": 787
      },
      {
        "name": "test_slack_json_username_fallback",
        "file": "mempalace/tests/test_normalize.py",
        "line": 797
      },
      {
        "name": "test_slack_json_has_provenance_footer",
        "file": "mempalace/tests/test_normalize.py",
        "line": 806
      },
      {
        "name": "test_slack_json_preserves_speaker_id",
        "file": "mempalace/tests/test_normalize.py",
        "line": 819
      },
      {
        "name": "test_slack_json_attacker_first_message_attributed",
        "file": "mempalace/tests/test_normalize.py",
        "line": 830
      },
      {
        "name": "test_slack_json_sanitizes_speaker_id",
        "file": "mempalace/tests/test_normalize.py",
        "line": 842
      }
    ],
    "callees": [
      {
        "name": "isinstance",
        "file": "",
        "line": 1564
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      },
      {
        "name": "strip",
        "file": "",
        "line": 598
      },
      {
        "name": "strip",
        "file": "",
        "line": 600
      },
      {
        "name": "sub",
        "file": "",
        "line": 283
      },
      {
        "name": "sub",
        "file": "",
        "line": 287
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "_messages_to_transcript",
        "file": "mempalace/mempalace/normalize.py",
        "line": 559
      }
    ],
    "impact": [
      {
        "name": "test_slack_json_empty_text_skipped",
        "file": "mempalace/tests/test_normalize.py",
        "line": 787
      },
      {
        "name": "test_slack_json_attacker_first_message_attributed",
        "file": "mempalace/tests/test_normalize.py",
        "line": 830
      },
      {
        "name": "test_slack_json_username_fallback",
        "file": "mempalace/tests/test_normalize.py",
        "line": 797
      },
      {
        "name": "test_slack_json_valid",
        "file": "mempalace/tests/test_normalize.py",
        "line": 745
      },
      {
        "name": "test_slack_json_has_provenance_footer",
        "file": "mempalace/tests/test_normalize.py",
        "line": 806
      },
      {
        "name": "test_slack_json_preserves_speaker_id",
        "file": "mempalace/tests/test_normalize.py",
        "line": 819
      },
      {
        "name": "test_slack_json_skips_non_message_types",
        "file": "mempalace/tests/test_normalize.py",
        "line": 766
      },
      {
        "name": "test_slack_json_three_users",
        "file": "mempalace/tests/test_normalize.py",
        "line": 776
      },
      {
        "name": "test_slack_json_not_a_list",
        "file": "mempalace/tests/test_normalize.py",
        "line": 755
      },
      {
        "name": "test_slack_json_too_few_messages",
        "file": "mempalace/tests/test_normalize.py",
        "line": 760
      },
      {
        "name": "test_slack_json_sanitizes_speaker_id",
        "file": "mempalace/tests/test_normalize.py",
        "line": 842
      }
    ]
  },
  {
    "id": "g60",
    "symbol": "_fix_blob_seq_ids",
    "file": "mempalace/mempalace/backends/chroma.py",
    "line": 134,
    "callers": [
      {
        "name": "_client",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 423
      },
      {
        "name": "make_client",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 482
      },
      {
        "name": "test_fix_blob_seq_ids_converts_blobs_to_integers",
        "file": "mempalace/tests/test_backends.py",
        "line": 337
      },
      {
        "name": "test_fix_blob_seq_ids_noop_without_blobs",
        "file": "mempalace/tests/test_backends.py",
        "line": 361
      },
      {
        "name": "test_fix_blob_seq_ids_noop_without_database",
        "file": "mempalace/tests/test_backends.py",
        "line": 378
      }
    ],
    "callees": [
      {
        "name": "join",
        "file": "",
        "line": 127
      },
      {
        "name": "isfile",
        "file": "",
        "line": 42
      },
      {
        "name": "connect",
        "file": "",
        "line": 250
      },
      {
        "name": "fetchall",
        "file": "",
        "line": 428
      },
      {
        "name": "execute",
        "file": "",
        "line": 363
      },
      {
        "name": "from_bytes",
        "file": "",
        "line": 279
      },
      {
        "name": "executemany",
        "file": "",
        "line": 364
      },
      {
        "name": "info",
        "file": "",
        "line": 140
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "commit",
        "file": "",
        "line": 336
      },
      {
        "name": "exception",
        "file": "",
        "line": 177
      }
    ],
    "impact": [
      {
        "name": "test_chroma_cache_picks_up_db_created_after_first_open",
        "file": "mempalace/tests/test_backends.py",
        "line": 243
      },
      {
        "name": "get_collection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 501
      },
      {
        "name": "_get_client",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 162
      },
      {
        "name": "create_collection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 578
      },
      {
        "name": "test_fix_blob_seq_ids_noop_without_database",
        "file": "mempalace/tests/test_backends.py",
        "line": 378
      },
      {
        "name": "test_chroma_cache_invalidates_when_db_file_missing",
        "file": "mempalace/tests/test_backends.py",
        "line": 207
      },
      {
        "name": "_client",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 423
      },
      {
        "name": "test_fix_blob_seq_ids_converts_blobs_to_integers",
        "file": "mempalace/tests/test_backends.py",
        "line": 337
      },
      {
        "name": "test_fix_blob_seq_ids_noop_without_blobs",
        "file": "mempalace/tests/test_backends.py",
        "line": 361
      },
      {
        "name": "delete_collection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 574
      },
      {
        "name": "make_client",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 482
      }
    ]
  },
  {
    "id": "g61",
    "symbol": "detect_rooms_from_folders",
    "file": "mempalace/mempalace/room_detector_local.py",
    "line": 100,
    "callers": [
      {
        "name": "detect_rooms_local",
        "file": "mempalace/mempalace/room_detector_local.py",
        "line": 304
      },
      {
        "name": "test_detect_rooms_from_folders_standard_layout",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 38
      },
      {
        "name": "test_detect_rooms_from_folders_always_has_general",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 49
      },
      {
        "name": "test_detect_rooms_from_folders_empty_dir",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 55
      },
      {
        "name": "test_detect_rooms_from_folders_skips_oserror_at_top_level",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 62
      },
      {
        "name": "test_detect_rooms_from_folders_skips_oserror_nested",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 90
      },
      {
        "name": "test_detect_rooms_from_folders_skips_iterdir_oserror",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 114
      },
      {
        "name": "test_detect_rooms_from_folders_skips_git",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 138
      },
      {
        "name": "test_detect_rooms_from_folders_nested_dirs",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 148
      },
      {
        "name": "test_detect_rooms_from_folders_room_has_description",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 159
      },
      {
        "name": "test_detect_rooms_from_folders_room_has_keywords",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 168
      },
      {
        "name": "test_detect_rooms_from_folders_custom_named_dirs",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 177
      }
    ],
    "callees": [
      {
        "name": "resolve",
        "file": "",
        "line": 325
      },
      {
        "name": "expanduser",
        "file": "",
        "line": 336
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      },
      {
        "name": "iterdir",
        "file": "",
        "line": 211
      },
      {
        "name": "is_dir",
        "file": "",
        "line": 176
      },
      {
        "name": "debug",
        "file": "",
        "line": 131
      },
      {
        "name": "name",
        "file": "",
        "line": 70
      },
      {
        "name": "replace",
        "file": "",
        "line": 547
      },
      {
        "name": "replace",
        "file": "",
        "line": 551
      },
      {
        "name": "lower",
        "file": "",
        "line": 534
      },
      {
        "name": "lower",
        "file": "",
        "line": 536
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "isalpha",
        "file": "",
        "line": 514
      },
      {
        "name": "list",
        "file": "",
        "line": 1120
      },
      {
        "name": "items",
        "file": "",
        "line": 1210
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "any",
        "file": "",
        "line": 1380
      }
    ],
    "impact": [
      {
        "name": "test_detect_rooms_local_fallback_to_files",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 308
      },
      {
        "name": "test_detect_rooms_from_folders_standard_layout",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 38
      },
      {
        "name": "test_detect_rooms_from_folders_room_has_keywords",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 168
      },
      {
        "name": "test_detect_rooms_local_missing_dir",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 319
      },
      {
        "name": "test_detect_rooms_from_folders_skips_iterdir_oserror",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 114
      },
      {
        "name": "test_detect_rooms_from_folders_nested_dirs",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 148
      },
      {
        "name": "test_detect_rooms_from_folders_skips_oserror_at_top_level",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 62
      },
      {
        "name": "detect_rooms_local",
        "file": "mempalace/mempalace/room_detector_local.py",
        "line": 304
      },
      {
        "name": "test_detect_rooms_from_folders_room_has_description",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 159
      },
      {
        "name": "test_detect_rooms_local_interactive",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 327
      },
      {
        "name": "test_detect_rooms_from_folders_skips_git",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 138
      },
      {
        "name": "test_detect_rooms_from_folders_custom_named_dirs",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 177
      },
      {
        "name": "test_detect_rooms_from_folders_always_has_general",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 49
      },
      {
        "name": "cmd_init",
        "file": "mempalace/mempalace/cli.py",
        "line": 71
      },
      {
        "name": "test_detect_rooms_local_yes_mode",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 298
      },
      {
        "name": "test_detect_rooms_from_folders_skips_oserror_nested",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 90
      },
      {
        "name": "test_detect_rooms_from_folders_empty_dir",
        "file": "mempalace/tests/test_room_detector_local.py",
        "line": 55
      }
    ]
  },
  {
    "id": "g62",
    "symbol": "rebuild_index",
    "file": "mempalace/mempalace/repair.py",
    "line": 204,
    "callers": [
      {
        "name": "(module) repair.py",
        "file": "mempalace/mempalace/repair.py",
        "line": 1
      },
      {
        "name": "test_rebuild_index_no_palace",
        "file": "mempalace/tests/test_repair.py",
        "line": 197
      },
      {
        "name": "test_rebuild_index_empty_palace",
        "file": "mempalace/tests/test_repair.py",
        "line": 205
      },
      {
        "name": "test_rebuild_index_success",
        "file": "mempalace/tests/test_repair.py",
        "line": 216
      },
      {
        "name": "test_rebuild_index_error_reading",
        "file": "mempalace/tests/test_repair.py",
        "line": 250
      }
    ],
    "callees": [
      {
        "name": "_get_palace_path",
        "file": "mempalace/mempalace/repair.py",
        "line": 41
      },
      {
        "name": "isdir",
        "file": "",
        "line": 43
      },
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      },
      {
        "name": "ChromaBackend",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 378
      },
      {
        "name": "get_collection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 501
      },
      {
        "name": "count",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 369
      },
      {
        "name": "get",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 307
      },
      {
        "name": "extend",
        "file": "",
        "line": 1127
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "join",
        "file": "",
        "line": 127
      },
      {
        "name": "exists",
        "file": "",
        "line": 40
      },
      {
        "name": "getsize",
        "file": "",
        "line": 41
      },
      {
        "name": "copy2",
        "file": "",
        "line": 65
      },
      {
        "name": "copy2",
        "file": "",
        "line": 67
      },
      {
        "name": "delete_collection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 574
      },
      {
        "name": "create_collection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 578
      },
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "upsert",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 198
      }
    ],
    "impact": [
      {
        "name": "(module) repair.py",
        "file": "mempalace/mempalace/repair.py",
        "line": 1
      },
      {
        "name": "test_rebuild_index_error_reading",
        "file": "mempalace/tests/test_repair.py",
        "line": 250
      },
      {
        "name": "test_rebuild_index_no_palace",
        "file": "mempalace/tests/test_repair.py",
        "line": 197
      },
      {
        "name": "test_rebuild_index_empty_palace",
        "file": "mempalace/tests/test_repair.py",
        "line": 205
      },
      {
        "name": "test_rebuild_index_success",
        "file": "mempalace/tests/test_repair.py",
        "line": 216
      }
    ]
  },
  {
    "id": "g63",
    "symbol": "test_get_mine_dir_empty",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 350,
    "callers": [],
    "callees": [
      {
        "name": "_get_mine_dir",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 141
      }
    ],
    "impact": []
  },
  {
    "id": "g64",
    "symbol": "test_cmd_status_default_palace",
    "file": "mempalace/tests/test_cli.py",
    "line": 29,
    "callers": [],
    "callees": [
      {
        "name": "Namespace",
        "file": "",
        "line": 494
      },
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "cmd_status",
        "file": "mempalace/mempalace/cli.py",
        "line": 256
      }
    ],
    "impact": []
  },
  {
    "id": "g65",
    "symbol": "test_precompact_mines_transcript_dir",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 467,
    "callers": [],
    "callees": [
      {
        "name": "_capture_hook_output",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 115
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "assert_called_once",
        "file": "",
        "line": 186
      }
    ],
    "impact": []
  },
  {
    "id": "g66",
    "symbol": "test_init",
    "file": "mempalace/tests/test_config.py",
    "line": 30,
    "callers": [],
    "callees": [
      {
        "name": "mkdtemp",
        "file": "",
        "line": 471
      },
      {
        "name": "mkdtemp",
        "file": "",
        "line": 473
      },
      {
        "name": "MempalaceConfig",
        "file": "mempalace/mempalace/config.py",
        "line": 139
      },
      {
        "name": "init",
        "file": "mempalace/mempalace/config.py",
        "line": 257
      },
      {
        "name": "exists",
        "file": "",
        "line": 40
      },
      {
        "name": "join",
        "file": "",
        "line": 127
      }
    ],
    "impact": []
  },
  {
    "id": "g67",
    "symbol": "test_module_import_redirects_stdout_to_stderr",
    "file": "mempalace/tests/test_mcp_stdio_protection.py",
    "line": 18,
    "callers": [],
    "callees": [
      {
        "name": "dedent",
        "file": "",
        "line": 102
      },
      {
        "name": "run",
        "file": "",
        "line": 92
      },
      {
        "name": "run",
        "file": "",
        "line": 126
      },
      {
        "name": "run",
        "file": "",
        "line": 160
      },
      {
        "name": "run",
        "file": "",
        "line": 194
      },
      {
        "name": "run",
        "file": "",
        "line": 229
      },
      {
        "name": "run",
        "file": "",
        "line": 263
      }
    ],
    "impact": []
  },
  {
    "id": "g68",
    "symbol": "status",
    "file": "mempalace/mempalace/miner.py",
    "line": 841,
    "callers": [
      {
        "name": "cmd_status",
        "file": "mempalace/mempalace/cli.py",
        "line": 256
      },
      {
        "name": "test_status_missing_palace_does_not_create_empty_collection",
        "file": "mempalace/tests/test_miner.py",
        "line": 336
      },
      {
        "name": "test_status_handles_none_metadata_without_crash",
        "file": "mempalace/tests/test_miner.py",
        "line": 346
      }
    ],
    "callees": [
      {
        "name": "get_collection",
        "file": "mempalace/mempalace/palace.py",
        "line": 53
      },
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      },
      {
        "name": "count",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 369
      },
      {
        "name": "get",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 307
      },
      {
        "name": "defaultdict",
        "file": "",
        "line": 401
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1911
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1915
      },
      {
        "name": "items",
        "file": "",
        "line": 1210
      }
    ],
    "impact": [
      {
        "name": "test_status_handles_none_metadata_without_crash",
        "file": "mempalace/tests/test_miner.py",
        "line": 346
      },
      {
        "name": "cmd_status",
        "file": "mempalace/mempalace/cli.py",
        "line": 256
      },
      {
        "name": "test_status_missing_palace_does_not_create_empty_collection",
        "file": "mempalace/tests/test_miner.py",
        "line": 336
      },
      {
        "name": "test_cmd_status_default_palace",
        "file": "mempalace/tests/test_cli.py",
        "line": 29
      },
      {
        "name": "test_cmd_status_custom_palace",
        "file": "mempalace/tests/test_cli.py",
        "line": 39
      }
    ]
  },
  {
    "id": "g69",
    "symbol": "test_split_file_output_dir_none",
    "file": "mempalace/tests/test_split_mega_files.py",
    "line": 275,
    "callers": [],
    "callees": [
      {
        "name": "_make_mega_file",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 234
      },
      {
        "name": "split_file",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 179
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": []
  },
  {
    "id": "g70",
    "symbol": "_mock_backend_for",
    "file": "mempalace/tests/test_cli.py",
    "line": 415,
    "callers": [
      {
        "name": "test_cmd_repair_zero_drawers",
        "file": "mempalace/tests/test_cli.py",
        "line": 463
      },
      {
        "name": "test_cmd_repair_success",
        "file": "mempalace/tests/test_cli.py",
        "line": 479
      },
      {
        "name": "test_cmd_repair_aborts_without_confirmation",
        "file": "mempalace/tests/test_cli.py",
        "line": 502
      },
      {
        "name": "test_cmd_compress_no_drawers",
        "file": "mempalace/tests/test_cli.py",
        "line": 538
      },
      {
        "name": "test_cmd_compress_dry_run",
        "file": "mempalace/tests/test_cli.py",
        "line": 560
      },
      {
        "name": "test_cmd_compress_with_config",
        "file": "mempalace/tests/test_cli.py",
        "line": 598
      }
    ],
    "callees": [
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      }
    ],
    "impact": [
      {
        "name": "test_cmd_repair_success",
        "file": "mempalace/tests/test_cli.py",
        "line": 479
      },
      {
        "name": "test_cmd_compress_with_config",
        "file": "mempalace/tests/test_cli.py",
        "line": 598
      },
      {
        "name": "test_cmd_compress_no_drawers",
        "file": "mempalace/tests/test_cli.py",
        "line": 538
      },
      {
        "name": "test_cmd_repair_zero_drawers",
        "file": "mempalace/tests/test_cli.py",
        "line": 463
      },
      {
        "name": "test_cmd_compress_dry_run",
        "file": "mempalace/tests/test_cli.py",
        "line": 560
      },
      {
        "name": "test_cmd_repair_aborts_without_confirmation",
        "file": "mempalace/tests/test_cli.py",
        "line": 502
      }
    ]
  },
  {
    "id": "g71",
    "symbol": "_read",
    "file": "mempalace/tests/test_readme_claims.py",
    "line": 29,
    "callers": [
      {
        "name": "_readme",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 33
      },
      {
        "name": "_tools_dict_keys",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 37
      },
      {
        "name": "_doc_tool_names",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 45
      },
      {
        "name": "test_get_closets_collection_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 143
      },
      {
        "name": "test_closet_boost_search_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 167
      },
      {
        "name": "test_searcher_imports_closets",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 176
      },
      {
        "name": "test_bm25_in_searcher",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 193
      },
      {
        "name": "test_entity_extraction_in_palace_or_miner",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 222
      },
      {
        "name": "test_strip_noise_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 245
      },
      {
        "name": "test_find_tunnels_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 323
      },
      {
        "name": "test_traverse_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 332
      },
      {
        "name": "test_graph_stats_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 338
      },
      {
        "name": "test_mine_lock_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 387
      },
      {
        "name": "test_mine_lock_is_context_manager",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 402
      },
      {
        "name": "test_version_py_matches_pyproject",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 421
      },
      {
        "name": "test_readme_badge_matches_version_py",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 448
      },
      {
        "name": "test_dialect_docstring_says_not_lossless",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 476
      },
      {
        "name": "test_dialect_docstring_does_not_claim_lossless",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 487
      },
      {
        "name": "test_readme_dialect_line_not_lossless",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 514
      },
      {
        "name": "test_hall_keywords_defined_in_config",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 539
      },
      {
        "name": "test_miners_write_hall_metadata",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 547
      },
      {
        "name": "test_backends_base_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 596
      },
      {
        "name": "test_backends_chroma_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 608
      },
      {
        "name": "test_readme_wakeup_cost_matches_layers",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 666
      },
      {
        "name": "test_readme_pyproject_version_claim",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 707
      },
      {
        "name": "test_aaak_spec_handler_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 753
      }
    ],
    "callees": [
      {
        "name": "read_text",
        "file": "",
        "line": 178
      }
    ],
    "impact": [
      {
        "name": "test_miners_write_hall_metadata",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 547
      },
      {
        "name": "test_searcher_imports_closets",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 176
      },
      {
        "name": "test_aaak_spec_handler_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 753
      },
      {
        "name": "test_bm25_in_searcher",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 193
      },
      {
        "name": "test_find_tunnels_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 323
      },
      {
        "name": "test_all_tool_count_mentions_consistent",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 734
      },
      {
        "name": "test_mine_lock_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 387
      },
      {
        "name": "test_readme_dialect_line_not_lossless",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 514
      },
      {
        "name": "test_hall_keywords_defined_in_config",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 539
      },
      {
        "name": "_doc_tool_names",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 45
      },
      {
        "name": "test_every_readme_tool_exists_in_tools_dict",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 89
      },
      {
        "name": "test_mine_lock_is_context_manager",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 402
      },
      {
        "name": "test_dialect_docstring_says_not_lossless",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 476
      },
      {
        "name": "test_backends_chroma_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 608
      },
      {
        "name": "_readme",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 33
      },
      {
        "name": "test_readme_tool_count_matches_code",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 64
      },
      {
        "name": "test_readme_badge_matches_version_py",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 448
      },
      {
        "name": "test_closet_boost_search_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 167
      },
      {
        "name": "test_backends_base_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 596
      },
      {
        "name": "test_version_py_matches_pyproject",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 421
      },
      {
        "name": "_tools_dict_keys",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 37
      },
      {
        "name": "test_strip_noise_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 245
      },
      {
        "name": "test_get_closets_collection_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 143
      },
      {
        "name": "test_graph_stats_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 338
      },
      {
        "name": "test_dialect_docstring_does_not_claim_lossless",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 487
      },
      {
        "name": "test_traverse_exists",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 332
      },
      {
        "name": "test_entity_extraction_in_palace_or_miner",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 222
      },
      {
        "name": "test_no_undocumented_tools",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 120
      },
      {
        "name": "test_readme_pyproject_version_claim",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 707
      },
      {
        "name": "test_readme_wakeup_cost_matches_layers",
        "file": "mempalace/tests/test_readme_claims.py",
        "line": 666
      }
    ]
  },
  {
    "id": "g72",
    "symbol": "mine",
    "file": "mempalace/mempalace/miner.py",
    "line": 753,
    "callers": [
      {
        "name": "cmd_mine",
        "file": "mempalace/mempalace/cli.py",
        "line": 116
      },
      {
        "name": "test_remine_replaces_closets_completely",
        "file": "mempalace/tests/test_closets.py",
        "line": 284
      },
      {
        "name": "_setup_palace",
        "file": "mempalace/tests/test_exporter.py",
        "line": 17
      },
      {
        "name": "test_mined_drawers_have_hall",
        "file": "mempalace/tests/test_hall_detection.py",
        "line": 152
      },
      {
        "name": "test_project_mining",
        "file": "mempalace/tests/test_miner.py",
        "line": 23
      },
      {
        "name": "test_mine_dry_run_with_tiny_file_no_crash",
        "file": "mempalace/tests/test_miner.py",
        "line": 310
      },
      {
        "name": "test_mine_files_per_second",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 40
      },
      {
        "name": "test_mine_peak_rss",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 66
      },
      {
        "name": "test_skip_check_cost",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 138
      }
    ],
    "callees": [
      {
        "name": "resolve",
        "file": "",
        "line": 325
      },
      {
        "name": "expanduser",
        "file": "",
        "line": 336
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      },
      {
        "name": "load_config",
        "file": "mempalace/mempalace/miner.py",
        "line": 271
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      },
      {
        "name": "scan_project",
        "file": "mempalace/mempalace/miner.py",
        "line": 684
      },
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1911
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1915
      },
      {
        "name": "normalize_include_paths",
        "file": "mempalace/mempalace/miner.py",
        "line": 219
      },
      {
        "name": "get_collection",
        "file": "mempalace/mempalace/palace.py",
        "line": 53
      },
      {
        "name": "get_closets_collection",
        "file": "mempalace/mempalace/palace.py",
        "line": 66
      },
      {
        "name": "defaultdict",
        "file": "",
        "line": 401
      },
      {
        "name": "enumerate",
        "file": "",
        "line": 1321
      },
      {
        "name": "process_file",
        "file": "mempalace/mempalace/miner.py",
        "line": 585
      },
      {
        "name": "items",
        "file": "",
        "line": 1210
      }
    ],
    "impact": [
      {
        "name": "test_mine_files_per_second",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 40
      },
      {
        "name": "test_export_creates_structure",
        "file": "mempalace/tests/test_exporter.py",
        "line": 58
      },
      {
        "name": "_setup_palace",
        "file": "mempalace/tests/test_exporter.py",
        "line": 17
      },
      {
        "name": "test_remine_replaces_closets_completely",
        "file": "mempalace/tests/test_closets.py",
        "line": 284
      },
      {
        "name": "test_cmd_mine_projects_mode",
        "file": "mempalace/tests/test_cli.py",
        "line": 153
      },
      {
        "name": "test_mine_dry_run_with_tiny_file_no_crash",
        "file": "mempalace/tests/test_miner.py",
        "line": 310
      },
      {
        "name": "test_cmd_mine_convos_mode",
        "file": "mempalace/tests/test_cli.py",
        "line": 182
      },
      {
        "name": "test_mine_peak_rss",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 66
      },
      {
        "name": "test_cmd_mine_include_ignored_comma_split",
        "file": "mempalace/tests/test_cli.py",
        "line": 210
      },
      {
        "name": "test_export_markdown_content",
        "file": "mempalace/tests/test_exporter.py",
        "line": 84
      },
      {
        "name": "test_export_index_content",
        "file": "mempalace/tests/test_exporter.py",
        "line": 107
      },
      {
        "name": "cmd_mine",
        "file": "mempalace/mempalace/cli.py",
        "line": 116
      },
      {
        "name": "test_mined_drawers_have_hall",
        "file": "mempalace/tests/test_hall_detection.py",
        "line": 152
      },
      {
        "name": "test_skip_check_cost",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 138
      },
      {
        "name": "test_project_mining",
        "file": "mempalace/tests/test_miner.py",
        "line": 23
      }
    ]
  },
  {
    "id": "g73",
    "symbol": "_patch_mcp_config",
    "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
    "line": 32,
    "callers": [
      {
        "name": "test_tool_status_rss_growth",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 75
      },
      {
        "name": "test_tool_status_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 93
      },
      {
        "name": "test_list_wings_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 116
      },
      {
        "name": "test_get_taxonomy_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 135
      },
      {
        "name": "test_reinstantiation_overhead",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 153
      },
      {
        "name": "test_search_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 190
      },
      {
        "name": "test_duplicate_check_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 214
      }
    ],
    "callees": [
      {
        "name": "MempalaceConfig",
        "file": "mempalace/mempalace/config.py",
        "line": 139
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "KnowledgeGraph",
        "file": "mempalace/mempalace/knowledge_graph.py",
        "line": 50
      }
    ],
    "impact": [
      {
        "name": "test_search_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 190
      },
      {
        "name": "test_list_wings_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 116
      },
      {
        "name": "test_tool_status_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 93
      },
      {
        "name": "test_tool_status_rss_growth",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 75
      },
      {
        "name": "test_reinstantiation_overhead",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 153
      },
      {
        "name": "test_get_taxonomy_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 135
      },
      {
        "name": "test_duplicate_check_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 214
      }
    ]
  },
  {
    "id": "g74",
    "symbol": "test_export_empty_palace",
    "file": "mempalace/tests/test_exporter.py",
    "line": 126,
    "callers": [],
    "callees": [
      {
        "name": "mkdtemp",
        "file": "",
        "line": 471
      },
      {
        "name": "mkdtemp",
        "file": "",
        "line": 473
      },
      {
        "name": "join",
        "file": "",
        "line": 127
      },
      {
        "name": "export_palace",
        "file": "mempalace/mempalace/exporter.py",
        "line": 29
      }
    ],
    "impact": []
  },
  {
    "id": "g75",
    "symbol": "test_kg_value_accepts_parentheses",
    "file": "mempalace/tests/test_config.py",
    "line": 82,
    "callers": [],
    "callees": [
      {
        "name": "sanitize_kg_value",
        "file": "mempalace/mempalace/config.py",
        "line": 50
      }
    ],
    "impact": []
  },
  {
    "id": "g76",
    "symbol": "test_format_tool_result_unknown_short",
    "file": "mempalace/tests/test_normalize.py",
    "line": 306,
    "callers": [],
    "callees": [
      {
        "name": "_format_tool_result",
        "file": "mempalace/mempalace/normalize.py",
        "line": 496
      }
    ],
    "impact": []
  },
  {
    "id": "g77",
    "symbol": "test_warn_ambiguous_empty_list",
    "file": "mempalace/tests/test_onboarding.py",
    "line": 70,
    "callers": [],
    "callees": [
      {
        "name": "_warn_ambiguous",
        "file": "mempalace/mempalace/onboarding.py",
        "line": 247
      }
    ],
    "impact": []
  },
  {
    "id": "g78",
    "symbol": "_fetch_all_metadata",
    "file": "mempalace/mempalace/mcp_server.py",
    "line": 246,
    "callers": [
      {
        "name": "_get_cached_metadata",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 269
      },
      {
        "name": "tool_list_rooms",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 382
      }
    ],
    "callees": [
      {
        "name": "extend",
        "file": "",
        "line": 1127
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": [
      {
        "name": "test_list_rooms_filtered",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 302
      },
      {
        "name": "tool_get_taxonomy",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 406
      },
      {
        "name": "tool_list_rooms",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 382
      },
      {
        "name": "tool_status",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 296
      },
      {
        "name": "test_list_rooms_rejects_invalid_wing",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 372
      },
      {
        "name": "_get_cached_metadata",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 269
      },
      {
        "name": "test_list_rooms_all",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 293
      },
      {
        "name": "tool_list_wings",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 363
      }
    ]
  },
  {
    "id": "g79",
    "symbol": "test_detect_rooms_from_files_with_matching_filenames",
    "file": "mempalace/tests/test_room_detector_local.py",
    "line": 188,
    "callers": [],
    "callees": [
      {
        "name": "detect_rooms_from_files",
        "file": "mempalace/mempalace/room_detector_local.py",
        "line": 195
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g80",
    "symbol": "test_extract_subject_found",
    "file": "mempalace/tests/test_split_mega_files.py",
    "line": 201,
    "callers": [],
    "callees": [
      {
        "name": "extract_subject",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 160
      },
      {
        "name": "lower",
        "file": "",
        "line": 534
      },
      {
        "name": "lower",
        "file": "",
        "line": 536
      }
    ],
    "impact": []
  },
  {
    "id": "g81",
    "symbol": "test_layer0_token_estimate_empty",
    "file": "mempalace/tests/test_layers.py",
    "line": 49,
    "callers": [],
    "callees": [
      {
        "name": "Layer0",
        "file": "mempalace/mempalace/layers.py",
        "line": 34
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "token_estimate",
        "file": "mempalace/mempalace/layers.py",
        "line": 67
      }
    ],
    "impact": []
  },
  {
    "id": "g82",
    "symbol": "_name_boost",
    "file": "mempalace/benchmarks/locomo_bench.py",
    "line": 362,
    "callers": [
      {
        "name": "run_benchmark",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 621
      }
    ],
    "callees": [
      {
        "name": "sum",
        "file": "",
        "line": 1930
      },
      {
        "name": "sum",
        "file": "",
        "line": 1932
      },
      {
        "name": "sum",
        "file": "",
        "line": 1934
      },
      {
        "name": "min",
        "file": "",
        "line": 1693
      },
      {
        "name": "min",
        "file": "",
        "line": 1697
      },
      {
        "name": "min",
        "file": "",
        "line": 1699
      },
      {
        "name": "min",
        "file": "",
        "line": 1701
      },
      {
        "name": "min",
        "file": "",
        "line": 1703
      },
      {
        "name": "min",
        "file": "",
        "line": 1705
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": [
      {
        "name": "run_benchmark",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 621
      },
      {
        "name": "(module) locomo_bench.py",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 1
      }
    ]
  },
  {
    "id": "g83",
    "symbol": "test_layer3_search_with_results",
    "file": "mempalace/tests/test_layers.py",
    "line": 375,
    "callers": [],
    "callees": [
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "_mock_query_results",
        "file": "mempalace/tests/test_layers.py",
        "line": 351
      },
      {
        "name": "Layer3",
        "file": "mempalace/mempalace/layers.py",
        "line": 243
      },
      {
        "name": "search",
        "file": "mempalace/mempalace/layers.py",
        "line": 253
      }
    ],
    "impact": []
  },
  {
    "id": "g84",
    "symbol": "test_log_oserror_is_silenced",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 232,
    "callers": [],
    "callees": [
      {
        "name": "Path",
        "file": "",
        "line": 151
      },
      {
        "name": "_log",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 111
      }
    ],
    "impact": []
  },
  {
    "id": "g85",
    "symbol": "test_first_or_empty_handles_missing_key",
    "file": "mempalace/tests/test_empty_chromadb_results.py",
    "line": 29,
    "callers": [],
    "callees": [
      {
        "name": "_first_or_empty",
        "file": "mempalace/mempalace/searcher.py",
        "line": 33
      }
    ],
    "impact": []
  },
  {
    "id": "g86",
    "symbol": "test_memory_stack_wake_up_with_wing",
    "file": "mempalace/tests/test_layers.py",
    "line": 573,
    "callers": [],
    "callees": [
      {
        "name": "MemoryStack",
        "file": "mempalace/mempalace/layers.py",
        "line": 357
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "wake_up",
        "file": "mempalace/mempalace/layers.py",
        "line": 377
      }
    ],
    "impact": []
  },
  {
    "id": "g87",
    "symbol": "test_knowledge_graph_add_triple_accepts_source_drawer_id_and_adapter_name",
    "file": "mempalace/tests/test_sources.py",
    "line": 349,
    "callers": [],
    "callees": [
      {
        "name": "KnowledgeGraph",
        "file": "mempalace/mempalace/knowledge_graph.py",
        "line": 50
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "add_triple",
        "file": "mempalace/mempalace/knowledge_graph.py",
        "line": 149
      },
      {
        "name": "connect",
        "file": "",
        "line": 250
      },
      {
        "name": "fetchone",
        "file": "",
        "line": 432
      },
      {
        "name": "execute",
        "file": "",
        "line": 363
      },
      {
        "name": "close",
        "file": "",
        "line": 332
      },
      {
        "name": "close",
        "file": "mempalace/mempalace/knowledge_graph.py",
        "line": 124
      }
    ],
    "impact": []
  },
  {
    "id": "g88",
    "symbol": "test_lookup_known_project",
    "file": "mempalace/tests/test_entity_registry.py",
    "line": 160,
    "callers": [],
    "callees": [
      {
        "name": "load",
        "file": "mempalace/mempalace/entity_registry.py",
        "line": 307
      },
      {
        "name": "seed",
        "file": "mempalace/mempalace/entity_registry.py",
        "line": 360
      },
      {
        "name": "lookup",
        "file": "mempalace/mempalace/entity_registry.py",
        "line": 412
      }
    ],
    "impact": []
  },
  {
    "id": "g89",
    "symbol": "test_get_adapter_unknown_raises_key_error",
    "file": "mempalace/tests/test_sources.py",
    "line": 194,
    "callers": [],
    "callees": [
      {
        "name": "get_adapter",
        "file": "mempalace/mempalace/sources/registry.py",
        "line": 111
      }
    ],
    "impact": []
  },
  {
    "id": "g90",
    "symbol": "_lock_worker",
    "file": "mempalace/tests/test_closets.py",
    "line": 67,
    "callers": [],
    "callees": [
      {
        "name": "_mine_lock",
        "file": "mempalace/mempalace/palace.py",
        "line": 275
      },
      {
        "name": "time",
        "file": "",
        "line": 85
      },
      {
        "name": "sleep",
        "file": "",
        "line": 82
      },
      {
        "name": "open",
        "file": "",
        "line": 1716
      },
      {
        "name": "open",
        "file": "",
        "line": 1729
      },
      {
        "name": "open",
        "file": "",
        "line": 1742
      },
      {
        "name": "open",
        "file": "",
        "line": 1753
      },
      {
        "name": "open",
        "file": "",
        "line": 1764
      },
      {
        "name": "open",
        "file": "",
        "line": 1777
      },
      {
        "name": "open",
        "file": "",
        "line": 1790
      },
      {
        "name": "write",
        "file": "",
        "line": 208
      },
      {
        "name": "flush",
        "file": "",
        "line": 36
      }
    ],
    "impact": []
  },
  {
    "id": "g91",
    "symbol": "_llm_call",
    "file": "mempalace/benchmarks/locomo_bench.py",
    "line": 396,
    "callers": [
      {
        "name": "_assign_room",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 423
      },
      {
        "name": "_route_question",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 446
      }
    ],
    "callees": [
      {
        "name": "encode",
        "file": "",
        "line": 498
      },
      {
        "name": "dumps",
        "file": "",
        "line": 10
      },
      {
        "name": "Request",
        "file": "",
        "line": 120
      },
      {
        "name": "urlopen",
        "file": "",
        "line": 63
      },
      {
        "name": "loads",
        "file": "",
        "line": 39
      }
    ],
    "impact": [
      {
        "name": "_assign_room",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 423
      },
      {
        "name": "_route_question",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 446
      },
      {
        "name": "palace_assign_rooms",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 474
      }
    ]
  },
  {
    "id": "g92",
    "symbol": "test_palace_context_upsert_drawer_stamps_adapter_metadata",
    "file": "mempalace/tests/test_sources.py",
    "line": 253,
    "callers": [],
    "callees": [
      {
        "name": "_FakeCollection",
        "file": "mempalace/tests/test_sources.py",
        "line": 222
      },
      {
        "name": "_FakeKG",
        "file": "mempalace/tests/test_sources.py",
        "line": 245
      },
      {
        "name": "PalaceContext",
        "file": "mempalace/mempalace/sources/context.py",
        "line": 49
      },
      {
        "name": "DrawerRecord",
        "file": "mempalace/mempalace/sources/base.py",
        "line": 109
      },
      {
        "name": "upsert_drawer",
        "file": "mempalace/mempalace/sources/context.py",
        "line": 91
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": []
  },
  {
    "id": "g93",
    "symbol": "test_warn_ambiguous_multiple_hits",
    "file": "mempalace/tests/test_onboarding.py",
    "line": 84,
    "callers": [],
    "callees": [
      {
        "name": "_warn_ambiguous",
        "file": "mempalace/mempalace/onboarding.py",
        "line": 247
      }
    ],
    "impact": []
  },
  {
    "id": "g94",
    "symbol": "detect_room",
    "file": "mempalace/mempalace/miner.py",
    "line": 310,
    "callers": [
      {
        "name": "process_file",
        "file": "mempalace/mempalace/miner.py",
        "line": 585
      }
    ],
    "callees": [
      {
        "name": "lower",
        "file": "",
        "line": 534
      },
      {
        "name": "lower",
        "file": "",
        "line": 536
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "relative_to",
        "file": "",
        "line": 121
      },
      {
        "name": "stem",
        "file": "",
        "line": 76
      },
      {
        "name": "split",
        "file": "",
        "line": 587
      },
      {
        "name": "split",
        "file": "",
        "line": 589
      },
      {
        "name": "replace",
        "file": "",
        "line": 547
      },
      {
        "name": "replace",
        "file": "",
        "line": 551
      },
      {
        "name": "any",
        "file": "",
        "line": 1380
      },
      {
        "name": "defaultdict",
        "file": "",
        "line": 401
      },
      {
        "name": "count",
        "file": "",
        "line": 497
      },
      {
        "name": "max",
        "file": "",
        "line": 1679
      },
      {
        "name": "max",
        "file": "",
        "line": 1683
      },
      {
        "name": "max",
        "file": "",
        "line": 1685
      },
      {
        "name": "max",
        "file": "",
        "line": 1687
      },
      {
        "name": "max",
        "file": "",
        "line": 1689
      },
      {
        "name": "max",
        "file": "",
        "line": 1691
      }
    ],
    "impact": [
      {
        "name": "process_file",
        "file": "mempalace/mempalace/miner.py",
        "line": 585
      },
      {
        "name": "mine",
        "file": "mempalace/mempalace/miner.py",
        "line": 753
      }
    ]
  },
  {
    "id": "g95",
    "symbol": "test_find_session_boundaries_two_sessions",
    "file": "mempalace/tests/test_split_mega_files.py",
    "line": 129,
    "callers": [],
    "callees": [
      {
        "name": "find_session_boundaries",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 92
      }
    ],
    "impact": []
  },
  {
    "id": "g96",
    "symbol": "test_extract_content_with_tool_result",
    "file": "mempalace/tests/test_normalize.py",
    "line": 909,
    "callers": [],
    "callees": [
      {
        "name": "_extract_content",
        "file": "mempalace/mempalace/normalize.py",
        "line": 415
      }
    ],
    "impact": []
  },
  {
    "id": "g97",
    "symbol": "test_detect_rooms_local_fallback_to_files",
    "file": "mempalace/tests/test_room_detector_local.py",
    "line": 308,
    "callers": [],
    "callees": [
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "detect_rooms_local",
        "file": "mempalace/mempalace/room_detector_local.py",
        "line": 304
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g98",
    "symbol": "_check_kg_contradictions",
    "file": "mempalace/mempalace/fact_checker.py",
    "line": 179,
    "callers": [
      {
        "name": "check_text",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 52
      }
    ],
    "callees": [
      {
        "name": "_extract_claims",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 152
      },
      {
        "name": "KnowledgeGraph",
        "file": "mempalace/mempalace/knowledge_graph.py",
        "line": 50
      },
      {
        "name": "join",
        "file": "",
        "line": 127
      },
      {
        "name": "query_entity",
        "file": "mempalace/mempalace/knowledge_graph.py",
        "line": 240
      },
      {
        "name": "_objects_match",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 276
      },
      {
        "name": "lower",
        "file": "",
        "line": 534
      },
      {
        "name": "lower",
        "file": "",
        "line": 536
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "isoformat",
        "file": "",
        "line": 91
      },
      {
        "name": "date",
        "file": "",
        "line": 296
      },
      {
        "name": "now",
        "file": "",
        "line": 288
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": [
      {
        "name": "test_current_fact_same_triple_is_not_flagged",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 223
      },
      {
        "name": "test_registry_confusion_path_isolated_from_kg",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 243
      },
      {
        "name": "test_no_false_positive_when_kg_has_no_facts_about_subject",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 200
      },
      {
        "name": "(module) fact_checker.py",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 1
      },
      {
        "name": "test_stale_fact_detected",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 205
      },
      {
        "name": "test_relationship_mismatch_detected",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 183
      },
      {
        "name": "test_empty_text_returns_empty_list",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 240
      },
      {
        "name": "check_text",
        "file": "mempalace/mempalace/fact_checker.py",
        "line": 52
      },
      {
        "name": "test_missing_palace_does_not_crash",
        "file": "mempalace/tests/test_fact_checker.py",
        "line": 229
      }
    ]
  },
  {
    "id": "g99",
    "symbol": "_flatten_content",
    "file": "mempalace/mempalace/sweeper.py",
    "line": 56,
    "callers": [
      {
        "name": "parse_claude_jsonl",
        "file": "mempalace/mempalace/sweeper.py",
        "line": 88
      }
    ],
    "callees": [
      {
        "name": "isinstance",
        "file": "",
        "line": 1564
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "dumps",
        "file": "",
        "line": 10
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": [
      {
        "name": "test_sweep_recovers_untaken_message_at_cursor_timestamp",
        "file": "mempalace/tests/test_sweeper.py",
        "line": 228
      },
      {
        "name": "test_parse_extracts_session_id_and_timestamp",
        "file": "mempalace/tests/test_sweeper.py",
        "line": 85
      },
      {
        "name": "test_parse_normalizes_assistant_content_list_to_text",
        "file": "mempalace/tests/test_sweeper.py",
        "line": 94
      },
      {
        "name": "parse_claude_jsonl",
        "file": "mempalace/mempalace/sweeper.py",
        "line": 88
      },
      {
        "name": "test_parse_yields_only_user_and_assistant",
        "file": "mempalace/tests/test_sweeper.py",
        "line": 74
      },
      {
        "name": "test_parse_preserves_tool_blocks_verbatim",
        "file": "mempalace/tests/test_sweeper.py",
        "line": 104
      },
      {
        "name": "sweep",
        "file": "mempalace/mempalace/sweeper.py",
        "line": 193
      }
    ]
  },
  {
    "id": "g100",
    "symbol": "test_main_hook_run_dispatches",
    "file": "mempalace/tests/test_cli.py",
    "line": 366,
    "callers": [],
    "callees": [
      {
        "name": "main",
        "file": "mempalace/mempalace/cli.py",
        "line": 515
      },
      {
        "name": "assert_called_once",
        "file": "",
        "line": 186
      }
    ],
    "impact": []
  },
  {
    "id": "g101",
    "symbol": "test_sanitize_name_latvian",
    "file": "mempalace/tests/test_config.py",
    "line": 44,
    "callers": [],
    "callees": [
      {
        "name": "sanitize_name",
        "file": "mempalace/mempalace/config.py",
        "line": 22
      }
    ],
    "impact": []
  },
  {
    "id": "g102",
    "symbol": "test_mine_already_running_live_pid",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 313,
    "callers": [],
    "callees": [
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "getpid",
        "file": "",
        "line": 962
      },
      {
        "name": "_mine_already_running",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 189
      }
    ],
    "impact": []
  },
  {
    "id": "g103",
    "symbol": "test_count_rejects_traversal_path",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 579,
    "callers": [],
    "callees": [
      {
        "name": "_count_human_messages",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 65
      }
    ],
    "impact": []
  },
  {
    "id": "g104",
    "symbol": "test_ask_with_default_uses_default",
    "file": "mempalace/tests/test_onboarding.py",
    "line": 225,
    "callers": [],
    "callees": [
      {
        "name": "_ask",
        "file": "mempalace/mempalace/onboarding.py",
        "line": 69
      }
    ],
    "impact": []
  },
  {
    "id": "g105",
    "symbol": "test_fix_blob_seq_ids_noop_without_database",
    "file": "mempalace/tests/test_backends.py",
    "line": 378,
    "callers": [],
    "callees": [
      {
        "name": "_fix_blob_seq_ids",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 134
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g106",
    "symbol": "test_slack_json_has_provenance_footer",
    "file": "mempalace/tests/test_normalize.py",
    "line": 806,
    "callers": [],
    "callees": [
      {
        "name": "_try_slack_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 373
      },
      {
        "name": "endswith",
        "file": "",
        "line": 499
      }
    ],
    "impact": []
  },
  {
    "id": "g107",
    "symbol": "test_scan_for_detection_finds_prose",
    "file": "mempalace/tests/test_entity_detector.py",
    "line": 235,
    "callers": [],
    "callees": [
      {
        "name": "scan_for_detection",
        "file": "mempalace/mempalace/entity_detector.py",
        "line": 549
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "splitext",
        "file": "",
        "line": 149
      }
    ],
    "impact": []
  },
  {
    "id": "g108",
    "symbol": "test_memory_stack_status",
    "file": "mempalace/tests/test_layers.py",
    "line": 619,
    "callers": [],
    "callees": [
      {
        "name": "MemoryStack",
        "file": "mempalace/mempalace/layers.py",
        "line": 357
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "status",
        "file": "mempalace/mempalace/layers.py",
        "line": 406
      }
    ],
    "impact": []
  },
  {
    "id": "g109",
    "symbol": "test_get_entity_patterns_case_insensitive",
    "file": "mempalace/tests/test_i18n_lang_case.py",
    "line": 64,
    "callers": [],
    "callees": [
      {
        "name": "get_entity_patterns",
        "file": "mempalace/mempalace/i18n/__init__.py",
        "line": 197
      }
    ],
    "impact": []
  },
  {
    "id": "g110",
    "symbol": "_maybe_auto_ingest",
    "file": "mempalace/mempalace/hooks_cli.py",
    "line": 207,
    "callers": [
      {
        "name": "hook_stop",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 255
      },
      {
        "name": "test_maybe_auto_ingest_no_env",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 242
      },
      {
        "name": "test_maybe_auto_ingest_with_env",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 249
      },
      {
        "name": "test_maybe_auto_ingest_with_transcript",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 261
      },
      {
        "name": "test_maybe_auto_ingest_oserror",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 273
      },
      {
        "name": "test_maybe_auto_ingest_skips_when_mine_running",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 284
      }
    ],
    "callees": [
      {
        "name": "_get_mine_dir",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 141
      },
      {
        "name": "_mine_already_running",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 189
      },
      {
        "name": "_log",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 111
      },
      {
        "name": "_spawn_mine",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 198
      }
    ],
    "impact": [
      {
        "name": "test_maybe_auto_ingest_oserror",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 273
      },
      {
        "name": "hook_stop",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 255
      },
      {
        "name": "test_maybe_auto_ingest_skips_when_mine_running",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 284
      },
      {
        "name": "test_maybe_auto_ingest_with_transcript",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 261
      },
      {
        "name": "test_maybe_auto_ingest_with_env",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 249
      },
      {
        "name": "test_maybe_auto_ingest_no_env",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 242
      }
    ]
  },
  {
    "id": "g111",
    "symbol": "tool_delete_drawer",
    "file": "mempalace/mempalace/mcp_server.py",
    "line": 667,
    "callers": [
      {
        "name": "test_delete_drawer",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 483
      },
      {
        "name": "test_delete_drawer_not_found",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 491
      }
    ],
    "callees": [
      {
        "name": "_get_collection",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 214
      },
      {
        "name": "_no_palace",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 236
      },
      {
        "name": "get",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 307
      },
      {
        "name": "get",
        "file": "mempalace/mempalace/backends/base.py",
        "line": 107
      },
      {
        "name": "_wal_log",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 139
      },
      {
        "name": "delete",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 360
      },
      {
        "name": "info",
        "file": "",
        "line": 140
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": [
      {
        "name": "test_delete_drawer",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 483
      },
      {
        "name": "test_delete_drawer_not_found",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 491
      }
    ]
  },
  {
    "id": "g112",
    "symbol": "test_scan_palace_with_bad_ids",
    "file": "mempalace/tests/test_repair.py",
    "line": 107,
    "callers": [],
    "callees": [
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "Exception",
        "file": "",
        "line": 2086
      },
      {
        "name": "_install_mock_backend",
        "file": "mempalace/tests/test_repair.py",
        "line": 69
      },
      {
        "name": "scan_palace",
        "file": "mempalace/mempalace/repair.py",
        "line": 81
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g113",
    "symbol": "tool_create_tunnel",
    "file": "mempalace/mempalace/mcp_server.py",
    "line": 542,
    "callers": [],
    "callees": [
      {
        "name": "sanitize_name",
        "file": "mempalace/mempalace/config.py",
        "line": 22
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "create_tunnel",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 315
      }
    ],
    "impact": []
  },
  {
    "id": "g114",
    "symbol": "test_parse_harness_input_unknown",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 359,
    "callers": [],
    "callees": [
      {
        "name": "_parse_harness_input",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 243
      }
    ],
    "impact": []
  },
  {
    "id": "g115",
    "symbol": "test_stop_hook_passthrough_when_active",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 130,
    "callers": [],
    "callees": [
      {
        "name": "_capture_hook_output",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 115
      }
    ],
    "impact": []
  },
  {
    "id": "g116",
    "symbol": "build_closet_lines",
    "file": "mempalace/mempalace/palace.py",
    "line": 163,
    "callers": [
      {
        "name": "ingest_diaries",
        "file": "mempalace/mempalace/diary_ingest.py",
        "line": 75
      },
      {
        "name": "process_file",
        "file": "mempalace/mempalace/miner.py",
        "line": 585
      },
      {
        "name": "test_emits_pointer_line_shape",
        "file": "mempalace/tests/test_closets.py",
        "line": 151
      },
      {
        "name": "test_extracts_section_headers_as_topics",
        "file": "mempalace/tests/test_closets.py",
        "line": 172
      },
      {
        "name": "test_entity_stoplist_filters_sentence_starters",
        "file": "mempalace/tests/test_closets.py",
        "line": 179
      },
      {
        "name": "test_real_proper_nouns_survive_stoplist",
        "file": "mempalace/tests/test_closets.py",
        "line": 197
      },
      {
        "name": "test_emits_fallback_line_when_nothing_extractable",
        "file": "mempalace/tests/test_closets.py",
        "line": 208
      },
      {
        "name": "test_pointer_references_first_three_drawers",
        "file": "mempalace/tests/test_closets.py",
        "line": 215
      }
    ],
    "callees": [
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "_candidate_entity_words",
        "file": "mempalace/mempalace/palace.py",
        "line": 137
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1911
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1915
      },
      {
        "name": "items",
        "file": "",
        "line": 1210
      },
      {
        "name": "extend",
        "file": "",
        "line": 1127
      },
      {
        "name": "findall",
        "file": "",
        "line": 275
      },
      {
        "name": "findall",
        "file": "",
        "line": 277
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "list",
        "file": "",
        "line": 1120
      },
      {
        "name": "fromkeys",
        "file": "",
        "line": 1217
      },
      {
        "name": "fromkeys",
        "file": "",
        "line": 1220
      },
      {
        "name": "stem",
        "file": "",
        "line": 76
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      }
    ],
    "impact": [
      {
        "name": "test_ingest_skips_unchanged_on_second_run",
        "file": "mempalace/tests/test_closets.py",
        "line": 594
      },
      {
        "name": "ingest_diaries",
        "file": "mempalace/mempalace/diary_ingest.py",
        "line": 75
      },
      {
        "name": "test_ingest_creates_drawers_and_closets",
        "file": "mempalace/tests/test_closets.py",
        "line": 580
      },
      {
        "name": "process_file",
        "file": "mempalace/mempalace/miner.py",
        "line": 585
      },
      {
        "name": "test_real_proper_nouns_survive_stoplist",
        "file": "mempalace/tests/test_closets.py",
        "line": 197
      },
      {
        "name": "test_pointer_references_first_three_drawers",
        "file": "mempalace/tests/test_closets.py",
        "line": 215
      },
      {
        "name": "test_state_file_lives_outside_diary_dir",
        "file": "mempalace/tests/test_closets.py",
        "line": 608
      },
      {
        "name": "test_extracts_section_headers_as_topics",
        "file": "mempalace/tests/test_closets.py",
        "line": 172
      },
      {
        "name": "test_emits_pointer_line_shape",
        "file": "mempalace/tests/test_closets.py",
        "line": 151
      },
      {
        "name": "(module) diary_ingest.py",
        "file": "mempalace/mempalace/diary_ingest.py",
        "line": 1
      },
      {
        "name": "test_emits_fallback_line_when_nothing_extractable",
        "file": "mempalace/tests/test_closets.py",
        "line": 208
      },
      {
        "name": "mine",
        "file": "mempalace/mempalace/miner.py",
        "line": 753
      },
      {
        "name": "test_wing_prefixed_drawer_id_prevents_cross_diary_collision",
        "file": "mempalace/tests/test_closets.py",
        "line": 638
      },
      {
        "name": "test_entity_stoplist_filters_sentence_starters",
        "file": "mempalace/tests/test_closets.py",
        "line": 179
      }
    ]
  },
  {
    "id": "g117",
    "symbol": "test_load_known_names_caching",
    "file": "mempalace/tests/test_split_mega_files.py",
    "line": 81,
    "callers": [],
    "callees": [
      {
        "name": "dumps",
        "file": "",
        "line": 10
      },
      {
        "name": "_load_known_names_config",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 41
      }
    ],
    "impact": []
  },
  {
    "id": "g118",
    "symbol": "test_cmd_repair_aborts_without_confirmation",
    "file": "mempalace/tests/test_cli.py",
    "line": 502,
    "callers": [],
    "callees": [
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "Namespace",
        "file": "",
        "line": 494
      },
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "_mock_backend_for",
        "file": "mempalace/tests/test_cli.py",
        "line": 415
      },
      {
        "name": "cmd_repair",
        "file": "mempalace/mempalace/cli.py",
        "line": 263
      }
    ],
    "impact": []
  },
  {
    "id": "g119",
    "symbol": "tool_follow_tunnels",
    "file": "mempalace/mempalace/mcp_server.py",
    "line": 591,
    "callers": [],
    "callees": [
      {
        "name": "sanitize_name",
        "file": "mempalace/mempalace/config.py",
        "line": 22
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "_get_collection",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 214
      },
      {
        "name": "follow_tunnels",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 409
      }
    ],
    "impact": []
  },
  {
    "id": "g120",
    "symbol": "quarantine_stale_hnsw",
    "file": "mempalace/mempalace/backends/chroma.py",
    "line": 52,
    "callers": [
      {
        "name": "test_quarantine_stale_hnsw_renames_drifted_segment",
        "file": "mempalace/tests/test_backends.py",
        "line": 399
      },
      {
        "name": "test_quarantine_stale_hnsw_leaves_fresh_segment_alone",
        "file": "mempalace/tests/test_backends.py",
        "line": 414
      },
      {
        "name": "test_quarantine_stale_hnsw_no_palace",
        "file": "mempalace/tests/test_backends.py",
        "line": 423
      },
      {
        "name": "test_quarantine_stale_hnsw_skips_already_quarantined",
        "file": "mempalace/tests/test_backends.py",
        "line": 431
      }
    ],
    "callees": [
      {
        "name": "join",
        "file": "",
        "line": 127
      },
      {
        "name": "isfile",
        "file": "",
        "line": 42
      },
      {
        "name": "getmtime",
        "file": "",
        "line": 51
      },
      {
        "name": "listdir",
        "file": "",
        "line": 888
      },
      {
        "name": "listdir",
        "file": "",
        "line": 890
      },
      {
        "name": "listdir",
        "file": "",
        "line": 892
      },
      {
        "name": "startswith",
        "file": "",
        "line": 594
      },
      {
        "name": "isdir",
        "file": "",
        "line": 43
      },
      {
        "name": "strftime",
        "file": "",
        "line": 86
      },
      {
        "name": "now",
        "file": "",
        "line": 288
      },
      {
        "name": "rename",
        "file": "",
        "line": 1257
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "warning",
        "file": "",
        "line": 149
      },
      {
        "name": "exception",
        "file": "",
        "line": 177
      }
    ],
    "impact": [
      {
        "name": "test_quarantine_stale_hnsw_leaves_fresh_segment_alone",
        "file": "mempalace/tests/test_backends.py",
        "line": 414
      },
      {
        "name": "test_quarantine_stale_hnsw_skips_already_quarantined",
        "file": "mempalace/tests/test_backends.py",
        "line": 431
      },
      {
        "name": "test_quarantine_stale_hnsw_no_palace",
        "file": "mempalace/tests/test_backends.py",
        "line": 423
      },
      {
        "name": "test_quarantine_stale_hnsw_renames_drifted_segment",
        "file": "mempalace/tests/test_backends.py",
        "line": 399
      }
    ]
  },
  {
    "id": "g121",
    "symbol": "find_session_boundaries",
    "file": "mempalace/mempalace/split_mega_files.py",
    "line": 92,
    "callers": [
      {
        "name": "split_file",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 179
      },
      {
        "name": "main",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 234
      },
      {
        "name": "test_find_session_boundaries_two_sessions",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 129
      },
      {
        "name": "test_find_session_boundaries_none",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 150
      },
      {
        "name": "test_find_session_boundaries_context_restore_skipped",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 155
      }
    ],
    "callees": [
      {
        "name": "enumerate",
        "file": "",
        "line": 1321
      },
      {
        "name": "is_true_session_start",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 83
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      }
    ],
    "impact": [
      {
        "name": "split_file",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 179
      },
      {
        "name": "test_split_file_dry_run",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 257
      },
      {
        "name": "test_find_session_boundaries_context_restore_skipped",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 155
      },
      {
        "name": "test_find_session_boundaries_none",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 150
      },
      {
        "name": "(module) split_mega_files.py",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 1
      },
      {
        "name": "test_split_file_tiny_fragments_skipped",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 284
      },
      {
        "name": "test_split_file_not_mega",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 267
      },
      {
        "name": "test_split_file_output_dir_none",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 275
      },
      {
        "name": "test_split_file_creates_output",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 247
      },
      {
        "name": "test_find_session_boundaries_two_sessions",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 129
      },
      {
        "name": "main",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 234
      }
    ]
  },
  {
    "id": "g122",
    "symbol": "test_conforming_adapter_instantiates_and_yields_typed_records",
    "file": "mempalace/tests/test_sources.py",
    "line": 82,
    "callers": [],
    "callees": [
      {
        "name": "_TrivialAdapter",
        "file": "mempalace/tests/test_sources.py",
        "line": 41
      },
      {
        "name": "list",
        "file": "",
        "line": 1120
      },
      {
        "name": "ingest",
        "file": "mempalace/tests/test_sources.py",
        "line": 49
      },
      {
        "name": "SourceRef",
        "file": "mempalace/mempalace/sources/base.py",
        "line": 69
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "isinstance",
        "file": "",
        "line": 1564
      }
    ],
    "impact": []
  },
  {
    "id": "g123",
    "symbol": "seeded_collection",
    "file": "mempalace/tests/conftest.py",
    "line": 111,
    "callers": [],
    "callees": [],
    "impact": []
  },
  {
    "id": "g124",
    "symbol": "test_run_hook_dispatches_precompact",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 517,
    "callers": [],
    "callees": [
      {
        "name": "dumps",
        "file": "",
        "line": 10
      },
      {
        "name": "StringIO",
        "file": "",
        "line": 275
      },
      {
        "name": "run_hook",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 329
      },
      {
        "name": "assert_called_once_with",
        "file": "",
        "line": 183
      }
    ],
    "impact": []
  },
  {
    "id": "g125",
    "symbol": "test_print_entity_list_with_entities",
    "file": "mempalace/tests/test_entity_detector.py",
    "line": 272,
    "callers": [],
    "callees": [
      {
        "name": "_print_entity_list",
        "file": "mempalace/mempalace/entity_detector.py",
        "line": 442
      }
    ],
    "impact": []
  },
  {
    "id": "g126",
    "symbol": "test_sanitize_name_cjk",
    "file": "mempalace/tests/test_config.py",
    "line": 48,
    "callers": [],
    "callees": [
      {
        "name": "sanitize_name",
        "file": "mempalace/mempalace/config.py",
        "line": 22
      }
    ],
    "impact": []
  },
  {
    "id": "g127",
    "symbol": "llm_rerank_locomo",
    "file": "mempalace/benchmarks/locomo_bench.py",
    "line": 512,
    "callers": [
      {
        "name": "run_benchmark",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 621
      }
    ],
    "callees": [
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "enumerate",
        "file": "",
        "line": 1321
      },
      {
        "name": "zip",
        "file": "",
        "line": 1943
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "rstrip",
        "file": "",
        "line": 583
      },
      {
        "name": "rstrip",
        "file": "",
        "line": 585
      },
      {
        "name": "encode",
        "file": "",
        "line": 498
      },
      {
        "name": "dumps",
        "file": "",
        "line": 10
      },
      {
        "name": "Request",
        "file": "",
        "line": 120
      },
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "urlopen",
        "file": "",
        "line": 63
      },
      {
        "name": "loads",
        "file": "",
        "line": 39
      },
      {
        "name": "strip",
        "file": "",
        "line": 598
      },
      {
        "name": "strip",
        "file": "",
        "line": 600
      },
      {
        "name": "search",
        "file": "",
        "line": 257
      },
      {
        "name": "search",
        "file": "",
        "line": 259
      },
      {
        "name": "int",
        "file": "",
        "line": 255
      },
      {
        "name": "group",
        "file": "",
        "line": 89
      },
      {
        "name": "group",
        "file": "",
        "line": 91
      },
      {
        "name": "group",
        "file": "",
        "line": 93
      },
      {
        "name": "sleep",
        "file": "",
        "line": 82
      }
    ],
    "impact": [
      {
        "name": "run_benchmark",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 621
      },
      {
        "name": "(module) locomo_bench.py",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 1
      }
    ]
  },
  {
    "id": "g128",
    "symbol": "_temp_locale",
    "file": "mempalace/tests/test_entity_detector.py",
    "line": 390,
    "callers": [
      {
        "name": "test_extract_candidates_with_extra_locale_picks_up_new_charset",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 442
      },
      {
        "name": "test_extract_candidates_with_cyrillic_locale",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 460
      },
      {
        "name": "test_score_entity_unions_person_verbs_across_languages",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 477
      },
      {
        "name": "test_build_patterns_cache_is_keyed_by_language",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 522
      },
      {
        "name": "test_devanagari_candidate_extraction_with_boundary_chars",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 617
      },
      {
        "name": "test_devanagari_candidate_without_boundary_chars_truncates",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 626
      },
      {
        "name": "test_devanagari_person_verb_fires_with_boundary_chars",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 637
      },
      {
        "name": "test_devanagari_person_verb_silent_without_boundary_chars",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 647
      }
    ],
    "callees": [
      {
        "name": "parent",
        "file": "",
        "line": 138
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      },
      {
        "name": "exists",
        "file": "",
        "line": 199
      },
      {
        "name": "RuntimeError",
        "file": "",
        "line": 2145
      },
      {
        "name": "write_text",
        "file": "",
        "line": 341
      },
      {
        "name": "dumps",
        "file": "",
        "line": 10
      },
      {
        "name": "clear",
        "file": "",
        "line": 802
      },
      {
        "name": "cache_clear",
        "file": "",
        "line": 61
      },
      {
        "name": "_clear_caches",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 418
      },
      {
        "name": "unlink",
        "file": "",
        "line": 332
      }
    ],
    "impact": [
      {
        "name": "test_devanagari_candidate_without_boundary_chars_truncates",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 626
      },
      {
        "name": "test_devanagari_candidate_extraction_with_boundary_chars",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 617
      },
      {
        "name": "test_devanagari_person_verb_silent_without_boundary_chars",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 647
      },
      {
        "name": "test_extract_candidates_with_extra_locale_picks_up_new_charset",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 442
      },
      {
        "name": "test_build_patterns_cache_is_keyed_by_language",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 522
      },
      {
        "name": "test_extract_candidates_with_cyrillic_locale",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 460
      },
      {
        "name": "test_devanagari_person_verb_fires_with_boundary_chars",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 637
      },
      {
        "name": "test_score_entity_unions_person_verbs_across_languages",
        "file": "mempalace/tests/test_entity_detector.py",
        "line": 477
      }
    ]
  },
  {
    "id": "g129",
    "symbol": "test_get_system_words_returns_set",
    "file": "mempalace/tests/test_spellcheck.py",
    "line": 83,
    "callers": [],
    "callees": [
      {
        "name": "_get_system_words",
        "file": "mempalace/mempalace/spellcheck.py",
        "line": 49
      },
      {
        "name": "isinstance",
        "file": "",
        "line": 1564
      }
    ],
    "impact": []
  },
  {
    "id": "g130",
    "symbol": "test_raw_indexing_still_raises_to_document_the_bug",
    "file": "mempalace/tests/test_empty_chromadb_results.py",
    "line": 43,
    "callers": [],
    "callees": [],
    "impact": []
  },
  {
    "id": "g131",
    "symbol": "_safe_path_component",
    "file": "mempalace/mempalace/exporter.py",
    "line": 22,
    "callers": [
      {
        "name": "export_palace",
        "file": "mempalace/mempalace/exporter.py",
        "line": 29
      }
    ],
    "callees": [
      {
        "name": "sub",
        "file": "",
        "line": 283
      },
      {
        "name": "sub",
        "file": "",
        "line": 287
      },
      {
        "name": "strip",
        "file": "",
        "line": 598
      },
      {
        "name": "strip",
        "file": "",
        "line": 600
      }
    ],
    "impact": [
      {
        "name": "test_export_creates_structure",
        "file": "mempalace/tests/test_exporter.py",
        "line": 58
      },
      {
        "name": "export_palace",
        "file": "mempalace/mempalace/exporter.py",
        "line": 29
      },
      {
        "name": "test_export_empty_palace",
        "file": "mempalace/tests/test_exporter.py",
        "line": 126
      },
      {
        "name": "test_export_index_content",
        "file": "mempalace/tests/test_exporter.py",
        "line": 107
      },
      {
        "name": "test_export_markdown_content",
        "file": "mempalace/tests/test_exporter.py",
        "line": 84
      }
    ]
  },
  {
    "id": "g132",
    "symbol": "utf8_replace_invalid",
    "file": "mempalace/mempalace/sources/transforms.py",
    "line": 47,
    "callers": [
      {
        "name": "test_utf8_replace_invalid_handles_bad_bytes",
        "file": "mempalace/tests/test_sources.py",
        "line": 137
      }
    ],
    "callees": [
      {
        "name": "decode",
        "file": "",
        "line": 677
      }
    ],
    "impact": [
      {
        "name": "test_utf8_replace_invalid_handles_bad_bytes",
        "file": "mempalace/tests/test_sources.py",
        "line": 137
      }
    ]
  },
  {
    "id": "g133",
    "symbol": "_try_codex_jsonl",
    "file": "mempalace/mempalace/normalize.py",
    "line": 235,
    "callers": [
      {
        "name": "_try_normalize_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 149
      },
      {
        "name": "test_codex_jsonl_valid",
        "file": "mempalace/tests/test_normalize.py",
        "line": 387
      },
      {
        "name": "test_codex_jsonl_no_session_meta",
        "file": "mempalace/tests/test_normalize.py",
        "line": 398
      },
      {
        "name": "test_codex_jsonl_skips_non_event_msg",
        "file": "mempalace/tests/test_normalize.py",
        "line": 408
      },
      {
        "name": "test_codex_jsonl_non_string_message",
        "file": "mempalace/tests/test_normalize.py",
        "line": 420
      },
      {
        "name": "test_codex_jsonl_empty_text_skipped",
        "file": "mempalace/tests/test_normalize.py",
        "line": 431
      },
      {
        "name": "test_codex_jsonl_payload_not_dict",
        "file": "mempalace/tests/test_normalize.py",
        "line": 442
      }
    ],
    "callees": [
      {
        "name": "strip",
        "file": "",
        "line": 598
      },
      {
        "name": "strip",
        "file": "",
        "line": 600
      },
      {
        "name": "split",
        "file": "",
        "line": 587
      },
      {
        "name": "split",
        "file": "",
        "line": 589
      },
      {
        "name": "loads",
        "file": "",
        "line": 39
      },
      {
        "name": "isinstance",
        "file": "",
        "line": 1564
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "_messages_to_transcript",
        "file": "mempalace/mempalace/normalize.py",
        "line": 559
      }
    ],
    "impact": [
      {
        "name": "test_try_normalize_json_valid_but_unknown_schema",
        "file": "mempalace/tests/test_normalize.py",
        "line": 863
      },
      {
        "name": "test_codex_jsonl_no_session_meta",
        "file": "mempalace/tests/test_normalize.py",
        "line": 398
      },
      {
        "name": "test_codex_jsonl_skips_non_event_msg",
        "file": "mempalace/tests/test_normalize.py",
        "line": 408
      },
      {
        "name": "normalize",
        "file": "mempalace/mempalace/normalize.py",
        "line": 112
      },
      {
        "name": "test_try_normalize_json_invalid_json",
        "file": "mempalace/tests/test_normalize.py",
        "line": 858
      },
      {
        "name": "test_codex_jsonl_non_string_message",
        "file": "mempalace/tests/test_normalize.py",
        "line": 420
      },
      {
        "name": "_try_normalize_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 149
      },
      {
        "name": "test_codex_jsonl_empty_text_skipped",
        "file": "mempalace/tests/test_normalize.py",
        "line": 431
      },
      {
        "name": "test_codex_jsonl_payload_not_dict",
        "file": "mempalace/tests/test_normalize.py",
        "line": 442
      },
      {
        "name": "test_codex_jsonl_valid",
        "file": "mempalace/tests/test_normalize.py",
        "line": 387
      }
    ]
  },
  {
    "id": "g134",
    "symbol": "test_classify_entity_mixed_signals",
    "file": "mempalace/tests/test_entity_detector.py",
    "line": 151,
    "callers": [],
    "callees": [
      {
        "name": "classify_entity",
        "file": "mempalace/mempalace/entity_detector.py",
        "line": 294
      }
    ],
    "impact": []
  },
  {
    "id": "g135",
    "symbol": "test_codex_jsonl_skips_non_event_msg",
    "file": "mempalace/tests/test_normalize.py",
    "line": 408,
    "callers": [],
    "callees": [
      {
        "name": "dumps",
        "file": "",
        "line": 10
      },
      {
        "name": "_try_codex_jsonl",
        "file": "mempalace/mempalace/normalize.py",
        "line": 235
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "split",
        "file": "",
        "line": 587
      },
      {
        "name": "split",
        "file": "",
        "line": 589
      }
    ],
    "impact": []
  },
  {
    "id": "g136",
    "symbol": "process_file",
    "file": "mempalace/mempalace/miner.py",
    "line": 585,
    "callers": [
      {
        "name": "mine",
        "file": "mempalace/mempalace/miner.py",
        "line": 753
      }
    ],
    "callees": [
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "file_already_mined",
        "file": "mempalace/mempalace/palace.py",
        "line": 313
      },
      {
        "name": "read_text",
        "file": "",
        "line": 178
      },
      {
        "name": "strip",
        "file": "",
        "line": 598
      },
      {
        "name": "strip",
        "file": "",
        "line": 600
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "detect_room",
        "file": "mempalace/mempalace/miner.py",
        "line": 310
      },
      {
        "name": "chunk_text",
        "file": "mempalace/mempalace/miner.py",
        "line": 357
      },
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      },
      {
        "name": "name",
        "file": "",
        "line": 70
      },
      {
        "name": "mine_lock",
        "file": "mempalace/mempalace/palace.py",
        "line": 275
      },
      {
        "name": "add_drawer",
        "file": "mempalace/mempalace/miner.py",
        "line": 544
      },
      {
        "name": "hexdigest",
        "file": "",
        "line": 35
      },
      {
        "name": "sha256",
        "file": "",
        "line": 78
      },
      {
        "name": "encode",
        "file": "",
        "line": 498
      },
      {
        "name": "build_closet_lines",
        "file": "mempalace/mempalace/palace.py",
        "line": 163
      },
      {
        "name": "_extract_entities_for_metadata",
        "file": "mempalace/mempalace/miner.py",
        "line": 501
      },
      {
        "name": "isoformat",
        "file": "",
        "line": 329
      },
      {
        "name": "now",
        "file": "",
        "line": 288
      },
      {
        "name": "purge_file_closets",
        "file": "mempalace/mempalace/palace.py",
        "line": 221
      },
      {
        "name": "upsert_closet_lines",
        "file": "mempalace/mempalace/palace.py",
        "line": 234
      }
    ],
    "impact": [
      {
        "name": "test_mine_files_per_second",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 40
      },
      {
        "name": "_setup_palace",
        "file": "mempalace/tests/test_exporter.py",
        "line": 17
      },
      {
        "name": "test_remine_replaces_closets_completely",
        "file": "mempalace/tests/test_closets.py",
        "line": 284
      },
      {
        "name": "test_mine_dry_run_with_tiny_file_no_crash",
        "file": "mempalace/tests/test_miner.py",
        "line": 310
      },
      {
        "name": "test_mine_peak_rss",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 66
      },
      {
        "name": "mine",
        "file": "mempalace/mempalace/miner.py",
        "line": 753
      },
      {
        "name": "cmd_mine",
        "file": "mempalace/mempalace/cli.py",
        "line": 116
      },
      {
        "name": "test_mined_drawers_have_hall",
        "file": "mempalace/tests/test_hall_detection.py",
        "line": 152
      },
      {
        "name": "test_skip_check_cost",
        "file": "mempalace/tests/benchmarks/test_ingest_bench.py",
        "line": 138
      },
      {
        "name": "test_project_mining",
        "file": "mempalace/tests/test_miner.py",
        "line": 23
      }
    ]
  },
  {
    "id": "g137",
    "symbol": "test_stop_hook_rejects_injected_stop_hook_active",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 605,
    "callers": [],
    "callees": [
      {
        "name": "_write_transcript",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 48
      },
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "_capture_hook_output",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 115
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g138",
    "symbol": "_drawer_id_for_message",
    "file": "mempalace/mempalace/sweeper.py",
    "line": 183,
    "callers": [
      {
        "name": "sweep",
        "file": "mempalace/mempalace/sweeper.py",
        "line": 193
      },
      {
        "name": "test_sweep_recovers_untaken_message_at_cursor_timestamp",
        "file": "mempalace/tests/test_sweeper.py",
        "line": 228
      }
    ],
    "callees": [],
    "impact": [
      {
        "name": "sweep_directory",
        "file": "mempalace/mempalace/sweeper.py",
        "line": 302
      },
      {
        "name": "test_sweep_recovers_untaken_message_at_cursor_timestamp",
        "file": "mempalace/tests/test_sweeper.py",
        "line": 228
      },
      {
        "name": "test_sweep_resumes_from_cursor",
        "file": "mempalace/tests/test_sweeper.py",
        "line": 172
      },
      {
        "name": "test_sweep_is_idempotent",
        "file": "mempalace/tests/test_sweeper.py",
        "line": 158
      },
      {
        "name": "test_sweep_empty_palace_ingests_all_messages",
        "file": "mempalace/tests/test_sweeper.py",
        "line": 148
      },
      {
        "name": "test_drawer_has_session_id_and_timestamp_metadata",
        "file": "mempalace/tests/test_sweeper.py",
        "line": 299
      },
      {
        "name": "sweep",
        "file": "mempalace/mempalace/sweeper.py",
        "line": 193
      },
      {
        "name": "cmd_sweep",
        "file": "mempalace/mempalace/cli.py",
        "line": 149
      }
    ]
  },
  {
    "id": "g139",
    "symbol": "_first_or_empty",
    "file": "mempalace/mempalace/searcher.py",
    "line": 33,
    "callers": [
      {
        "name": "search",
        "file": "mempalace/mempalace/layers.py",
        "line": 253
      },
      {
        "name": "search_raw",
        "file": "mempalace/mempalace/layers.py",
        "line": 302
      },
      {
        "name": "search",
        "file": "mempalace/mempalace/searcher.py",
        "line": 239
      },
      {
        "name": "search_memories",
        "file": "mempalace/mempalace/searcher.py",
        "line": 304
      },
      {
        "name": "test_first_or_empty_handles_empty_outer_list",
        "file": "mempalace/tests/test_empty_chromadb_results.py",
        "line": 15
      },
      {
        "name": "test_first_or_empty_handles_outer_with_empty_inner",
        "file": "mempalace/tests/test_empty_chromadb_results.py",
        "line": 23
      },
      {
        "name": "test_first_or_empty_handles_missing_key",
        "file": "mempalace/tests/test_empty_chromadb_results.py",
        "line": 29
      },
      {
        "name": "test_first_or_empty_handles_none_inner",
        "file": "mempalace/tests/test_empty_chromadb_results.py",
        "line": 33
      },
      {
        "name": "test_first_or_empty_returns_inner_list_for_normal_result",
        "file": "mempalace/tests/test_empty_chromadb_results.py",
        "line": 38
      }
    ],
    "callees": [
      {
        "name": "getattr",
        "file": "",
        "line": 1522
      },
      {
        "name": "getattr",
        "file": "",
        "line": 1528
      },
      {
        "name": "getattr",
        "file": "",
        "line": 1530
      },
      {
        "name": "getattr",
        "file": "",
        "line": 1532
      },
      {
        "name": "getattr",
        "file": "",
        "line": 1534
      },
      {
        "name": "getattr",
        "file": "",
        "line": 1536
      },
      {
        "name": "isinstance",
        "file": "",
        "line": 1564
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      }
    ],
    "impact": [
      {
        "name": "test_layer3_search_raw_returns_dicts",
        "file": "mempalace/tests/test_layers.py",
        "line": 498
      },
      {
        "name": "test_search_with_wing_and_room",
        "file": "mempalace/tests/test_searcher.py",
        "line": 143
      },
      {
        "name": "search_raw",
        "file": "mempalace/mempalace/layers.py",
        "line": 302
      },
      {
        "name": "test_first_or_empty_handles_empty_outer_list",
        "file": "mempalace/tests/test_empty_chromadb_results.py",
        "line": 15
      },
      {
        "name": "test_single_room_recall",
        "file": "mempalace/tests/benchmarks/test_recall_threshold.py",
        "line": 114
      },
      {
        "name": "test_first_or_empty_returns_inner_list_for_normal_result",
        "file": "mempalace/tests/test_empty_chromadb_results.py",
        "line": 38
      },
      {
        "name": "test_layer3_search_truncates_long_docs",
        "file": "mempalace/tests/test_layers.py",
        "line": 480
      },
      {
        "name": "test_search_with_room_filter",
        "file": "mempalace/tests/test_searcher.py",
        "line": 138
      },
      {
        "name": "test_wing_filter",
        "file": "mempalace/tests/test_searcher.py",
        "line": 25
      },
      {
        "name": "test_first_or_empty_handles_outer_with_empty_inner",
        "file": "mempalace/tests/test_empty_chromadb_results.py",
        "line": 23
      },
      {
        "name": "tool_search",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 428
      },
      {
        "name": "test_search_prints_results",
        "file": "mempalace/tests/test_searcher.py",
        "line": 128
      },
      {
        "name": "search",
        "file": "mempalace/mempalace/layers.py",
        "line": 402
      },
      {
        "name": "test_layer3_search_with_room_filter",
        "file": "mempalace/tests/test_layers.py",
        "line": 428
      },
      {
        "name": "test_search_heap_top_allocators",
        "file": "mempalace/tests/benchmarks/test_memory_profile.py",
        "line": 151
      },
      {
        "name": "test_layer3_search_error",
        "file": "mempalace/tests/test_layers.py",
        "line": 466
      },
      {
        "name": "run_search",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 184
      },
      {
        "name": "test_created_at_contains_filed_at",
        "file": "mempalace/tests/test_searcher.py",
        "line": 56
      },
      {
        "name": "test_search_handles_none_metadata_without_crash",
        "file": "mempalace/tests/test_searcher.py",
        "line": 176
      },
      {
        "name": "test_drawer_only_hits_have_no_closet_preview",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 124
      },
      {
        "name": "test_search_latency_curve",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 24
      },
      {
        "name": "test_first_or_empty_handles_none_inner",
        "file": "mempalace/tests/test_empty_chromadb_results.py",
        "line": 33
      },
      {
        "name": "test_layer3_search_with_results",
        "file": "mempalace/tests/test_layers.py",
        "line": 375
      },
      {
        "name": "test_layer3_search_raw_with_filters",
        "file": "mempalace/tests/test_layers.py",
        "line": 520
      },
      {
        "name": "test_search_no_palace_raises",
        "file": "mempalace/tests/test_searcher.py",
        "line": 149
      },
      {
        "name": "test_weak_closets_do_not_hide_direct_drawer_hits",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 68
      },
      {
        "name": "test_search_with_wing_filter",
        "file": "mempalace/tests/test_searcher.py",
        "line": 133
      },
      {
        "name": "test_wing_and_room_filter",
        "file": "mempalace/tests/test_searcher.py",
        "line": 33
      },
      {
        "name": "test_basic_search",
        "file": "mempalace/tests/test_searcher.py",
        "line": 19
      },
      {
        "name": "test_room_filter",
        "file": "mempalace/tests/test_searcher.py",
        "line": 29
      },
      {
        "name": "test_search_rss_growth",
        "file": "mempalace/tests/benchmarks/test_memory_profile.py",
        "line": 38
      },
      {
        "name": "test_recall_at_k",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 65
      },
      {
        "name": "test_result_fields",
        "file": "mempalace/tests/test_searcher.py",
        "line": 45
      },
      {
        "name": "test_palace_boost_recall",
        "file": "mempalace/tests/benchmarks/test_palace_boost.py",
        "line": 24
      },
      {
        "name": "test_first_or_empty_handles_missing_key",
        "file": "mempalace/tests/test_empty_chromadb_results.py",
        "line": 29
      },
      {
        "name": "test_boost_scaling",
        "file": "mempalace/tests/benchmarks/test_palace_boost.py",
        "line": 138
      },
      {
        "name": "test_layer3_search_raw_no_palace",
        "file": "mempalace/tests/test_layers.py",
        "line": 367
      },
      {
        "name": "test_layer3_search_no_results",
        "file": "mempalace/tests/test_layers.py",
        "line": 395
      },
      {
        "name": "test_search_memories_handles_none_metadata",
        "file": "mempalace/tests/test_searcher.py",
        "line": 92
      },
      {
        "name": "test_closet_boost_lifts_matching_drawer",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 87
      },
      {
        "name": "test_closet_preview_exposed_when_boosted",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 110
      },
      {
        "name": "test_search_memories_query_error",
        "file": "mempalace/tests/test_searcher.py",
        "line": 77
      },
      {
        "name": "test_search_memories_filters_in_result",
        "file": "mempalace/tests/test_searcher.py",
        "line": 87
      },
      {
        "name": "test_created_at_fallback_when_filed_at_missing",
        "file": "mempalace/tests/test_searcher.py",
        "line": 62
      },
      {
        "name": "test_filter_speedup",
        "file": "mempalace/tests/benchmarks/test_palace_boost.py",
        "line": 84
      },
      {
        "name": "test_hybrid_search_enrichment_populates_drawer_index_and_total",
        "file": "mempalace/tests/test_closets.py",
        "line": 934
      },
      {
        "name": "test_layer3_search_with_wing_filter",
        "file": "mempalace/tests/test_layers.py",
        "line": 409
      },
      {
        "name": "cmd_search",
        "file": "mempalace/mempalace/cli.py",
        "line": 191
      },
      {
        "name": "test_search_query_error_raises",
        "file": "mempalace/tests/test_searcher.py",
        "line": 161
      },
      {
        "name": "test_single_room_no_filter_recall",
        "file": "mempalace/tests/benchmarks/test_recall_threshold.py",
        "line": 154
      },
      {
        "name": "test_n_results_latency",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 218
      },
      {
        "name": "test_layer3_search_raw_error",
        "file": "mempalace/tests/test_layers.py",
        "line": 539
      },
      {
        "name": "test_no_closets_degrades_to_direct_drawer_search",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 59
      },
      {
        "name": "search",
        "file": "mempalace/mempalace/layers.py",
        "line": 253
      },
      {
        "name": "test_no_palace_returns_error",
        "file": "mempalace/tests/test_searcher.py",
        "line": 41
      },
      {
        "name": "search_memories",
        "file": "mempalace/mempalace/searcher.py",
        "line": 304
      },
      {
        "name": "test_filter_impact",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 106
      },
      {
        "name": "test_max_distance_filters_hybrid_hits",
        "file": "mempalace/tests/test_closets.py",
        "line": 385
      },
      {
        "name": "test_layer3_search_with_wing_and_room",
        "file": "mempalace/tests/test_layers.py",
        "line": 447
      },
      {
        "name": "test_search_no_results",
        "file": "mempalace/tests/test_searcher.py",
        "line": 153
      },
      {
        "name": "test_pure_drawer_when_no_closets",
        "file": "mempalace/tests/test_closets.py",
        "line": 352
      },
      {
        "name": "test_n_results_limit",
        "file": "mempalace/tests/test_searcher.py",
        "line": 37
      },
      {
        "name": "test_search_n_results",
        "file": "mempalace/tests/test_searcher.py",
        "line": 170
      },
      {
        "name": "test_layer3_no_palace",
        "file": "mempalace/tests/test_layers.py",
        "line": 359
      },
      {
        "name": "test_closet_boost_marks_hit_as_drawer_plus_closet",
        "file": "mempalace/tests/test_closets.py",
        "line": 362
      },
      {
        "name": "search",
        "file": "mempalace/mempalace/searcher.py",
        "line": 239
      }
    ]
  },
  {
    "id": "g140",
    "symbol": "test_cmd_hook_calls_run_hook",
    "file": "mempalace/tests/test_cli.py",
    "line": 95,
    "callers": [],
    "callees": [
      {
        "name": "Namespace",
        "file": "",
        "line": 494
      },
      {
        "name": "cmd_hook",
        "file": "mempalace/mempalace/cli.py",
        "line": 354
      },
      {
        "name": "assert_called_once_with",
        "file": "",
        "line": 183
      }
    ],
    "impact": []
  },
  {
    "id": "g141",
    "symbol": "_get_rss_mb",
    "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
    "line": 47,
    "callers": [
      {
        "name": "test_tool_status_rss_growth",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 75
      }
    ],
    "callees": [
      {
        "name": "memory_info",
        "file": "",
        "line": 193
      },
      {
        "name": "Process",
        "file": "",
        "line": 141
      },
      {
        "name": "ru_maxrss",
        "file": "",
        "line": 58
      },
      {
        "name": "getrusage",
        "file": "",
        "line": 88
      },
      {
        "name": "system",
        "file": "",
        "line": 68
      }
    ],
    "impact": [
      {
        "name": "test_tool_status_rss_growth",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 75
      }
    ]
  },
  {
    "id": "g142",
    "symbol": "test_config_bad_json",
    "file": "mempalace/tests/test_config_extra.py",
    "line": 9,
    "callers": [],
    "callees": [
      {
        "name": "MempalaceConfig",
        "file": "mempalace/mempalace/config.py",
        "line": 139
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "palace_path",
        "file": "mempalace/mempalace/config.py",
        "line": 167
      }
    ],
    "impact": []
  },
  {
    "id": "g143",
    "symbol": "test_count_empty_file",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 100,
    "callers": [],
    "callees": [
      {
        "name": "_count_human_messages",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 65
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g144",
    "symbol": "test_slack_json_attacker_first_message_attributed",
    "file": "mempalace/tests/test_normalize.py",
    "line": 830,
    "callers": [],
    "callees": [
      {
        "name": "_try_slack_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 373
      }
    ],
    "impact": []
  },
  {
    "id": "g145",
    "symbol": "test_slack_json_preserves_speaker_id",
    "file": "mempalace/tests/test_normalize.py",
    "line": 819,
    "callers": [],
    "callees": [
      {
        "name": "_try_slack_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 373
      }
    ],
    "impact": []
  },
  {
    "id": "g146",
    "symbol": "follow_tunnels",
    "file": "mempalace/mempalace/palace_graph.py",
    "line": 409,
    "callers": [
      {
        "name": "tool_follow_tunnels",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 591
      },
      {
        "name": "test_follow_tunnels_returns_connected_endpoints",
        "file": "mempalace/tests/test_closets.py",
        "line": 728
      },
      {
        "name": "test_follow_tunnels_works_from_either_endpoint",
        "file": "mempalace/tests/test_closets.py",
        "line": 751
      },
      {
        "name": "test_follow_tunnels_returns_direction_and_preview",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 86
      },
      {
        "name": "test_follow_tunnels_returns_connections_even_if_collection_lookup_fails",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 118
      }
    ],
    "callees": [
      {
        "name": "_load_tunnels",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 252
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "dict",
        "file": "",
        "line": 1175
      },
      {
        "name": "zip",
        "file": "",
        "line": 1943
      }
    ],
    "impact": [
      {
        "name": "test_follow_tunnels_returns_connected_endpoints",
        "file": "mempalace/tests/test_closets.py",
        "line": 728
      },
      {
        "name": "test_follow_tunnels_works_from_either_endpoint",
        "file": "mempalace/tests/test_closets.py",
        "line": 751
      },
      {
        "name": "test_follow_tunnels_returns_direction_and_preview",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 86
      },
      {
        "name": "test_follow_tunnels_returns_connections_even_if_collection_lookup_fails",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 118
      },
      {
        "name": "tool_follow_tunnels",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 591
      }
    ]
  },
  {
    "id": "g147",
    "symbol": "test_layer2_retrieve_no_filter",
    "file": "mempalace/tests/test_layers.py",
    "line": 301,
    "callers": [],
    "callees": [
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "Layer2",
        "file": "mempalace/mempalace/layers.py",
        "line": 185
      },
      {
        "name": "retrieve",
        "file": "mempalace/mempalace/layers.py",
        "line": 196
      }
    ],
    "impact": []
  },
  {
    "id": "g148",
    "symbol": "test_layer3_search_error",
    "file": "mempalace/tests/test_layers.py",
    "line": 466,
    "callers": [],
    "callees": [
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "RuntimeError",
        "file": "",
        "line": 2145
      },
      {
        "name": "Layer3",
        "file": "mempalace/mempalace/layers.py",
        "line": 243
      },
      {
        "name": "search",
        "file": "mempalace/mempalace/layers.py",
        "line": 253
      }
    ],
    "impact": []
  },
  {
    "id": "g149",
    "symbol": "test_slack_json_sanitizes_speaker_id",
    "file": "mempalace/tests/test_normalize.py",
    "line": 842,
    "callers": [],
    "callees": [
      {
        "name": "_try_slack_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 373
      }
    ],
    "impact": []
  },
  {
    "id": "g150",
    "symbol": "test_sanitize_name_rejects_empty",
    "file": "mempalace/tests/test_config.py",
    "line": 66,
    "callers": [],
    "callees": [
      {
        "name": "sanitize_name",
        "file": "mempalace/mempalace/config.py",
        "line": 22
      }
    ],
    "impact": []
  },
  {
    "id": "g151",
    "symbol": "detect_chromadb_version",
    "file": "mempalace/mempalace/migrate.py",
    "line": 91,
    "callers": [
      {
        "name": "migrate",
        "file": "mempalace/mempalace/migrate.py",
        "line": 137
      }
    ],
    "callees": [
      {
        "name": "connect",
        "file": "",
        "line": 250
      },
      {
        "name": "fetchall",
        "file": "",
        "line": 428
      },
      {
        "name": "execute",
        "file": "",
        "line": 363
      },
      {
        "name": "close",
        "file": "",
        "line": 332
      }
    ],
    "impact": [
      {
        "name": "migrate",
        "file": "mempalace/mempalace/migrate.py",
        "line": 137
      },
      {
        "name": "test_migrate_requires_palace_database",
        "file": "mempalace/tests/test_migrate.py",
        "line": 9
      },
      {
        "name": "test_migrate_aborts_without_confirmation",
        "file": "mempalace/tests/test_migrate.py",
        "line": 20
      },
      {
        "name": "cmd_migrate",
        "file": "mempalace/mempalace/cli.py",
        "line": 244
      }
    ]
  },
  {
    "id": "g152",
    "symbol": "test_score_entity_dialogue_markers",
    "file": "mempalace/tests/test_entity_detector.py",
    "line": 78,
    "callers": [],
    "callees": [
      {
        "name": "splitlines",
        "file": "",
        "line": 591
      },
      {
        "name": "splitlines",
        "file": "",
        "line": 593
      },
      {
        "name": "score_entity",
        "file": "mempalace/mempalace/entity_detector.py",
        "line": 215
      }
    ],
    "impact": []
  },
  {
    "id": "g153",
    "symbol": "test_stop_hook_passthrough_below_interval",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 150,
    "callers": [],
    "callees": [
      {
        "name": "_write_transcript",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 48
      },
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "_capture_hook_output",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 115
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g154",
    "symbol": "test_score_entity_no_signals",
    "file": "mempalace/tests/test_entity_detector.py",
    "line": 92,
    "callers": [],
    "callees": [
      {
        "name": "splitlines",
        "file": "",
        "line": 591
      },
      {
        "name": "splitlines",
        "file": "",
        "line": 593
      },
      {
        "name": "score_entity",
        "file": "mempalace/mempalace/entity_detector.py",
        "line": 215
      }
    ],
    "impact": []
  },
  {
    "id": "g155",
    "symbol": "_populate_single_room",
    "file": "mempalace/tests/benchmarks/test_recall_threshold.py",
    "line": 47,
    "callers": [
      {
        "name": "test_single_room_recall",
        "file": "mempalace/tests/benchmarks/test_recall_threshold.py",
        "line": 114
      },
      {
        "name": "test_single_room_no_filter_recall",
        "file": "mempalace/tests/benchmarks/test_recall_threshold.py",
        "line": 154
      }
    ],
    "callees": [
      {
        "name": "PalaceDataGenerator",
        "file": "mempalace/tests/benchmarks/data_generator.py",
        "line": 234
      },
      {
        "name": "makedirs",
        "file": "",
        "line": 1245
      },
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "hexdigest",
        "file": "",
        "line": 35
      },
      {
        "name": "md5",
        "file": "",
        "line": 69
      },
      {
        "name": "encode",
        "file": "",
        "line": 498
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "isoformat",
        "file": "",
        "line": 329
      },
      {
        "name": "now",
        "file": "",
        "line": 288
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "_random_text",
        "file": "mempalace/tests/benchmarks/data_generator.py",
        "line": 295
      }
    ],
    "impact": [
      {
        "name": "test_single_room_recall",
        "file": "mempalace/tests/benchmarks/test_recall_threshold.py",
        "line": 114
      },
      {
        "name": "test_single_room_no_filter_recall",
        "file": "mempalace/tests/benchmarks/test_recall_threshold.py",
        "line": 154
      }
    ]
  },
  {
    "id": "g156",
    "symbol": "test_layer0_default_path",
    "file": "mempalace/tests/test_layers.py",
    "line": 64,
    "callers": [],
    "callees": [
      {
        "name": "Layer0",
        "file": "mempalace/mempalace/layers.py",
        "line": 34
      },
      {
        "name": "expanduser",
        "file": "",
        "line": 99
      }
    ],
    "impact": []
  },
  {
    "id": "g157",
    "symbol": "test_base_adapter_is_abstract_without_required_methods",
    "file": "mempalace/tests/test_sources.py",
    "line": 73,
    "callers": [],
    "callees": [
      {
        "name": "Incomplete",
        "file": "mempalace/tests/test_sources.py",
        "line": 76
      }
    ],
    "impact": []
  },
  {
    "id": "g158",
    "symbol": "spellcheck_transcript_line",
    "file": "mempalace/mempalace/spellcheck.py",
    "line": 215,
    "callers": [
      {
        "name": "spellcheck_transcript",
        "file": "mempalace/mempalace/spellcheck.py",
        "line": 235
      },
      {
        "name": "test_transcript_line_user_turn",
        "file": "mempalace/tests/test_spellcheck.py",
        "line": 130
      },
      {
        "name": "test_transcript_line_assistant_turn",
        "file": "mempalace/tests/test_spellcheck.py",
        "line": 137
      },
      {
        "name": "test_transcript_line_empty_user_turn",
        "file": "mempalace/tests/test_spellcheck.py",
        "line": 143
      }
    ],
    "callees": [
      {
        "name": "lstrip",
        "file": "",
        "line": 538
      },
      {
        "name": "lstrip",
        "file": "",
        "line": 540
      },
      {
        "name": "startswith",
        "file": "",
        "line": 594
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "strip",
        "file": "",
        "line": 598
      },
      {
        "name": "strip",
        "file": "",
        "line": 600
      },
      {
        "name": "spellcheck_user_text",
        "file": "mempalace/mempalace/spellcheck.py",
        "line": 161
      }
    ],
    "impact": [
      {
        "name": "test_transcript_line_user_turn",
        "file": "mempalace/tests/test_spellcheck.py",
        "line": 130
      },
      {
        "name": "spellcheck_transcript",
        "file": "mempalace/mempalace/spellcheck.py",
        "line": 235
      },
      {
        "name": "test_transcript_line_empty_user_turn",
        "file": "mempalace/tests/test_spellcheck.py",
        "line": 143
      },
      {
        "name": "test_transcript_line_assistant_turn",
        "file": "mempalace/tests/test_spellcheck.py",
        "line": 137
      },
      {
        "name": "test_spellcheck_transcript_processes_content",
        "file": "mempalace/tests/test_spellcheck.py",
        "line": 152
      }
    ]
  },
  {
    "id": "g159",
    "symbol": "regenerate_closets",
    "file": "mempalace/mempalace/closet_llm.py",
    "line": 194,
    "callers": [
      {
        "name": "(module) closet_llm.py",
        "file": "mempalace/mempalace/closet_llm.py",
        "line": 1
      },
      {
        "name": "test_missing_config_returns_error",
        "file": "mempalace/tests/test_closet_llm.py",
        "line": 208
      },
      {
        "name": "test_regen_purges_regex_closets_and_stamps_normalize_version",
        "file": "mempalace/tests/test_closet_llm.py",
        "line": 216
      },
      {
        "name": "test_regen_uses_basename_not_split_slash",
        "file": "mempalace/tests/test_closet_llm.py",
        "line": 299
      }
    ],
    "callees": [
      {
        "name": "LLMConfig",
        "file": "mempalace/mempalace/closet_llm.py",
        "line": 92
      },
      {
        "name": "missing",
        "file": "mempalace/mempalace/closet_llm.py",
        "line": 105
      },
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "get_collection",
        "file": "mempalace/mempalace/palace.py",
        "line": 53
      },
      {
        "name": "get_closets_collection",
        "file": "mempalace/mempalace/palace.py",
        "line": 66
      },
      {
        "name": "count",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 369
      },
      {
        "name": "get",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 307
      },
      {
        "name": "zip",
        "file": "",
        "line": 1943
      },
      {
        "name": "list",
        "file": "",
        "line": 1120
      },
      {
        "name": "keys",
        "file": "",
        "line": 1208
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "enumerate",
        "file": "",
        "line": 1321
      },
      {
        "name": "basename",
        "file": "",
        "line": 91
      },
      {
        "name": "_call_llm",
        "file": "mempalace/mempalace/closet_llm.py",
        "line": 115
      },
      {
        "name": "_parsed_to_closet_lines",
        "file": "mempalace/mempalace/closet_llm.py",
        "line": 178
      },
      {
        "name": "mine_lock",
        "file": "mempalace/mempalace/palace.py",
        "line": 275
      },
      {
        "name": "purge_file_closets",
        "file": "mempalace/mempalace/palace.py",
        "line": 221
      },
      {
        "name": "upsert_closet_lines",
        "file": "mempalace/mempalace/palace.py",
        "line": 234
      },
      {
        "name": "isoformat",
        "file": "",
        "line": 329
      },
      {
        "name": "now",
        "file": "",
        "line": 288
      }
    ],
    "impact": [
      {
        "name": "test_regen_uses_basename_not_split_slash",
        "file": "mempalace/tests/test_closet_llm.py",
        "line": 299
      },
      {
        "name": "(module) closet_llm.py",
        "file": "mempalace/mempalace/closet_llm.py",
        "line": 1
      },
      {
        "name": "test_regen_purges_regex_closets_and_stamps_normalize_version",
        "file": "mempalace/tests/test_closet_llm.py",
        "line": 216
      },
      {
        "name": "test_missing_config_returns_error",
        "file": "mempalace/tests/test_closet_llm.py",
        "line": 208
      }
    ]
  },
  {
    "id": "g160",
    "symbol": "test_source_summary_default_uses_adapter_name",
    "file": "mempalace/tests/test_sources.py",
    "line": 98,
    "callers": [],
    "callees": [
      {
        "name": "_TrivialAdapter",
        "file": "mempalace/tests/test_sources.py",
        "line": 41
      },
      {
        "name": "source_summary",
        "file": "mempalace/mempalace/sources/base.py",
        "line": 239
      },
      {
        "name": "SourceRef",
        "file": "mempalace/mempalace/sources/base.py",
        "line": 69
      },
      {
        "name": "isinstance",
        "file": "",
        "line": 1564
      }
    ],
    "impact": []
  },
  {
    "id": "g161",
    "symbol": "_get_collection",
    "file": "mempalace/mempalace/palace_graph.py",
    "line": 29,
    "callers": [
      {
        "name": "build_graph",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 41
      }
    ],
    "callees": [
      {
        "name": "MempalaceConfig",
        "file": "mempalace/mempalace/config.py",
        "line": 139
      },
      {
        "name": "_get_palace_collection",
        "file": "mempalace/mempalace/palace.py",
        "line": 53
      },
      {
        "name": "palace_path",
        "file": "mempalace/mempalace/config.py",
        "line": 167
      },
      {
        "name": "collection_name",
        "file": "mempalace/mempalace/config.py",
        "line": 175
      }
    ],
    "impact": [
      {
        "name": "test_falsy_collection",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 47
      },
      {
        "name": "test_empty_collection",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 41
      },
      {
        "name": "find_tunnels",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 169
      },
      {
        "name": "test_multi_wing_creates_edges",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 65
      },
      {
        "name": "test_missing_wing_excluded",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 98
      },
      {
        "name": "test_single_wing_no_edges",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 53
      },
      {
        "name": "test_dates_capped_at_five",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 107
      },
      {
        "name": "test_general_room_excluded",
        "file": "mempalace/tests/test_palace_graph.py",
        "line": 89
      },
      {
        "name": "graph_stats",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 201
      },
      {
        "name": "traverse",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 107
      },
      {
        "name": "build_graph",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 41
      }
    ]
  },
  {
    "id": "g162",
    "symbol": "test_idempotent_when_both_already_present",
    "file": "mempalace/tests/test_init_gitignore_protection.py",
    "line": 46,
    "callers": [],
    "callees": [
      {
        "name": "_git_init",
        "file": "mempalace/tests/test_init_gitignore_protection.py",
        "line": 14
      },
      {
        "name": "_ensure_mempalace_files_gitignored",
        "file": "mempalace/mempalace/cli.py",
        "line": 43
      }
    ],
    "impact": []
  },
  {
    "id": "g163",
    "symbol": "tool_list_wings",
    "file": "mempalace/mempalace/mcp_server.py",
    "line": 363,
    "callers": [
      {
        "name": "test_list_wings",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 285
      },
      {
        "name": "test_list_wings_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 116
      }
    ],
    "callees": [
      {
        "name": "_get_collection",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 214
      },
      {
        "name": "_no_palace",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 236
      },
      {
        "name": "_get_cached_metadata",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 269
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      },
      {
        "name": "exception",
        "file": "",
        "line": 177
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": [
      {
        "name": "test_list_wings",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 285
      },
      {
        "name": "test_list_wings_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 116
      }
    ]
  },
  {
    "id": "g164",
    "symbol": "test_get_source_groups_wing_filter",
    "file": "mempalace/tests/test_dedup.py",
    "line": 72,
    "callers": [],
    "callees": [
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "get_source_groups",
        "file": "mempalace/mempalace/dedup.py",
        "line": 51
      }
    ],
    "impact": []
  },
  {
    "id": "g165",
    "symbol": "test_extract_memories_decision",
    "file": "mempalace/tests/test_general_extractor.py",
    "line": 39,
    "callers": [],
    "callees": [
      {
        "name": "extract_memories",
        "file": "mempalace/mempalace/general_extractor.py",
        "line": 363
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "any",
        "file": "",
        "line": 1380
      }
    ],
    "impact": []
  },
  {
    "id": "g166",
    "symbol": "dcg",
    "file": "mempalace/benchmarks/longmemeval_bench.py",
    "line": 53,
    "callers": [
      {
        "name": "ndcg",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 61
      }
    ],
    "callees": [
      {
        "name": "enumerate",
        "file": "",
        "line": 1321
      },
      {
        "name": "log2",
        "file": "",
        "line": 84
      }
    ],
    "impact": [
      {
        "name": "evaluate_retrieval",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 71
      },
      {
        "name": "ndcg",
        "file": "mempalace/benchmarks/longmemeval_bench.py",
        "line": 61
      }
    ]
  },
  {
    "id": "g167",
    "symbol": "run_instructions",
    "file": "mempalace/mempalace/instructions_cli.py",
    "line": 16,
    "callers": [
      {
        "name": "cmd_instructions",
        "file": "mempalace/mempalace/cli.py",
        "line": 361
      },
      {
        "name": "test_run_instructions_valid_name",
        "file": "mempalace/tests/test_instructions_cli.py",
        "line": 10
      },
      {
        "name": "test_run_instructions_all_available",
        "file": "mempalace/tests/test_instructions_cli.py",
        "line": 19
      },
      {
        "name": "test_run_instructions_invalid_name",
        "file": "mempalace/tests/test_instructions_cli.py",
        "line": 27
      },
      {
        "name": "test_run_instructions_missing_md_file",
        "file": "mempalace/tests/test_instructions_cli.py",
        "line": 37
      }
    ],
    "callees": [
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1911
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1915
      },
      {
        "name": "exit",
        "file": "",
        "line": 375
      },
      {
        "name": "is_file",
        "file": "",
        "line": 177
      },
      {
        "name": "read_text",
        "file": "",
        "line": 178
      }
    ],
    "impact": [
      {
        "name": "cmd_instructions",
        "file": "mempalace/mempalace/cli.py",
        "line": 361
      },
      {
        "name": "test_cmd_instructions_calls_run_instructions",
        "file": "mempalace/tests/test_cli.py",
        "line": 85
      },
      {
        "name": "test_run_instructions_all_available",
        "file": "mempalace/tests/test_instructions_cli.py",
        "line": 19
      },
      {
        "name": "test_run_instructions_valid_name",
        "file": "mempalace/tests/test_instructions_cli.py",
        "line": 10
      },
      {
        "name": "test_run_instructions_invalid_name",
        "file": "mempalace/tests/test_instructions_cli.py",
        "line": 27
      },
      {
        "name": "test_run_instructions_missing_md_file",
        "file": "mempalace/tests/test_instructions_cli.py",
        "line": 37
      },
      {
        "name": "main",
        "file": "mempalace/mempalace/cli.py",
        "line": 515
      }
    ]
  },
  {
    "id": "g168",
    "symbol": "test_transcript_line_empty_user_turn",
    "file": "mempalace/tests/test_spellcheck.py",
    "line": 143,
    "callers": [],
    "callees": [
      {
        "name": "spellcheck_transcript_line",
        "file": "mempalace/mempalace/spellcheck.py",
        "line": 215
      }
    ],
    "impact": []
  },
  {
    "id": "g169",
    "symbol": "register",
    "file": "mempalace/mempalace/sources/registry.py",
    "line": 41,
    "callers": [
      {
        "name": "test_register_and_get_adapter_roundtrip",
        "file": "mempalace/tests/test_sources.py",
        "line": 180
      },
      {
        "name": "test_get_adapter_class_returns_class_not_instance",
        "file": "mempalace/tests/test_sources.py",
        "line": 189
      },
      {
        "name": "test_unregister_drops_registration_and_cached_instance",
        "file": "mempalace/tests/test_sources.py",
        "line": 199
      }
    ],
    "callees": [
      {
        "name": "add",
        "file": "",
        "line": 1257
      },
      {
        "name": "pop",
        "file": "",
        "line": 1229
      },
      {
        "name": "pop",
        "file": "",
        "line": 1231
      },
      {
        "name": "pop",
        "file": "",
        "line": 1233
      }
    ],
    "impact": [
      {
        "name": "test_get_adapter_class_returns_class_not_instance",
        "file": "mempalace/tests/test_sources.py",
        "line": 189
      },
      {
        "name": "test_unregister_drops_registration_and_cached_instance",
        "file": "mempalace/tests/test_sources.py",
        "line": 199
      },
      {
        "name": "test_register_and_get_adapter_roundtrip",
        "file": "mempalace/tests/test_sources.py",
        "line": 180
      }
    ]
  },
  {
    "id": "g170",
    "symbol": "extract_people",
    "file": "mempalace/mempalace/split_mega_files.py",
    "line": 134,
    "callers": [
      {
        "name": "split_file",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 179
      },
      {
        "name": "test_extract_people_uses_username_map",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 37
      },
      {
        "name": "test_extract_people_detects_names_from_content",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 48
      }
    ],
    "callees": [
      {
        "name": "set",
        "file": "",
        "line": 1252
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "search",
        "file": "",
        "line": 257
      },
      {
        "name": "search",
        "file": "",
        "line": 259
      },
      {
        "name": "add",
        "file": "",
        "line": 1257
      },
      {
        "name": "group",
        "file": "",
        "line": 89
      },
      {
        "name": "group",
        "file": "",
        "line": 91
      },
      {
        "name": "group",
        "file": "",
        "line": 93
      },
      {
        "name": "_load_username_map",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 75
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1911
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1915
      }
    ],
    "impact": [
      {
        "name": "split_file",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 179
      },
      {
        "name": "test_split_file_dry_run",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 257
      },
      {
        "name": "test_extract_people_detects_names_from_content",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 48
      },
      {
        "name": "test_split_file_tiny_fragments_skipped",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 284
      },
      {
        "name": "test_split_file_not_mega",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 267
      },
      {
        "name": "test_extract_people_uses_username_map",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 37
      },
      {
        "name": "test_split_file_output_dir_none",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 275
      },
      {
        "name": "test_split_file_creates_output",
        "file": "mempalace/tests/test_split_mega_files.py",
        "line": 247
      },
      {
        "name": "main",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 234
      }
    ]
  },
  {
    "id": "g171",
    "symbol": "test_run_onboarding_basic_flow",
    "file": "mempalace/tests/test_onboarding.py",
    "line": 421,
    "callers": [],
    "callees": [
      {
        "name": "run_onboarding",
        "file": "mempalace/mempalace/onboarding.py",
        "line": 365
      },
      {
        "name": "people",
        "file": "mempalace/mempalace/entity_registry.py",
        "line": 347
      },
      {
        "name": "projects",
        "file": "mempalace/mempalace/entity_registry.py",
        "line": 351
      }
    ],
    "impact": []
  },
  {
    "id": "g172",
    "symbol": "test_run_instructions_all_available",
    "file": "mempalace/tests/test_instructions_cli.py",
    "line": 19,
    "callers": [],
    "callees": [
      {
        "name": "run_instructions",
        "file": "mempalace/mempalace/instructions_cli.py",
        "line": 16
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": []
  },
  {
    "id": "g173",
    "symbol": "test_rebuild_index_success",
    "file": "mempalace/tests/test_repair.py",
    "line": 216,
    "callers": [],
    "callees": [
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "_install_mock_backend",
        "file": "mempalace/tests/test_repair.py",
        "line": 69
      },
      {
        "name": "rebuild_index",
        "file": "mempalace/mempalace/repair.py",
        "line": 204
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g174",
    "symbol": "test_chroma_backend_create_true_creates_directory_and_collection",
    "file": "mempalace/tests/test_backends.py",
    "line": 307,
    "callers": [],
    "callees": [
      {
        "name": "get_collection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 501
      },
      {
        "name": "ChromaBackend",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 378
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "isinstance",
        "file": "",
        "line": 1564
      }
    ],
    "impact": []
  },
  {
    "id": "g175",
    "symbol": "test_claude_ai_privacy_export_null_text",
    "file": "mempalace/tests/test_normalize.py",
    "line": 576,
    "callers": [],
    "callees": [
      {
        "name": "_try_claude_ai_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 283
      }
    ],
    "impact": []
  },
  {
    "id": "g176",
    "symbol": "test_claude_code_jsonl_captures_tool_output",
    "file": "mempalace/tests/test_normalize.py",
    "line": 927,
    "callers": [],
    "callees": [
      {
        "name": "dumps",
        "file": "",
        "line": 10
      },
      {
        "name": "_try_claude_code_jsonl",
        "file": "mempalace/mempalace/normalize.py",
        "line": 173
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      }
    ],
    "impact": []
  },
  {
    "id": "g177",
    "symbol": "tool_search",
    "file": "mempalace/mempalace/mcp_server.py",
    "line": 428,
    "callers": [
      {
        "name": "test_search_basic",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 331
      },
      {
        "name": "test_search_with_wing_filter",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 342
      },
      {
        "name": "test_search_with_room_filter",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 349
      },
      {
        "name": "test_search_min_similarity_backwards_compat",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 356
      },
      {
        "name": "test_search_rejects_invalid_room",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 381
      },
      {
        "name": "test_search_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 190
      }
    ],
    "callees": [
      {
        "name": "max",
        "file": "",
        "line": 1679
      },
      {
        "name": "max",
        "file": "",
        "line": 1683
      },
      {
        "name": "max",
        "file": "",
        "line": 1685
      },
      {
        "name": "max",
        "file": "",
        "line": 1687
      },
      {
        "name": "max",
        "file": "",
        "line": 1689
      },
      {
        "name": "max",
        "file": "",
        "line": 1691
      },
      {
        "name": "min",
        "file": "",
        "line": 1693
      },
      {
        "name": "min",
        "file": "",
        "line": 1697
      },
      {
        "name": "min",
        "file": "",
        "line": 1699
      },
      {
        "name": "min",
        "file": "",
        "line": 1701
      },
      {
        "name": "min",
        "file": "",
        "line": 1703
      },
      {
        "name": "min",
        "file": "",
        "line": 1705
      },
      {
        "name": "_sanitize_optional_name",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 286
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "sanitize_query",
        "file": "mempalace/mempalace/query_sanitizer.py",
        "line": 39
      },
      {
        "name": "search_memories",
        "file": "mempalace/mempalace/searcher.py",
        "line": 304
      },
      {
        "name": "palace_path",
        "file": "mempalace/mempalace/config.py",
        "line": 167
      }
    ],
    "impact": [
      {
        "name": "test_search_rejects_invalid_room",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 381
      },
      {
        "name": "test_search_with_wing_filter",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 342
      },
      {
        "name": "test_search_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 190
      },
      {
        "name": "test_search_min_similarity_backwards_compat",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 356
      },
      {
        "name": "test_search_basic",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 331
      },
      {
        "name": "test_search_with_room_filter",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 349
      }
    ]
  },
  {
    "id": "g178",
    "symbol": "is_gitignored",
    "file": "mempalace/mempalace/miner.py",
    "line": 204,
    "callers": [
      {
        "name": "scan_project",
        "file": "mempalace/mempalace/miner.py",
        "line": 684
      }
    ],
    "callees": [],
    "impact": [
      {
        "name": "test_scan_project_picks_up_jsonl_file",
        "file": "mempalace/tests/test_miner_jsonl_visibility.py",
        "line": 52
      },
      {
        "name": "scan_project",
        "file": "mempalace/mempalace/miner.py",
        "line": 684
      },
      {
        "name": "detect_rooms_local",
        "file": "mempalace/mempalace/room_detector_local.py",
        "line": 304
      },
      {
        "name": "test_scan_project_picks_up_50mb_jsonl",
        "file": "mempalace/tests/test_miner_jsonl_visibility.py",
        "line": 91
      },
      {
        "name": "scanned_files",
        "file": "mempalace/tests/test_miner.py",
        "line": 18
      },
      {
        "name": "mine",
        "file": "mempalace/mempalace/miner.py",
        "line": 753
      }
    ]
  },
  {
    "id": "g179",
    "symbol": "test_layer3_search_with_wing_filter",
    "file": "mempalace/tests/test_layers.py",
    "line": 409,
    "callers": [],
    "callees": [
      {
        "name": "MagicMock",
        "file": "",
        "line": 479
      },
      {
        "name": "_mock_query_results",
        "file": "mempalace/tests/test_layers.py",
        "line": 351
      },
      {
        "name": "Layer3",
        "file": "mempalace/mempalace/layers.py",
        "line": 243
      },
      {
        "name": "search",
        "file": "mempalace/mempalace/layers.py",
        "line": 253
      }
    ],
    "impact": []
  },
  {
    "id": "g180",
    "symbol": "_spawn_mine",
    "file": "mempalace/mempalace/hooks_cli.py",
    "line": 198,
    "callers": [
      {
        "name": "_maybe_auto_ingest",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 207
      }
    ],
    "callees": [
      {
        "name": "mkdir",
        "file": "",
        "line": 214
      },
      {
        "name": "open",
        "file": "",
        "line": 1716
      },
      {
        "name": "open",
        "file": "",
        "line": 1729
      },
      {
        "name": "open",
        "file": "",
        "line": 1742
      },
      {
        "name": "open",
        "file": "",
        "line": 1753
      },
      {
        "name": "open",
        "file": "",
        "line": 1764
      },
      {
        "name": "open",
        "file": "",
        "line": 1777
      },
      {
        "name": "open",
        "file": "",
        "line": 1790
      },
      {
        "name": "Popen",
        "file": "",
        "line": 1463
      },
      {
        "name": "write_text",
        "file": "",
        "line": 341
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": [
      {
        "name": "hook_stop",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 255
      },
      {
        "name": "test_maybe_auto_ingest_oserror",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 273
      },
      {
        "name": "test_maybe_auto_ingest_skips_when_mine_running",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 284
      },
      {
        "name": "test_maybe_auto_ingest_with_transcript",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 261
      },
      {
        "name": "test_maybe_auto_ingest_with_env",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 249
      },
      {
        "name": "_maybe_auto_ingest",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 207
      },
      {
        "name": "test_maybe_auto_ingest_no_env",
        "file": "mempalace/tests/test_hooks_cli.py",
        "line": 242
      }
    ]
  },
  {
    "id": "g181",
    "symbol": "f1_score",
    "file": "mempalace/benchmarks/locomo_bench.py",
    "line": 106,
    "callers": [],
    "callees": [
      {
        "name": "split",
        "file": "",
        "line": 587
      },
      {
        "name": "split",
        "file": "",
        "line": 589
      },
      {
        "name": "normalize_answer",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 97
      },
      {
        "name": "float",
        "file": "",
        "line": 366
      },
      {
        "name": "Counter",
        "file": "",
        "line": 274
      },
      {
        "name": "sum",
        "file": "",
        "line": 1930
      },
      {
        "name": "sum",
        "file": "",
        "line": 1932
      },
      {
        "name": "sum",
        "file": "",
        "line": 1934
      },
      {
        "name": "values",
        "file": "",
        "line": 1209
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": []
  },
  {
    "id": "g182",
    "symbol": "test_dialect_compress_samples",
    "file": "mempalace/tests/test_i18n.py",
    "line": 48,
    "callers": [],
    "callees": [
      {
        "name": "items",
        "file": "",
        "line": 1210
      },
      {
        "name": "Dialect",
        "file": "mempalace/mempalace/dialect.py",
        "line": 300
      },
      {
        "name": "compress",
        "file": "mempalace/mempalace/dialect.py",
        "line": 561
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      }
    ],
    "impact": []
  },
  {
    "id": "g183",
    "symbol": "list_tunnels",
    "file": "mempalace/mempalace/palace_graph.py",
    "line": 388,
    "callers": [
      {
        "name": "tool_list_tunnels",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 575
      },
      {
        "name": "test_list_tunnels_with_and_without_filter",
        "file": "mempalace/tests/test_closets.py",
        "line": 707
      },
      {
        "name": "test_delete_tunnel",
        "file": "mempalace/tests/test_closets.py",
        "line": 716
      },
      {
        "name": "test_dedup_same_endpoints_updates_label",
        "file": "mempalace/tests/test_closets.py",
        "line": 721
      },
      {
        "name": "test_tunnel_is_symmetric",
        "file": "mempalace/tests/test_closets.py",
        "line": 741
      },
      {
        "name": "test_corrupt_tunnel_file_does_not_lose_new_writes",
        "file": "mempalace/tests/test_closets.py",
        "line": 779
      },
      {
        "name": "test_concurrent_creates_preserve_all_tunnels",
        "file": "mempalace/tests/test_closets.py",
        "line": 806
      },
      {
        "name": "test_create_tunnel_deduplicates_reverse_order_and_updates_label",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 42
      },
      {
        "name": "test_list_tunnels_filters_by_either_side",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 66
      },
      {
        "name": "test_delete_tunnel_removes_saved_tunnel",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 76
      }
    ],
    "callees": [
      {
        "name": "_load_tunnels",
        "file": "mempalace/mempalace/palace_graph.py",
        "line": 252
      }
    ],
    "impact": [
      {
        "name": "test_tunnel_is_symmetric",
        "file": "mempalace/tests/test_closets.py",
        "line": 741
      },
      {
        "name": "test_list_tunnels_filters_by_either_side",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 66
      },
      {
        "name": "test_list_tunnels_with_and_without_filter",
        "file": "mempalace/tests/test_closets.py",
        "line": 707
      },
      {
        "name": "test_create_tunnel_deduplicates_reverse_order_and_updates_label",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 42
      },
      {
        "name": "test_corrupt_tunnel_file_does_not_lose_new_writes",
        "file": "mempalace/tests/test_closets.py",
        "line": 779
      },
      {
        "name": "test_concurrent_creates_preserve_all_tunnels",
        "file": "mempalace/tests/test_closets.py",
        "line": 806
      },
      {
        "name": "test_delete_tunnel",
        "file": "mempalace/tests/test_closets.py",
        "line": 716
      },
      {
        "name": "test_delete_tunnel_removes_saved_tunnel",
        "file": "mempalace/tests/test_palace_graph_tunnels.py",
        "line": 76
      },
      {
        "name": "test_dedup_same_endpoints_updates_label",
        "file": "mempalace/tests/test_closets.py",
        "line": 721
      },
      {
        "name": "tool_list_tunnels",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 575
      }
    ]
  },
  {
    "id": "g184",
    "symbol": "_kw_overlap",
    "file": "mempalace/benchmarks/locomo_bench.py",
    "line": 334,
    "callers": [
      {
        "name": "run_benchmark",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 621
      }
    ],
    "callees": [
      {
        "name": "sum",
        "file": "",
        "line": 1930
      },
      {
        "name": "sum",
        "file": "",
        "line": 1932
      },
      {
        "name": "sum",
        "file": "",
        "line": 1934
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": [
      {
        "name": "run_benchmark",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 621
      },
      {
        "name": "(module) locomo_bench.py",
        "file": "mempalace/benchmarks/locomo_bench.py",
        "line": 1
      }
    ]
  },
  {
    "id": "g185",
    "symbol": "migrate",
    "file": "mempalace/mempalace/migrate.py",
    "line": 137,
    "callers": [
      {
        "name": "cmd_migrate",
        "file": "mempalace/mempalace/cli.py",
        "line": 244
      },
      {
        "name": "test_migrate_requires_palace_database",
        "file": "mempalace/tests/test_migrate.py",
        "line": 9
      },
      {
        "name": "test_migrate_aborts_without_confirmation",
        "file": "mempalace/tests/test_migrate.py",
        "line": 20
      }
    ],
    "callees": [
      {
        "name": "abspath",
        "file": "",
        "line": 87
      },
      {
        "name": "expanduser",
        "file": "",
        "line": 99
      },
      {
        "name": "join",
        "file": "",
        "line": 127
      },
      {
        "name": "isdir",
        "file": "",
        "line": 43
      },
      {
        "name": "contains_palace_database",
        "file": "mempalace/mempalace/migrate.py",
        "line": 111
      },
      {
        "name": "print",
        "file": "",
        "line": 1805
      },
      {
        "name": "print",
        "file": "",
        "line": 1813
      },
      {
        "name": "getsize",
        "file": "",
        "line": 41
      },
      {
        "name": "detect_chromadb_version",
        "file": "mempalace/mempalace/migrate.py",
        "line": 91
      },
      {
        "name": "backend_version",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 493
      },
      {
        "name": "get_collection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 501
      },
      {
        "name": "ChromaBackend",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 378
      },
      {
        "name": "count",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 369
      },
      {
        "name": "extract_drawers_from_sqlite",
        "file": "mempalace/mempalace/migrate.py",
        "line": 28
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "defaultdict",
        "file": "",
        "line": 401
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1911
      },
      {
        "name": "sorted",
        "file": "",
        "line": 1915
      },
      {
        "name": "items",
        "file": "",
        "line": 1210
      },
      {
        "name": "sum",
        "file": "",
        "line": 1930
      },
      {
        "name": "sum",
        "file": "",
        "line": 1932
      },
      {
        "name": "sum",
        "file": "",
        "line": 1934
      },
      {
        "name": "values",
        "file": "",
        "line": 1209
      },
      {
        "name": "confirm_destructive_action",
        "file": "mempalace/mempalace/migrate.py",
        "line": 116
      },
      {
        "name": "strftime",
        "file": "",
        "line": 86
      },
      {
        "name": "now",
        "file": "",
        "line": 288
      },
      {
        "name": "copytree",
        "file": "",
        "line": 69
      },
      {
        "name": "mkdtemp",
        "file": "",
        "line": 471
      },
      {
        "name": "mkdtemp",
        "file": "",
        "line": 473
      },
      {
        "name": "get_or_create_collection",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 570
      },
      {
        "name": "range",
        "file": "",
        "line": 1328
      },
      {
        "name": "add",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 190
      },
      {
        "name": "move",
        "file": "",
        "line": 139
      }
    ],
    "impact": [
      {
        "name": "test_migrate_requires_palace_database",
        "file": "mempalace/tests/test_migrate.py",
        "line": 9
      },
      {
        "name": "test_migrate_aborts_without_confirmation",
        "file": "mempalace/tests/test_migrate.py",
        "line": 20
      },
      {
        "name": "cmd_migrate",
        "file": "mempalace/mempalace/cli.py",
        "line": 244
      }
    ]
  },
  {
    "id": "g186",
    "symbol": "search_memories",
    "file": "mempalace/mempalace/searcher.py",
    "line": 304,
    "callers": [
      {
        "name": "tool_search",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 428
      },
      {
        "name": "test_pure_drawer_when_no_closets",
        "file": "mempalace/tests/test_closets.py",
        "line": 352
      },
      {
        "name": "test_closet_boost_marks_hit_as_drawer_plus_closet",
        "file": "mempalace/tests/test_closets.py",
        "line": 362
      },
      {
        "name": "test_max_distance_filters_hybrid_hits",
        "file": "mempalace/tests/test_closets.py",
        "line": 385
      },
      {
        "name": "test_hybrid_search_enrichment_populates_drawer_index_and_total",
        "file": "mempalace/tests/test_closets.py",
        "line": 934
      },
      {
        "name": "test_no_closets_degrades_to_direct_drawer_search",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 59
      },
      {
        "name": "test_weak_closets_do_not_hide_direct_drawer_hits",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 68
      },
      {
        "name": "test_closet_boost_lifts_matching_drawer",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 87
      },
      {
        "name": "test_closet_preview_exposed_when_boosted",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 110
      },
      {
        "name": "test_drawer_only_hits_have_no_closet_preview",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 124
      },
      {
        "name": "test_basic_search",
        "file": "mempalace/tests/test_searcher.py",
        "line": 19
      },
      {
        "name": "test_wing_filter",
        "file": "mempalace/tests/test_searcher.py",
        "line": 25
      },
      {
        "name": "test_room_filter",
        "file": "mempalace/tests/test_searcher.py",
        "line": 29
      },
      {
        "name": "test_wing_and_room_filter",
        "file": "mempalace/tests/test_searcher.py",
        "line": 33
      },
      {
        "name": "test_n_results_limit",
        "file": "mempalace/tests/test_searcher.py",
        "line": 37
      },
      {
        "name": "test_no_palace_returns_error",
        "file": "mempalace/tests/test_searcher.py",
        "line": 41
      },
      {
        "name": "test_result_fields",
        "file": "mempalace/tests/test_searcher.py",
        "line": 45
      },
      {
        "name": "test_created_at_contains_filed_at",
        "file": "mempalace/tests/test_searcher.py",
        "line": 56
      },
      {
        "name": "test_created_at_fallback_when_filed_at_missing",
        "file": "mempalace/tests/test_searcher.py",
        "line": 62
      },
      {
        "name": "test_search_memories_query_error",
        "file": "mempalace/tests/test_searcher.py",
        "line": 77
      },
      {
        "name": "test_search_memories_filters_in_result",
        "file": "mempalace/tests/test_searcher.py",
        "line": 87
      },
      {
        "name": "test_search_memories_handles_none_metadata",
        "file": "mempalace/tests/test_searcher.py",
        "line": 92
      },
      {
        "name": "test_search_rss_growth",
        "file": "mempalace/tests/benchmarks/test_memory_profile.py",
        "line": 38
      },
      {
        "name": "test_search_heap_top_allocators",
        "file": "mempalace/tests/benchmarks/test_memory_profile.py",
        "line": 151
      },
      {
        "name": "test_palace_boost_recall",
        "file": "mempalace/tests/benchmarks/test_palace_boost.py",
        "line": 24
      },
      {
        "name": "test_filter_speedup",
        "file": "mempalace/tests/benchmarks/test_palace_boost.py",
        "line": 84
      },
      {
        "name": "test_boost_scaling",
        "file": "mempalace/tests/benchmarks/test_palace_boost.py",
        "line": 138
      },
      {
        "name": "test_single_room_recall",
        "file": "mempalace/tests/benchmarks/test_recall_threshold.py",
        "line": 114
      },
      {
        "name": "test_single_room_no_filter_recall",
        "file": "mempalace/tests/benchmarks/test_recall_threshold.py",
        "line": 154
      },
      {
        "name": "test_search_latency_curve",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 24
      },
      {
        "name": "test_recall_at_k",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 65
      },
      {
        "name": "test_filter_impact",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 106
      },
      {
        "name": "run_search",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 184
      },
      {
        "name": "test_n_results_latency",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 218
      }
    ],
    "callees": [
      {
        "name": "get_collection",
        "file": "mempalace/mempalace/palace.py",
        "line": 53
      },
      {
        "name": "error",
        "file": "",
        "line": 168
      },
      {
        "name": "build_where_filter",
        "file": "mempalace/mempalace/searcher.py",
        "line": 150
      },
      {
        "name": "query",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 229
      },
      {
        "name": "get_closets_collection",
        "file": "mempalace/mempalace/palace.py",
        "line": 66
      },
      {
        "name": "enumerate",
        "file": "",
        "line": 1321
      },
      {
        "name": "zip",
        "file": "",
        "line": 1943
      },
      {
        "name": "_first_or_empty",
        "file": "mempalace/mempalace/searcher.py",
        "line": 33
      },
      {
        "name": "get",
        "file": "",
        "line": 1223
      },
      {
        "name": "get",
        "file": "",
        "line": 1225
      },
      {
        "name": "get",
        "file": "",
        "line": 1227
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      },
      {
        "name": "name",
        "file": "",
        "line": 70
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      },
      {
        "name": "round",
        "file": "",
        "line": 1903
      },
      {
        "name": "round",
        "file": "",
        "line": 1905
      },
      {
        "name": "max",
        "file": "",
        "line": 1679
      },
      {
        "name": "max",
        "file": "",
        "line": 1683
      },
      {
        "name": "max",
        "file": "",
        "line": 1685
      },
      {
        "name": "max",
        "file": "",
        "line": 1687
      },
      {
        "name": "max",
        "file": "",
        "line": 1689
      },
      {
        "name": "max",
        "file": "",
        "line": 1691
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "sort",
        "file": "",
        "line": 1141
      },
      {
        "name": "sort",
        "file": "",
        "line": 1143
      },
      {
        "name": "get",
        "file": "mempalace/mempalace/backends/chroma.py",
        "line": 307
      },
      {
        "name": "isinstance",
        "file": "",
        "line": 1564
      },
      {
        "name": "set",
        "file": "",
        "line": 1252
      },
      {
        "name": "_tokenize",
        "file": "mempalace/mempalace/searcher.py",
        "line": 48
      },
      {
        "name": "sum",
        "file": "",
        "line": 1930
      },
      {
        "name": "sum",
        "file": "",
        "line": 1932
      },
      {
        "name": "sum",
        "file": "",
        "line": 1934
      },
      {
        "name": "min",
        "file": "",
        "line": 1693
      },
      {
        "name": "min",
        "file": "",
        "line": 1697
      },
      {
        "name": "min",
        "file": "",
        "line": 1699
      },
      {
        "name": "min",
        "file": "",
        "line": 1701
      },
      {
        "name": "min",
        "file": "",
        "line": 1703
      },
      {
        "name": "min",
        "file": "",
        "line": 1705
      },
      {
        "name": "join",
        "file": "",
        "line": 526
      },
      {
        "name": "join",
        "file": "",
        "line": 528
      },
      {
        "name": "_hybrid_rank",
        "file": "mempalace/mempalace/searcher.py",
        "line": 112
      }
    ],
    "impact": [
      {
        "name": "test_single_room_recall",
        "file": "mempalace/tests/benchmarks/test_recall_threshold.py",
        "line": 114
      },
      {
        "name": "test_wing_filter",
        "file": "mempalace/tests/test_searcher.py",
        "line": 25
      },
      {
        "name": "tool_search",
        "file": "mempalace/mempalace/mcp_server.py",
        "line": 428
      },
      {
        "name": "test_search_heap_top_allocators",
        "file": "mempalace/tests/benchmarks/test_memory_profile.py",
        "line": 151
      },
      {
        "name": "run_search",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 184
      },
      {
        "name": "test_created_at_contains_filed_at",
        "file": "mempalace/tests/test_searcher.py",
        "line": 56
      },
      {
        "name": "test_drawer_only_hits_have_no_closet_preview",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 124
      },
      {
        "name": "test_search_latency_curve",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 24
      },
      {
        "name": "test_weak_closets_do_not_hide_direct_drawer_hits",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 68
      },
      {
        "name": "test_recall_at_k",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 65
      },
      {
        "name": "test_search_basic",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 331
      },
      {
        "name": "test_wing_and_room_filter",
        "file": "mempalace/tests/test_searcher.py",
        "line": 33
      },
      {
        "name": "test_basic_search",
        "file": "mempalace/tests/test_searcher.py",
        "line": 19
      },
      {
        "name": "test_room_filter",
        "file": "mempalace/tests/test_searcher.py",
        "line": 29
      },
      {
        "name": "test_search_rss_growth",
        "file": "mempalace/tests/benchmarks/test_memory_profile.py",
        "line": 38
      },
      {
        "name": "test_result_fields",
        "file": "mempalace/tests/test_searcher.py",
        "line": 45
      },
      {
        "name": "test_palace_boost_recall",
        "file": "mempalace/tests/benchmarks/test_palace_boost.py",
        "line": 24
      },
      {
        "name": "test_boost_scaling",
        "file": "mempalace/tests/benchmarks/test_palace_boost.py",
        "line": 138
      },
      {
        "name": "test_search_memories_handles_none_metadata",
        "file": "mempalace/tests/test_searcher.py",
        "line": 92
      },
      {
        "name": "test_closet_boost_lifts_matching_drawer",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 87
      },
      {
        "name": "test_closet_preview_exposed_when_boosted",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 110
      },
      {
        "name": "test_search_memories_query_error",
        "file": "mempalace/tests/test_searcher.py",
        "line": 77
      },
      {
        "name": "test_search_latency",
        "file": "mempalace/tests/benchmarks/test_mcp_bench.py",
        "line": 190
      },
      {
        "name": "test_search_min_similarity_backwards_compat",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 356
      },
      {
        "name": "test_search_memories_filters_in_result",
        "file": "mempalace/tests/test_searcher.py",
        "line": 87
      },
      {
        "name": "test_created_at_fallback_when_filed_at_missing",
        "file": "mempalace/tests/test_searcher.py",
        "line": 62
      },
      {
        "name": "test_filter_speedup",
        "file": "mempalace/tests/benchmarks/test_palace_boost.py",
        "line": 84
      },
      {
        "name": "test_hybrid_search_enrichment_populates_drawer_index_and_total",
        "file": "mempalace/tests/test_closets.py",
        "line": 934
      },
      {
        "name": "test_search_rejects_invalid_room",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 381
      },
      {
        "name": "test_search_with_wing_filter",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 342
      },
      {
        "name": "test_n_results_latency",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 218
      },
      {
        "name": "test_no_closets_degrades_to_direct_drawer_search",
        "file": "mempalace/tests/test_hybrid_search.py",
        "line": 59
      },
      {
        "name": "test_search_with_room_filter",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 349
      },
      {
        "name": "test_no_palace_returns_error",
        "file": "mempalace/tests/test_searcher.py",
        "line": 41
      },
      {
        "name": "test_max_distance_filters_hybrid_hits",
        "file": "mempalace/tests/test_closets.py",
        "line": 385
      },
      {
        "name": "test_pure_drawer_when_no_closets",
        "file": "mempalace/tests/test_closets.py",
        "line": 352
      },
      {
        "name": "test_n_results_limit",
        "file": "mempalace/tests/test_searcher.py",
        "line": 37
      },
      {
        "name": "test_single_room_no_filter_recall",
        "file": "mempalace/tests/benchmarks/test_recall_threshold.py",
        "line": 154
      },
      {
        "name": "test_closet_boost_marks_hit_as_drawer_plus_closet",
        "file": "mempalace/tests/test_closets.py",
        "line": 362
      },
      {
        "name": "test_filter_impact",
        "file": "mempalace/tests/benchmarks/test_search_bench.py",
        "line": 106
      }
    ]
  },
  {
    "id": "g187",
    "symbol": "test_yn_default_no_empty_input",
    "file": "mempalace/tests/test_onboarding.py",
    "line": 251,
    "callers": [],
    "callees": [
      {
        "name": "_yn",
        "file": "mempalace/mempalace/onboarding.py",
        "line": 76
      }
    ],
    "impact": []
  },
  {
    "id": "g188",
    "symbol": "test_print_proposed_structure",
    "file": "mempalace/tests/test_room_detector_local.py",
    "line": 244,
    "callers": [],
    "callees": [
      {
        "name": "print_proposed_structure",
        "file": "mempalace/mempalace/room_detector_local.py",
        "line": 233
      }
    ],
    "impact": []
  },
  {
    "id": "g189",
    "symbol": "test_split_file_tiny_fragments_skipped",
    "file": "mempalace/tests/test_split_mega_files.py",
    "line": 284,
    "callers": [],
    "callees": [
      {
        "name": "split_file",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 179
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      }
    ],
    "impact": []
  },
  {
    "id": "g190",
    "symbol": "test_try_normalize_json_invalid_json",
    "file": "mempalace/tests/test_normalize.py",
    "line": 858,
    "callers": [],
    "callees": [
      {
        "name": "_try_normalize_json",
        "file": "mempalace/mempalace/normalize.py",
        "line": 149
      }
    ],
    "impact": []
  },
  {
    "id": "g191",
    "symbol": "test_kg_value_rejects_null_bytes",
    "file": "mempalace/tests/test_config.py",
    "line": 112,
    "callers": [],
    "callees": [
      {
        "name": "sanitize_kg_value",
        "file": "mempalace/mempalace/config.py",
        "line": 50
      }
    ],
    "impact": []
  },
  {
    "id": "g192",
    "symbol": "test_validate_transcript_rejects_path_traversal",
    "file": "mempalace/tests/test_hooks_cli.py",
    "line": 546,
    "callers": [],
    "callees": [
      {
        "name": "_validate_transcript_path",
        "file": "mempalace/mempalace/hooks_cli.py",
        "line": 46
      }
    ],
    "impact": []
  },
  {
    "id": "g193",
    "symbol": "cmd_split",
    "file": "mempalace/mempalace/cli.py",
    "line": 221,
    "callers": [
      {
        "name": "test_cmd_split_basic",
        "file": "mempalace/tests/test_cli.py",
        "line": 250
      },
      {
        "name": "test_cmd_split_all_options",
        "file": "mempalace/tests/test_cli.py",
        "line": 257
      }
    ],
    "callees": [
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "resolve",
        "file": "",
        "line": 325
      },
      {
        "name": "expanduser",
        "file": "",
        "line": 336
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      },
      {
        "name": "append",
        "file": "",
        "line": 1126
      },
      {
        "name": "split_main",
        "file": "mempalace/mempalace/split_mega_files.py",
        "line": 234
      }
    ],
    "impact": [
      {
        "name": "test_cmd_split_basic",
        "file": "mempalace/tests/test_cli.py",
        "line": 250
      },
      {
        "name": "test_cmd_split_all_options",
        "file": "mempalace/tests/test_cli.py",
        "line": 257
      }
    ]
  },
  {
    "id": "g194",
    "symbol": "_extract_drawer_ids_from_closet",
    "file": "mempalace/mempalace/searcher.py",
    "line": 161,
    "callers": [
      {
        "name": "test_parses_single_pointer",
        "file": "mempalace/tests/test_closets.py",
        "line": 332
      },
      {
        "name": "test_parses_multiple_pointers_per_line",
        "file": "mempalace/tests/test_closets.py",
        "line": 335
      },
      {
        "name": "test_dedupes_across_lines",
        "file": "mempalace/tests/test_closets.py",
        "line": 339
      },
      {
        "name": "test_empty_doc_returns_empty",
        "file": "mempalace/tests/test_closets.py",
        "line": 343
      }
    ],
    "callees": [
      {
        "name": "findall",
        "file": "",
        "line": 158
      },
      {
        "name": "findall",
        "file": "",
        "line": 160
      },
      {
        "name": "findall",
        "file": "",
        "line": 162
      },
      {
        "name": "list",
        "file": "",
        "line": 1120
      },
      {
        "name": "keys",
        "file": "",
        "line": 1208
      }
    ],
    "impact": [
      {
        "name": "test_empty_doc_returns_empty",
        "file": "mempalace/tests/test_closets.py",
        "line": 343
      },
      {
        "name": "test_dedupes_across_lines",
        "file": "mempalace/tests/test_closets.py",
        "line": 339
      },
      {
        "name": "test_parses_single_pointer",
        "file": "mempalace/tests/test_closets.py",
        "line": 332
      },
      {
        "name": "test_parses_multiple_pointers_per_line",
        "file": "mempalace/tests/test_closets.py",
        "line": 335
      }
    ]
  },
  {
    "id": "g195",
    "symbol": "bench_report_path",
    "file": "mempalace/tests/benchmarks/conftest.py",
    "line": 34,
    "callers": [],
    "callees": [],
    "impact": []
  },
  {
    "id": "g196",
    "symbol": "test_extract_memories_problem",
    "file": "mempalace/tests/test_general_extractor.py",
    "line": 81,
    "callers": [],
    "callees": [
      {
        "name": "extract_memories",
        "file": "mempalace/mempalace/general_extractor.py",
        "line": 363
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": []
  },
  {
    "id": "g197",
    "symbol": "tool_kg_timeline",
    "file": "mempalace/mempalace/mcp_server.py",
    "line": 902,
    "callers": [
      {
        "name": "test_kg_timeline",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 654
      }
    ],
    "callees": [
      {
        "name": "sanitize_kg_value",
        "file": "mempalace/mempalace/config.py",
        "line": 50
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "timeline",
        "file": "mempalace/mempalace/knowledge_graph.py",
        "line": 328
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": [
      {
        "name": "test_kg_timeline",
        "file": "mempalace/tests/test_mcp_server.py",
        "line": 654
      }
    ]
  },
  {
    "id": "g198",
    "symbol": "test_mine_convos_does_not_reprocess_short_files",
    "file": "mempalace/tests/test_convo_miner.py",
    "line": 33,
    "callers": [],
    "callees": [
      {
        "name": "mkdtemp",
        "file": "",
        "line": 471
      },
      {
        "name": "mkdtemp",
        "file": "",
        "line": 473
      },
      {
        "name": "open",
        "file": "",
        "line": 1716
      },
      {
        "name": "open",
        "file": "",
        "line": 1729
      },
      {
        "name": "open",
        "file": "",
        "line": 1742
      },
      {
        "name": "open",
        "file": "",
        "line": 1753
      },
      {
        "name": "open",
        "file": "",
        "line": 1764
      },
      {
        "name": "open",
        "file": "",
        "line": 1777
      },
      {
        "name": "open",
        "file": "",
        "line": 1790
      },
      {
        "name": "join",
        "file": "",
        "line": 127
      },
      {
        "name": "write",
        "file": "",
        "line": 208
      },
      {
        "name": "mine_convos",
        "file": "mempalace/mempalace/convo_miner.py",
        "line": 366
      },
      {
        "name": "str",
        "file": "",
        "line": 480
      },
      {
        "name": "resolve",
        "file": "",
        "line": 325
      },
      {
        "name": "Path",
        "file": "",
        "line": 151
      },
      {
        "name": "file_already_mined",
        "file": "mempalace/mempalace/palace.py",
        "line": 313
      }
    ],
    "impact": []
  },
  {
    "id": "g199",
    "symbol": "_warn_ambiguous",
    "file": "mempalace/mempalace/onboarding.py",
    "line": 247,
    "callers": [
      {
        "name": "run_onboarding",
        "file": "mempalace/mempalace/onboarding.py",
        "line": 365
      },
      {
        "name": "test_warn_ambiguous_flags_common_words",
        "file": "mempalace/tests/test_onboarding.py",
        "line": 59
      },
      {
        "name": "test_warn_ambiguous_empty_list",
        "file": "mempalace/tests/test_onboarding.py",
        "line": 70
      },
      {
        "name": "test_warn_ambiguous_no_ambiguous_names",
        "file": "mempalace/tests/test_onboarding.py",
        "line": 75
      },
      {
        "name": "test_warn_ambiguous_multiple_hits",
        "file": "mempalace/tests/test_onboarding.py",
        "line": 84
      }
    ],
    "callees": [
      {
        "name": "append",
        "file": "",
        "line": 1126
      }
    ],
    "impact": [
      {
        "name": "test_warn_ambiguous_empty_list",
        "file": "mempalace/tests/test_onboarding.py",
        "line": 70
      },
      {
        "name": "run_onboarding",
        "file": "mempalace/mempalace/onboarding.py",
        "line": 365
      },
      {
        "name": "test_warn_ambiguous_multiple_hits",
        "file": "mempalace/tests/test_onboarding.py",
        "line": 84
      },
      {
        "name": "test_warn_ambiguous_flags_common_words",
        "file": "mempalace/tests/test_onboarding.py",
        "line": 59
      },
      {
        "name": "test_warn_ambiguous_no_ambiguous_names",
        "file": "mempalace/tests/test_onboarding.py",
        "line": 75
      },
      {
        "name": "(module) onboarding.py",
        "file": "mempalace/mempalace/onboarding.py",
        "line": 1
      },
      {
        "name": "test_run_onboarding_with_ambiguous_names",
        "file": "mempalace/tests/test_onboarding.py",
        "line": 439
      },
      {
        "name": "test_run_onboarding_basic_flow",
        "file": "mempalace/tests/test_onboarding.py",
        "line": 421
      }
    ]
  },
  {
    "id": "g200",
    "symbol": "_is_code_line",
    "file": "mempalace/mempalace/general_extractor.py",
    "line": 310,
    "callers": [
      {
        "name": "_extract_prose",
        "file": "mempalace/mempalace/general_extractor.py",
        "line": 323
      },
      {
        "name": "test_is_code_line_detects_code",
        "file": "mempalace/tests/test_general_extractor.py",
        "line": 169
      },
      {
        "name": "test_is_code_line_allows_prose",
        "file": "mempalace/tests/test_general_extractor.py",
        "line": 175
      }
    ],
    "callees": [
      {
        "name": "strip",
        "file": "",
        "line": 598
      },
      {
        "name": "strip",
        "file": "",
        "line": 600
      },
      {
        "name": "match",
        "file": "",
        "line": 137
      },
      {
        "name": "match",
        "file": "",
        "line": 139
      },
      {
        "name": "match",
        "file": "",
        "line": 141
      },
      {
        "name": "sum",
        "file": "",
        "line": 1930
      },
      {
        "name": "sum",
        "file": "",
        "line": 1932
      },
      {
        "name": "sum",
        "file": "",
        "line": 1934
      },
      {
        "name": "isalpha",
        "file": "",
        "line": 514
      },
      {
        "name": "max",
        "file": "",
        "line": 1679
      },
      {
        "name": "max",
        "file": "",
        "line": 1683
      },
      {
        "name": "max",
        "file": "",
        "line": 1685
      },
      {
        "name": "max",
        "file": "",
        "line": 1687
      },
      {
        "name": "max",
        "file": "",
        "line": 1689
      },
      {
        "name": "max",
        "file": "",
        "line": 1691
      },
      {
        "name": "len",
        "file": "",
        "line": 1566
      }
    ],
    "impact": [
      {
        "name": "test_extract_prose_strips_code_blocks",
        "file": "mempalace/tests/test_general_extractor.py",
        "line": 183
      },
      {
        "name": "test_is_code_line_detects_code",
        "file": "mempalace/tests/test_general_extractor.py",
        "line": 169
      },
      {
        "name": "test_is_code_line_allows_prose",
        "file": "mempalace/tests/test_general_extractor.py",
        "line": 175
      },
      {
        "name": "test_extract_prose_returns_original_if_all_code",
        "file": "mempalace/tests/test_general_extractor.py",
        "line": 191
      },
      {
        "name": "extract_memories",
        "file": "mempalace/mempalace/general_extractor.py",
        "line": 363
      },
      {
        "name": "_extract_prose",
        "file": "mempalace/mempalace/general_extractor.py",
        "line": 323
      }
    ]
  }
]
