{
  "type": "callgraph",
  "queries": [
    {
      "type": "callgraph",
      "query": "functions that call search_filtered",
      "target": "search_filtered",
      "expected_callers": [
        "Changed",
        "1c. Note-boosted search ranking \u2014 DONE",
        "`cqs task \"description\"` \u2014 single-call implementation brief",
        "TC4: search_filtered() and search_by_candidate_ids() have no direct unit tests",
        "PERF-23: `list_notes_summaries()` called redundantly in `search_filtered` and `search_by_candidate_ids`"
      ],
      "total_callers": 36
    },
    {
      "type": "callgraph",
      "query": "functions that call cosine_similarity",
      "target": "cosine_similarity",
      "expected_callers": [
        "CQ-6: Duplicate cosine_similarity in diff.rs (see also A5)",
        "EH14: cosine_similarity returns 0.0 for mismatched dimensions with no warning",
        "RT-DATA-7: Verified protections -- no findings",
        "RT-DATA-7: Verified protections -- no findings",
        "RT-DATA-7: Verified protections -- no findings"
      ],
      "total_callers": 22
    },
    {
      "type": "callgraph",
      "query": "functions that call normalize_path",
      "target": "normalize_path",
      "expected_callers": [
        "Changed",
        "PB-8: `is_test_chunk` hardcodes both `/` and `\\\\` separators but `file` is always forward-slash normalized",
        "from_search_result",
        "cmd_gather",
        "cmd_reconstruct"
      ],
      "total_callers": 24
    },
    {
      "type": "callgraph",
      "query": "functions that call tokenize_identifier",
      "target": "tokenize_identifier",
      "expected_callers": [
        "Added",
        "CQ-9: Duplicated tokenization implementations in nl.rs",
        "6. `extract_body_keywords` creates unbounded HashMap from entire function body",
        "2. `extract_body_keywords` tokenizes entire function content for keyword extraction",
        "extract_return"
      ],
      "total_callers": 35
    },
    {
      "type": "callgraph",
      "query": "functions that call generate_nl_description",
      "target": "generate_nl_description",
      "expected_callers": [
        "Added",
        "reindex_files",
        "generate_nl_with_call_context_and_summary",
        "test_generate_nl_description",
        "test_generate_nl_with_jsdoc"
      ],
      "total_callers": 21
    },
    {
      "type": "callgraph",
      "query": "functions that call upsert_chunks_batch",
      "target": "upsert_chunks_batch",
      "expected_callers": [
        "PB2: upsert_chunks_batch stores chunk.file with native separators",
        "P6: normalize_for_fts called 4 times per chunk during upsert",
        "DS2: Pipeline chunks and call graph stored in separate transactions",
        "DS14: FTS index and chunks table consistency (informational \u2014 confirmed sound)",
        "OB-1: Store module has zero tracing spans on performance-critical operations"
      ],
      "total_callers": 58
    },
    {
      "type": "callgraph",
      "query": "functions that call embed_query",
      "target": "embed_query",
      "expected_callers": [
        "Search",
        "O11: Embedding cache hit/miss ratio not observable",
        "TC6: embed_documents() has no tests",
        "EH-31: Missing `.context()` on `Embedder::new()` and `embed_query()` in batch handlers",
        "RT-RES-11: Empty query string handled cleanly \u2014 no panic"
      ],
      "total_callers": 38
    },
    {
      "type": "callgraph",
      "query": "functions that call parse_file",
      "target": "parse_file",
      "expected_callers": [
        "Fixed",
        "TC-6: Fenced code block call-graph relationships untested",
        "Task 2: Fix #563/RM-5 \u2014 Eliminate double I/O in indexing pipeline",
        "parse_bash_function",
        "parse_bash_function_short"
      ],
      "total_callers": 432
    },
    {
      "type": "callgraph",
      "query": "functions that call get_call_graph",
      "target": "get_call_graph",
      "expected_callers": [
        "Added",
        "TC-7: `suggest_tests()` has zero test coverage (only dead-code test for empty callers)",
        "TC-8: `analyze_impact()` integration-level function has no direct tests",
        "PERF-11: `get_call_graph()` clones every caller and callee string twice",
        "PERF-22: `get_call_graph()` not cached in BatchContext \u2014 reloaded per command"
      ],
      "total_callers": 36
    },
    {
      "type": "callgraph",
      "query": "functions that call find_test_chunks",
      "target": "find_test_chunks",
      "expected_callers": [
        "Added",
        "TC-7: `suggest_tests()` has zero test coverage (only dead-code test for empty callers)",
        "RM-5: `find_test_chunks()` loads full `content` column for all test functions",
        "EH-1: `scout_with_options` hard-fails on `find_test_chunks`, `task()` gracefully degrades \u2014 inconsistent",
        "CQ-3: `dispatch_task` bypasses `BatchContext` call graph cache"
      ],
      "total_callers": 27
    },
    {
      "type": "callgraph",
      "query": "functions that call compute_risk_batch",
      "target": "compute_risk_batch",
      "expected_callers": [
        "Added",
        "CQ-1: `review_diff()` double-loads call graph and test chunks",
        "TC-7: `compute_risk_batch()` boundary thresholds not exercised",
        "health_check",
        "test_risk_high_many_callers_no_tests"
      ],
      "total_callers": 19
    },
    {
      "type": "callgraph",
      "query": "functions that call analyze_impact",
      "target": "analyze_impact",
      "expected_callers": [
        "`cqs task \"description\"` \u2014 single-call implementation brief",
        "OB-4: `analyze_impact()` does BFS + test discovery with no tracing span",
        "EXT-4: `MAX_TEST_SEARCH_DEPTH` hardcoded at 5 in impact analysis",
        "TC-8: `analyze_impact()` integration-level function has no direct tests",
        "PERF-1: `suggest_tests()` runs per-caller reverse BFS \u2014 O(callers * graph_size)"
      ],
      "total_callers": 18
    },
    {
      "type": "callgraph",
      "query": "functions that call bfs_shortest_path",
      "target": "bfs_shortest_path",
      "expected_callers": [
        "RT-RES-5: Graph cycle handling in all BFS traversals \u2014 verified safe",
        "RT-RES-5: Graph cycle handling in all BFS traversals \u2014 verified safe",
        "RT-RES-5: Graph cycle handling in all BFS traversals \u2014 verified safe",
        "RT-RES-5: Graph cycle handling in all BFS traversals \u2014 verified safe",
        "dispatch_trace"
      ],
      "total_callers": 10
    },
    {
      "type": "callgraph",
      "query": "functions that call rrf_fuse",
      "target": "rrf_fuse",
      "expected_callers": [
        "AC-1: `search_by_candidate_ids` silently skips RRF fusion when HNSW index is available",
        "PF-2: `search_filtered` clones all semantic IDs to `Vec<String>` solely to pass to `rrf_fuse`",
        "RT-DATA-7: Verified protections -- no findings",
        "RT-DATA-7: Verified protections -- no findings",
        "RT-DATA-7: Verified protections -- no findings"
      ],
      "total_callers": 8
    },
    {
      "type": "callgraph",
      "query": "functions that call prune_missing",
      "target": "prune_missing",
      "expected_callers": [
        "OB-1: Store module has zero tracing spans on performance-critical operations",
        "DS-4: GC prune operations not atomic \u2014 partial prune on crash",
        "DS-6: `prune_missing` uses per-batch transactions \u2014 incomplete prune on crash",
        "DS-5: `run_index_pipeline` opens a second `Store` on the same database file simultaneously with `cmd_index`'s store",
        "PB-5: `prune_missing` and `check_origins_stale` macOS case-fold uses `to_lowercase()` which diverges from APFS Unicode normalization"
      ],
      "total_callers": 8
    },
    {
      "type": "callgraph",
      "query": "functions that call acquire_index_lock",
      "target": "acquire_index_lock",
      "expected_callers": [
        "DS-1: Watch mode never acquired index lock (DS-1/DS-6 fix never applied)",
        "P2 Fixes (9 items by parallel agents)",
        "cmd_gc",
        "cmd_index"
      ],
      "total_callers": 4
    },
    {
      "type": "callgraph",
      "query": "functions that call score_candidate",
      "target": "score_candidate",
      "expected_callers": [
        "Changed",
        "AD-34: `score_candidate` takes 9 positional parameters with `#[allow(clippy::too_many_arguments)]`",
        "search_filtered_with_notes",
        "search_by_candidate_ids_with_notes",
        "test_score_candidate_basic"
      ],
      "total_callers": 12
    },
    {
      "type": "callgraph",
      "query": "functions that call build_batched_with_dim",
      "target": "build_batched_with_dim",
      "expected_callers": [
        "Completion Checklist",
        "DS-26: HNSW build and load hardcode `EMBEDDING_DIM` (768) -- broken for non-default models",
        "P4: Hard or Low Impact \u2014 Create Issues",
        "P3: Fix if Time",
        "build_hnsw_index_owned"
      ],
      "total_callers": 22
    },
    {
      "type": "callgraph",
      "query": "functions that call merge_results",
      "target": "merge_results",
      "expected_callers": [
        "RM-5: `merge_results()` hashes all results before truncating to limit",
        "7. `search_reference()` and `search_reference_by_name()` have zero tests",
        "P1: Easy + High Impact \u2014 Fix Immediately",
        "cmd_query_project",
        "test_merge_results_empty_refs"
      ],
      "total_callers": 16
    },
    {
      "type": "callgraph",
      "query": "functions that call gather",
      "target": "gather",
      "expected_callers": [
        "Changed",
        "Fixed",
        "2b. `cqs onboard \"concept\"` \u2014 guided codebase tour",
        "O1: gather() has no logging or tracing spans",
        "EH4: gather() silently falls back to empty on batch search failure"
      ],
      "total_callers": 35
    }
  ]
}