Local-first code intelligence graph for MCP and CLI. Builds a persistent map of your codebase so AI coding tools read only what matters, with benchmarked context reductions on reviews and large-repo workflows.
This report summarizes scanner evidence for tirth8205/code-review-graph, a Python project with 32,028 GitHub stars. SynthScan examined 177,346 lines of code across 345 source files, recording 5509 pattern matches distributed across 20 syntactic categories. The legacy adjusted pattern signal is 42.5 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 4006 finding(s).
Are imports declared and package/API names verified? 403 finding(s).
Are wrappers, guards, and repeated structures necessary? 4726 finding(s).
Which changes need focused human review? 5509 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 5509 distinct pattern matches across 20 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | code_review_graph/communities.py | 30 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/communities.py | 32 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/communities.py | 42 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | code_review_graph/communities.py | 44 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 68 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 70 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 183 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 185 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 257 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 259 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 469 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 471 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 560 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 562 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 792 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/communities.py | 794 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 29 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 31 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 64 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 66 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 186 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 188 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 262 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 264 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 443 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/exports.py | 445 | # ------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 53 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 55 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 303 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 305 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 531 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 533 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 576 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 578 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 650 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/changes.py | 652 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 50 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 53 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 74 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 81 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 100 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 103 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 114 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/spring_resolver.py | 116 | # ----------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 40 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 42 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 70 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 72 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 235 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/tsconfig_resolver.py | 237 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/scoped_resolver.py | 272 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/scoped_resolver.py | 276 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | code_review_graph/scoped_resolver.py | 295 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | code_review_graph/scoped_resolver.py | 298 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | code_review_graph/scoped_resolver.py | 307 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM⚡ | code_review_graph/scoped_resolver.py | 312 | # ------------------------------------------------------------------ | COMMENT |
| MEDIUM | code_review_graph/refactor.py | 49 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/refactor.py | 51 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/refactor.py | 70 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | code_review_graph/refactor.py | 72 | # --------------------------------------------------------------------------- | COMMENT |
| 832 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/communities.py | 848 | def incremental_detect_communities( | CODE |
| LOW | code_review_graph/communities.py | 1019 | def get_architecture_overview(store: GraphStore) -> dict[str, Any]: | CODE |
| LOW | code_review_graph/changes.py | 440 | def compute_file_churn_with_status( | CODE |
| LOW | code_review_graph/scoped_resolver.py | 162 | def _is_unresolved_scoped_target(target: str) -> bool: | CODE |
| LOW | code_review_graph/analysis.py | 213 | def find_surprising_connections( | CODE |
| LOW | code_review_graph/analysis.py | 317 | def generate_suggested_questions( | CODE |
| LOW | code_review_graph/jedi_resolver.py | 234 | def _find_untracked_method_calls(root, is_test_file: bool = False): | CODE |
| LOW | code_review_graph/refactor.py | 224 | def _collect_type_referenced_names(store: GraphStore) -> set[str]: | CODE |
| LOW | code_review_graph/skills.py | 467 | def _is_generated_server_entry(entry: Any) -> bool: | CODE |
| LOW | code_review_graph/skills.py | 517 | def _warn_legacy_opencode_config(repo_root: Path) -> None: | CODE |
| LOW | code_review_graph/skills.py | 1457 | def generate_codex_hooks_config(repo_root: Path) -> dict[str, Any]: | CODE |
| LOW | code_review_graph/skills.py | 1835 | def _is_generated_hook_script(command: str) -> bool: | CODE |
| LOW | code_review_graph/skills.py | 1873 | def _is_generated_hook_command(command: Any) -> bool: | CODE |
| LOW | code_review_graph/skills.py | 1991 | def _merge_hooks_into_settings( | CODE |
| LOW | code_review_graph/skills.py | 2537 | def inject_platform_instructions(repo_root: Path, target: str = "all") -> list[str]: | CODE |
| LOW | code_review_graph/skills.py | 2591 | def generate_cursor_hooks_config() -> dict[str, Any]: | CODE |
| LOW | code_review_graph/skills.py | 1575 | def _git_hook_markers_balanced(text: str) -> bool: | STRING |
| LOW | code_review_graph/skills.py | 2230 | def _known_instruction_sections() -> tuple[str, ...]: | STRING |
| LOW | code_review_graph/skills.py | 2347 | def _remove_legacy_instruction_file(path: Path) -> None: | STRING |
| LOW | code_review_graph/skills.py | 2491 | def install_gemini_cli_skills(repo_root: Path) -> Path: | STRING |
| LOW | code_review_graph/context_savings.py | 201 | def format_context_savings_panel( | CODE |
| LOW | code_review_graph/graph.py | 70 | def _compatible_edge_languages(language: str) -> tuple[str, ...]: | CODE |
| LOW | code_review_graph/graph.py | 374 | def _edge_extra_is_unresolved(extra: Optional[str]) -> bool: | CODE |
| LOW | code_review_graph/graph.py | 1226 | def search_edges_by_target_name( | CODE |
| LOW | code_review_graph/graph.py | 1247 | def iter_edges_by_target_name( | CODE |
| LOW | code_review_graph/graph.py | 1672 | def _python_module_file_index(conn: sqlite3.Connection) -> dict[str, str]: | CODE |
| LOW | code_review_graph/graph.py | 1704 | def _select_evidence_backed_candidate( | CODE |
| LOW | code_review_graph/graph.py | 1718 | def _receiver_backed_candidates( | CODE |
| LOW | code_review_graph/graph.py | 1764 | def _receiver_evidence_admits_candidate( | CODE |
| LOW | code_review_graph/graph.py | 1804 | def resolve_bare_call_targets(self) -> int: | CODE |
| LOW | code_review_graph/graph.py | 1819 | def refresh_target_resolution(self) -> int: | CODE |
| LOW | code_review_graph/graph.py | 1843 | def count_edges_by_resolution(self, kind: str = "CALLS") -> dict[str, int]: | CODE |
| LOW | code_review_graph/graph.py | 1875 | def resolve_cpp_scoped_call_targets(self) -> int: | CODE |
| LOW | code_review_graph/graph.py | 2084 | def resolve_bare_tested_by_sources(self) -> int: | CODE |
| LOW | code_review_graph/graph.py | 2455 | def search_nodes_by_qualified_tail( | CODE |
| LOW | code_review_graph/graph.py | 2470 | def count_nodes_by_qualified_tail(self, tail: str) -> int: | CODE |
| LOW | code_review_graph/graph.py | 2681 | def _import_scope_importer_index(self) -> dict[str, list[str]]: | CODE |
| LOW | code_review_graph/graph.py | 2713 | def count_unresolved_call_sites(self, names: set[str]) -> int: | CODE |
| LOW | code_review_graph/graph.py | 3017 | def _get_impact_radius_networkx( | CODE |
| LOW | code_review_graph/graph.py | 3302 | def get_flow_criticalities_for_node(self, node_id: int) -> list[float]: | CODE |
| LOW | code_review_graph/graph.py | 3322 | def get_community_ids_by_qualified_names( | CODE |
| LOW | code_review_graph/graph.py | 3353 | def get_nodes_without_signature(self) -> list[sqlite3.Row]: | CODE |
| LOW | code_review_graph/graph.py | 3523 | def get_nodes_by_community_id( | CODE |
| LOW | code_review_graph/rescript_resolver.py | 36 | def resolve_rescript_cross_module(store: GraphStore) -> dict: | CODE |
| LOW | code_review_graph/hcl_resolver.py | 15 | def resolve_hcl_module_references(store: GraphStore) -> dict[str, int]: | CODE |
| LOW⚡ | code_review_graph/parser.py | 10093 | def _extract_js_var_functions( | CODE |
| LOW⚡ | code_review_graph/parser.py | 12667 | def _resolve_php_scoped_calls( | CODE |
| LOW⚡ | code_review_graph/parser.py | 18834 | def _handle_r_binary_operator( | CODE |
| LOW | code_review_graph/parser.py | 177 | def _python_type_checking_aliases( | CODE |
| LOW | code_review_graph/parser.py | 364 | def _python_unreachable_call_positions( | CODE |
| LOW | code_review_graph/parser.py | 412 | def _is_statically_false_condition(cond) -> bool: | CODE |
| LOW | code_review_graph/parser.py | 503 | def _parser_load_timeout_seconds() -> float: | CODE |
| LOW | code_review_graph/parser.py | 546 | def _install_hint_for_probe_failure(detail: str) -> str | None: | CODE |
| LOW | code_review_graph/parser.py | 610 | def _parser_load_probe_succeeds( | CODE |
| LOW | code_review_graph/parser.py | 662 | def _clear_parser_probe_cache() -> None: | CODE |
| LOW | code_review_graph/parser.py | 799 | def _read_gemspec_require_paths( | CODE |
| LOW | code_review_graph/parser.py | 1892 | def _vbnet_relationship_targets(value: str) -> list[str]: | CODE |
| LOW | code_review_graph/parser.py | 2066 | def _rescript_brace_depth_array(cleaned: str) -> list[int]: | CODE |
| LOW | code_review_graph/parser.py | 2448 | def _modifier_annotation_names(node) -> list[str]: | CODE |
| LOW | code_review_graph/parser.py | 2760 | def _hcl_dynamic_iterator_name(block_node) -> Optional[str]: | CODE |
| 3557 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH⚡ | code_review_graph/skills.py | 1422 | "cat >/dev/null || true; " | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1423 | "command -v code-review-graph >/dev/null 2>&1 || exit 0; " | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1426 | " --repo \"$(git rev-parse --show-toplevel 2>/dev/null)\"" | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1441 | "cat >/dev/null || true; " | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1442 | "command -v code-review-graph >/dev/null 2>&1 || exit 0; " | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1445 | " --repo \"$(git rev-parse --show-toplevel 2>/dev/null)\"" | CODE |
| HIGH⚡ | code_review_graph/skills.py | 2405 | cat > /dev/null || true | CODE |
| HIGH⚡ | code_review_graph/skills.py | 2407 | msg="$(code-review-graph status --repo "__CRG_REPO__" 2>&1 | head -n 1 || true)" | CODE |
| HIGH⚡ | code_review_graph/skills.py | 2413 | ' 2>/dev/null || echo '{"suppressOutput": true}' | CODE |
| HIGH | code_review_graph/skills.py | 1468 | "cat >/dev/null || true; " | CODE |
| HIGH | code_review_graph/skills.py | 1486 | "cat >/dev/null || true; " | CODE |
| HIGH | code_review_graph/skills.py | 1524 | crg_hook_git_dir=$(git rev-parse --absolute-git-dir 2>/dev/null) || crg_hook_git_dir="" | CODE |
| HIGH | code_review_graph/skills.py | 1525 | crg_hook_root=$(git rev-parse --show-toplevel 2>/dev/null) || crg_hook_root="" | CODE |
| HIGH | code_review_graph/skills.py | 2424 | cat > /dev/null || true | CODE |
| HIGH | code_review_graph/skills.py | 2426 | code-review-graph update --skip-flows --repo "__CRG_REPO__" >/dev/null 2>&1 || true | CODE |
| HIGH | code_review_graph/skills.py | 2658 | " 2>/dev/null || echo '{"passed":true}' | CODE |
| HIGH | code_review_graph/skills.py | 2680 | " <<< "$output" 2>/dev/null || echo '{"passed":true}' | CODE |
| HIGH | code_review_graph/skills.py | 2702 | " <<< "$output" 2>/dev/null || echo '{"passed":true}' | CODE |
| HIGH⚡ | code_review_graph/skills.py | 1552 | " code-review-graph detect-changes --brief || true\n" | STRING |
| HIGH⚡ | code_review_graph/skills.py | 1558 | " code-review-graph update || true\n" | STRING |
| HIGH⚡ | code_review_graph/skills.py | 1559 | " code-review-graph detect-changes --brief || true\n" | STRING |
| HIGH⚡ | code_review_graph/visualization.py | 1095 | var neighbourhood = graphData.neighbourhood || null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1095 | var neighbourhood = graphData.neighbourhood || null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1104 | var nbPathList = (neighbourhood && neighbourhood.path) || []; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1114 | if (h == null) return true; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1115 | return h <= nbVisibleDepth || nbExpanded.has(qn); | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1187 | var bg = communityColoringOn && d.community_id != null ? communityColorScale(d.community_id) : (KIND_COLOR[d.kind] || | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1192 | if (d.line_start != null) h += '<div class="tt-row"><span class="tt-label">Lines: </span>' + d.line_start + ' \u2013 ' | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1192 | if (d.line_start != null) h += '<div class="tt-row"><span class="tt-label">Lines: </span>' + d.line_start + ' \u2013 ' | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1195 | if (d.community_id != null) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1248 | CONTAINS: { dash:null, width:1, opacity:0.14, marker:"" }, | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1249 | CALLS: { dash:null, width:2, opacity:0.7, marker:"url(#arrow-calls)" }, | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1256 | function eStyle(d) { return EDGE_CFG[d.kind] || {dash:null,width:1,opacity:0.3,marker:""}; } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1259 | if (communityColoringOn && d.community_id != null) return communityColorScale(d.community_id); | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1259 | if (communityColoringOn && d.community_id != null) return communityColorScale(d.community_id); | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1346 | var best = null, bestDist = Infinity; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1352 | if (ev.key === "ArrowRight" && dx > 0 && Math.abs(dy) < Math.abs(dx)) ok = true; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1353 | if (ev.key === "ArrowLeft" && dx < 0 && Math.abs(dy) < Math.abs(dx)) ok = true; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1354 | if (ev.key === "ArrowDown" && dy > 0 && Math.abs(dx) < Math.abs(dy)) ok = true; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1355 | if (ev.key === "ArrowUp" && dy < 0 && Math.abs(dx) < Math.abs(dy)) ok = true; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1356 | if (ok && dist < bestDist) { best = n; bestDist = dist; } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1674 | return d._hidden ? "none" : null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1683 | if (cid == null) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1686 | if (cid != null && hiddenCommunities.has(cid)) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1689 | return null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1694 | if (cid == null) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1697 | if (cid != null && hiddenCommunities.has(cid)) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1700 | return null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1704 | var activeFlowQns = null; | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1707 | if (idx === "") { activeFlowQns = null; clearFlowHighlight(); return; } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1716 | if (!activeFlowQns || activeFlowQns.size === 0) { clearFlowHighlight(); return; } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1753 | if (t === d.qualified_name && e.kind === "CALLS") { var sN = nodeById.get(s); if (sN) callers.push(sN); } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1753 | if (t === d.qualified_name && e.kind === "CALLS") { var sN = nodeById.get(s); if (sN) callers.push(sN); } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1754 | if (s === d.qualified_name && e.kind === "CALLS") { var tN = nodeById.get(t); if (tN) callees.push(tN); } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1754 | if (s === d.qualified_name && e.kind === "CALLS") { var tN = nodeById.get(t); if (tN) callees.push(tN); } | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1757 | var bg = communityColoringOn && d.community_id != null ? communityColorScale(d.community_id) : (KIND_COLOR[d.kind] || | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 1763 | if (d.community_id != null) { | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 2136 | CROSS_COMMUNITY: { dash: null, width: 2, opacity: 0.6, marker: "" }, | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 2138 | CONTAINS: { dash: null, width: 1, opacity: 0.08, marker: "" }, | CODE |
| HIGH⚡ | code_review_graph/visualization.py | 2139 | CALLS: { dash: null, width: 1.5, opacity: 0.7, marker: "url(#arrow-calls)" }, | CODE |
| 112 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | code_review_graph/enrich.py | 232 | except (OSError, ValueError): | CODE |
| HIGH | code_review_graph/graph.py | 2505 | except Exception: # nosec B110 - FTS5 table may not exist on older schemas | CODE |
| HIGH | code_review_graph/graph.py | 2545 | except Exception: # nosec B110 - FTS5 may not exist on older schemas | CODE |
| HIGH | code_review_graph/parser.py | 15572 | except (OSError, ValueError): | CODE |
| HIGH | code_review_graph/parser.py | 15584 | except (OSError, ValueError): | CODE |
| HIGH | code_review_graph/parser.py | 16177 | except OSError: | CODE |
| HIGH | code_review_graph/parser.py | 15598 | except (OSError, ValueError): | CODE |
| HIGH | code_review_graph/embeddings.py | 503 | except Exception: # nosec B110 | CODE |
| HIGH | code_review_graph/embeddings.py | 731 | except Exception: # nosec B110 | CODE |
| HIGH | code_review_graph/cli.py | 92 | except ImportError: | CODE |
| HIGH | code_review_graph/cli.py | 117 | except (OSError, ValueError): | CODE |
| HIGH | code_review_graph/daemon_cli.py | 333 | except KeyboardInterrupt: | CODE |
| HIGH | code_review_graph/daemon.py | 601 | except OSError: | CODE |
| HIGH | code_review_graph/daemon.py | 746 | except OSError: # pragma: no cover - best-effort cleanup | CODE |
| HIGH | code_review_graph/daemon.py | 907 | except OSError: # pragma: no cover - best-effort cleanup | CODE |
| HIGH | code_review_graph/daemon.py | 490 | except OSError: # pragma: no cover - best-effort cleanup | CODE |
| HIGH | code_review_graph/daemon.py | 1519 | except OSError: | CODE |
| HIGH | code_review_graph/daemon.py | 1032 | except OSError: | CODE |
| HIGH | code_review_graph/incremental.py | 773 | except (subprocess.TimeoutExpired, FileNotFoundError, UnicodeDecodeError): | CODE |
| HIGH | code_review_graph/incremental.py | 786 | except (subprocess.TimeoutExpired, FileNotFoundError, UnicodeDecodeError): | CODE |
| HIGH | code_review_graph/incremental.py | 816 | except (subprocess.TimeoutExpired, FileNotFoundError): | CODE |
| HIGH | code_review_graph/incremental.py | 1431 | except (FileNotFoundError, subprocess.TimeoutExpired): | CODE |
| HIGH | code_review_graph/incremental.py | 413 | except OSError: | CODE |
| HIGH | code_review_graph/incremental.py | 2033 | except (OSError, PermissionError): | CODE |
| HIGH | code_review_graph/incremental.py | 2885 | except OSError: # pragma: no cover - best-effort cleanup | CODE |
| HIGH | code_review_graph/incremental.py | 3176 | except (ValueError, OSError): # pragma: no cover - shutdown race | CODE |
| HIGH | code_review_graph/tools/_common.py | 103 | except (OverflowError, TypeError, ValueError): | CODE |
| HIGH | code_review_graph/tools/_common.py | 256 | except ValueError: | CODE |
| HIGH | code_review_graph/tools/docs.py | 153 | except ValueError: | CODE |
| HIGH | code_review_graph/eval/reporter.py | 230 | except (ValueError, TypeError): | CODE |
| HIGH | code_review_graph/eval/reporter.py | 239 | except (ValueError, TypeError): | CODE |
| HIGH | …e_review_graph/eval/benchmarks/incremental_fidelity.py | 408 | except sqlite3.OperationalError: | CODE |
| HIGH | code_review_graph/eval/benchmarks/token_efficiency.py | 53 | except OSError: | CODE |
| HIGH | tests/test_search.py | 168 | except Exception: | CODE |
| HIGH | tests/test_embeddings.py | 842 | except RuntimeError: | CODE |
| HIGH | tests/test_tools.py | 1974 | except Exception: | CODE |
| HIGH | tests/test_parser_load_probe.py | 180 | except ImportError: | CODE |
| HIGH | tests/test_parser_load_probe.py | 232 | except ImportError: | CODE |
| HIGH | tests/test_concurrency_and_daemon.py | 363 | except (ProcessLookupError, PermissionError, ValueError, TypeError): | CODE |
| HIGH | tests/test_concurrency_and_daemon.py | 1321 | except ValueError: # pragma: no cover | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/communities.py | 7 | CODE | |
| LOW | code_review_graph/exports.py | 3 | CODE | |
| LOW | code_review_graph/forget.py | 20 | CODE | |
| LOW | code_review_graph/changes.py | 7 | CODE | |
| LOW | code_review_graph/spring_resolver.py | 18 | CODE | |
| LOW | code_review_graph/tsconfig_resolver.py | 10 | CODE | |
| LOW | code_review_graph/scoped_resolver.py | 60 | CODE | |
| LOW | code_review_graph/analysis.py | 4 | CODE | |
| LOW | code_review_graph/jedi_resolver.py | 12 | CODE | |
| LOW | code_review_graph/refactor.py | 9 | CODE | |
| LOW | code_review_graph/skills.py | 9 | CODE | |
| LOW | code_review_graph/memory.py | 3 | CODE | |
| LOW | code_review_graph/enrich.py | 8 | CODE | |
| LOW | code_review_graph/http_origin_guard.py | 29 | CODE | |
| LOW | code_review_graph/neighbourhood.py | 31 | CODE | |
| LOW | code_review_graph/registry.py | 7 | CODE | |
| LOW | code_review_graph/python_resolver.py | 3 | CODE | |
| LOW | code_review_graph/context_savings.py | 7 | CODE | |
| LOW | code_review_graph/graph.py | 8 | CODE | |
| LOW | code_review_graph/graph_diff.py | 3 | CODE | |
| LOW | code_review_graph/constants.py | 3 | CODE | |
| LOW | code_review_graph/__init__.py | 3 | CODE | |
| LOW | code_review_graph/__init__.py | 3 | CODE | |
| LOW | code_review_graph/__init__.py | 3 | CODE | |
| LOW | code_review_graph/__init__.py | 3 | CODE | |
| LOW | code_review_graph/__init__.py | 3 | CODE | |
| LOW | code_review_graph/rescript_resolver.py | 23 | CODE | |
| LOW | code_review_graph/visualization.py | 16 | CODE | |
| LOW | code_review_graph/hcl_resolver.py | 3 | CODE | |
| LOW | code_review_graph/prompts.py | 13 | CODE | |
| LOW | code_review_graph/uncertainty.py | 23 | CODE | |
| LOW | code_review_graph/embeddings.py | 12 | CODE | |
| LOW | code_review_graph/embeddings.py | 1029 | CODE | |
| LOW | code_review_graph/cli.py | 29 | CODE | |
| LOW | code_review_graph/custom_languages.py | 24 | CODE | |
| LOW | code_review_graph/uninstall.py | 9 | CODE | |
| LOW | code_review_graph/_legacy_instructions.py | 16 | CODE | |
| LOW | code_review_graph/migrations.py | 20 | CODE | |
| LOW | code_review_graph/search.py | 8 | CODE | |
| LOW | code_review_graph/flows.py | 9 | CODE | |
| LOW | code_review_graph/postprocessing.py | 20 | CODE | |
| LOW | code_review_graph/errors.py | 12 | CODE | |
| LOW | code_review_graph/build_state.py | 36 | CODE | |
| LOW | code_review_graph/hints.py | 9 | CODE | |
| LOW | code_review_graph/main.py | 11 | CODE | |
| LOW | code_review_graph/wiki.py | 7 | CODE | |
| LOW | code_review_graph/daemon_cli.py | 13 | CODE | |
| LOW | code_review_graph/daemon.py | 11 | CODE | |
| LOW | code_review_graph/config_keys.py | 3 | CODE | |
| LOW | code_review_graph/event_resolver.py | 3 | CODE | |
| LOW | code_review_graph/jsonc.py | 15 | CODE | |
| LOW | code_review_graph/token_benchmark.py | 3 | CODE | |
| LOW | code_review_graph/incremental.py | 7 | CODE | |
| LOW | code_review_graph/incremental.py | 3335 | CODE | |
| LOW | code_review_graph/temporal_resolver.py | 19 | CODE | |
| LOW | code_review_graph/tools/analysis_tools.py | 3 | CODE | |
| LOW | code_review_graph/tools/build.py | 3 | CODE | |
| LOW | code_review_graph/tools/query.py | 3 | CODE | |
| LOW | code_review_graph/tools/refactor_tools.py | 3 | CODE | |
| LOW | code_review_graph/tools/community_tools.py | 3 | CODE | |
| 156 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/communities.py | 146 | CODE | |
| LOW | code_review_graph/communities.py | 565 | CODE | |
| LOW | code_review_graph/communities.py | 731 | CODE | |
| LOW | code_review_graph/exports.py | 244 | CODE | |
| LOW | code_review_graph/exports.py | 266 | CODE | |
| LOW | code_review_graph/changes.py | 536 | CODE | |
| LOW | code_review_graph/tsconfig_resolver.py | 74 | CODE | |
| LOW | code_review_graph/tsconfig_resolver.py | 155 | CODE | |
| LOW | code_review_graph/scoped_resolver.py | 249 | CODE | |
| LOW | code_review_graph/refactor.py | 235 | CODE | |
| LOW | code_review_graph/refactor.py | 641 | CODE | |
| LOW | code_review_graph/refactor.py | 734 | CODE | |
| LOW | code_review_graph/refactor.py | 330 | CODE | |
| LOW | code_review_graph/skills.py | 47 | CODE | |
| LOW | code_review_graph/skills.py | 600 | CODE | |
| LOW | code_review_graph/skills.py | 891 | CODE | |
| LOW | code_review_graph/skills.py | 1009 | CODE | |
| LOW | code_review_graph/skills.py | 1917 | CODE | |
| LOW | code_review_graph/memory.py | 77 | CODE | |
| LOW | code_review_graph/enrich.py | 30 | CODE | |
| LOW | code_review_graph/http_origin_guard.py | 68 | CODE | |
| LOW | code_review_graph/registry.py | 64 | CODE | |
| LOW | code_review_graph/graph.py | 102 | CODE | |
| LOW | code_review_graph/graph.py | 1269 | CODE | |
| LOW | code_review_graph/graph.py | 1487 | CODE | |
| LOW | code_review_graph/graph.py | 1875 | CODE | |
| LOW | code_review_graph/graph.py | 2117 | CODE | |
| LOW | code_review_graph/graph.py | 2582 | CODE | |
| LOW | code_review_graph/graph.py | 3017 | CODE | |
| LOW | code_review_graph/visualization.py | 106 | CODE | |
| LOW | code_review_graph/parser.py | 177 | CODE | |
| LOW | code_review_graph/parser.py | 433 | CODE | |
| LOW | code_review_graph/parser.py | 610 | CODE | |
| LOW | code_review_graph/parser.py | 836 | CODE | |
| LOW | code_review_graph/parser.py | 1759 | CODE | |
| LOW | code_review_graph/parser.py | 1819 | CODE | |
| LOW | code_review_graph/parser.py | 1834 | CODE | |
| LOW | code_review_graph/parser.py | 1999 | CODE | |
| LOW | code_review_graph/parser.py | 2084 | CODE | |
| LOW | code_review_graph/parser.py | 2448 | CODE | |
| LOW | code_review_graph/parser.py | 2480 | CODE | |
| LOW | code_review_graph/parser.py | 2505 | CODE | |
| LOW | code_review_graph/parser.py | 2556 | CODE | |
| LOW | code_review_graph/parser.py | 2613 | CODE | |
| LOW | code_review_graph/parser.py | 3416 | CODE | |
| LOW | code_review_graph/parser.py | 3561 | CODE | |
| LOW | code_review_graph/parser.py | 3673 | CODE | |
| LOW | code_review_graph/parser.py | 3804 | CODE | |
| LOW | code_review_graph/parser.py | 3888 | CODE | |
| LOW | code_review_graph/parser.py | 4023 | CODE | |
| LOW | code_review_graph/parser.py | 4125 | CODE | |
| LOW | code_review_graph/parser.py | 4548 | CODE | |
| LOW | code_review_graph/parser.py | 5179 | CODE | |
| LOW | code_review_graph/parser.py | 5243 | CODE | |
| LOW | code_review_graph/parser.py | 5657 | CODE | |
| LOW | code_review_graph/parser.py | 5872 | CODE | |
| LOW | code_review_graph/parser.py | 6112 | CODE | |
| LOW | code_review_graph/parser.py | 6181 | CODE | |
| LOW | code_review_graph/parser.py | 6758 | CODE | |
| LOW | code_review_graph/parser.py | 6864 | CODE | |
| 179 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/communities.py | 719 | except Exception: | CODE |
| LOW | code_review_graph/forget.py | 149 | except Exception as exc: # noqa: BLE001 - a parser failure is non-fatal | CODE |
| LOW | code_review_graph/forget.py | 158 | except Exception as exc: # noqa: BLE001 - resolver failure is non-fatal | CODE |
| LOW | code_review_graph/jedi_resolver.py | 128 | except Exception as e: | CODE |
| LOW | code_review_graph/jedi_resolver.py | 147 | except Exception: # nosec B112 - Jedi may fail on malformed code | CODE |
| LOW | code_review_graph/graph.py | 2505 | except Exception: # nosec B110 - FTS5 table may not exist on older schemas | CODE |
| LOW | code_review_graph/graph.py | 2545 | except Exception: # nosec B110 - FTS5 may not exist on older schemas | CODE |
| LOW | code_review_graph/uncertainty.py | 378 | except Exception: | CODE |
| LOW | code_review_graph/uncertainty.py | 415 | except Exception: | CODE |
| LOW | code_review_graph/uncertainty.py | 442 | except Exception: | CODE |
| LOW | code_review_graph/parser.py | 2841 | except Exception: | CODE |
| LOW | code_review_graph/parser.py | 14747 | except Exception as exc: | CODE |
| LOW | code_review_graph/parser.py | 14895 | except Exception: # pragma: no cover - defensive | CODE |
| LOW | code_review_graph/embeddings.py | 109 | except Exception as exc: # pragma: no cover — best-effort startup hook | CODE |
| LOW | code_review_graph/embeddings.py | 219 | except Exception as e: | CODE |
| LOW | code_review_graph/embeddings.py | 324 | except Exception as e: | CODE |
| LOW | code_review_graph/embeddings.py | 492 | except Exception: | CODE |
| LOW | code_review_graph/embeddings.py | 503 | except Exception: # nosec B110 | CODE |
| LOW | code_review_graph/embeddings.py | 567 | except Exception as e: | CODE |
| LOW | code_review_graph/embeddings.py | 720 | except Exception: | CODE |
| LOW | code_review_graph/embeddings.py | 731 | except Exception: # nosec B110 | CODE |
| LOW | code_review_graph/embeddings.py | 777 | except Exception as e: | CODE |
| LOW | code_review_graph/embeddings.py | 837 | except Exception: | CODE |
| MEDIUM | code_review_graph/cli.py | 769 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM | code_review_graph/cli.py | 2143 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM | code_review_graph/cli.py | 2148 | print(f"Error: {result.get('summary', 'update failed')}", file=sys.stderr) | CODE |
| MEDIUM | code_review_graph/cli.py | 2352 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| MEDIUM | code_review_graph/cli.py | 2400 | print(f"Error: {exc}", file=sys.stderr) | CODE |
| LOW⚡ | code_review_graph/cli.py | 439 | except Exception as exc: | CODE |
| LOW⚡ | code_review_graph/cli.py | 446 | except Exception as exc: | CODE |
| LOW⚡ | code_review_graph/cli.py | 454 | except Exception as exc: | CODE |
| LOW | code_review_graph/cli.py | 417 | except Exception as exc: | CODE |
| LOW | code_review_graph/cli.py | 472 | except Exception as exc: | CODE |
| LOW⚡ | code_review_graph/search.py | 805 | except Exception as e: | CODE |
| LOW | code_review_graph/search.py | 917 | except Exception as e: | CODE |
| LOW | code_review_graph/postprocessing.py | 219 | except Exception as exc: | CODE |
| MEDIUM | code_review_graph/daemon_cli.py | 44 | print("Error: Daemon is already running.") | CODE |
| MEDIUM | code_review_graph/daemon_cli.py | 56 | print(f"Error: Daemon is already running: {exc}.") | CODE |
| MEDIUM | code_review_graph/daemon_cli.py | 117 | print("Error: Could not read daemon PID.") | CODE |
| MEDIUM | code_review_graph/daemon_cli.py | 129 | print(f"Error: Permission denied sending signal to PID {pid}.") | CODE |
| MEDIUM | code_review_graph/daemon_cli.py | 158 | print(f"Error: Daemon PID {pid} is still running; refusing to clear its PID file.") | CODE |
| MEDIUM | code_review_graph/daemon_cli.py | 342 | print(f"Error reading log file: {exc}") | CODE |
| MEDIUM | code_review_graph/daemon_cli.py | 358 | print(f"Error: {exc}") | CODE |
| LOW⚡ | code_review_graph/daemon.py | 1047 | except Exception: | CODE |
| LOW | code_review_graph/daemon.py | 1279 | except Exception: | CODE |
| LOW | code_review_graph/daemon.py | 1580 | except Exception: | CODE |
| MEDIUM | code_review_graph/incremental.py | 2340 | def _call() -> None: | CODE |
| LOW⚡ | code_review_graph/incremental.py | 151 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW⚡ | code_review_graph/incremental.py | 161 | except Exception as exc: # noqa: BLE001 | CODE |
| LOW⚡ | code_review_graph/incremental.py | 173 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW⚡ | code_review_graph/incremental.py | 183 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW⚡ | code_review_graph/incremental.py | 193 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW⚡ | code_review_graph/incremental.py | 208 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW | code_review_graph/incremental.py | 127 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW | code_review_graph/incremental.py | 139 | except Exception as exc: # noqa: BLE001 - best-effort post-pass | CODE |
| LOW | code_review_graph/incremental.py | 469 | except Exception as exc: | CODE |
| LOW | code_review_graph/incremental.py | 1730 | except Exception as e: | CODE |
| LOW | code_review_graph/incremental.py | 1784 | except Exception as e: | CODE |
| LOW | code_review_graph/incremental.py | 2052 | except Exception as e: | CODE |
| LOW | code_review_graph/incremental.py | 2343 | except Exception as exc: # noqa: BLE001 - teardown must not mask the real error | CODE |
| 37 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | code_review_graph/communities.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/exports.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/forget.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/changes.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/spring_resolver.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tsconfig_resolver.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/scoped_resolver.py | 69 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/analysis.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/jedi_resolver.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/refactor.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/skills.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/memory.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/enrich.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/neighbourhood.py | 51 | __all__ = [ | CODE |
| LOW | code_review_graph/registry.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/python_resolver.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/graph.py | 55 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/graph.py | 1102 | def set_metadata(self, key: str, value: str) -> None: | CODE |
| LOW | code_review_graph/graph.py | 3369 | def update_node_signatures(self, signature_rows: list[tuple[str, int]]) -> None: | CODE |
| LOW | code_review_graph/graph_diff.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | code_review_graph/constants.py | 10 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/__init__.py | 13 | __all__ = [ | CODE |
| LOW | code_review_graph/rescript_resolver.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/visualization.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/hcl_resolver.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/uncertainty.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/parser.py | 494 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/embeddings.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/cli.py | 57 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/custom_languages.py | 45 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/migrations.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/migrations.py | 92 | def _set_schema_version(conn: sqlite3.Connection, version: int) -> None: | CODE |
| LOW | code_review_graph/search.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | code_review_graph/flows.py | 22 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/postprocessing.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/errors.py | 74 | __all__ = [ | CODE |
| LOW | code_review_graph/main.py | 70 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/wiki.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | code_review_graph/daemon_cli.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | code_review_graph/daemon.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/daemon.py | 1467 | def _setup_signal_handlers(self) -> None: | CODE |
| LOW | code_review_graph/event_resolver.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/jsonc.py | 21 | __all__ = [ | CODE |
| LOW | code_review_graph/token_benchmark.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/incremental.py | 80 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/temporal_resolver.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/build.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/query.py | 50 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/_common.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/__init__.py | 108 | __all__ = [ | CODE |
| LOW⚡ | code_review_graph/tools/docs.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/review.py | 35 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/context.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/tools/registry_tools.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/runner.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/__init__.py | 22 | __all__ = [ | CODE |
| LOW | code_review_graph/eval/token_benchmark.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/benchmarks/build_performance.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | …e_review_graph/eval/benchmarks/incremental_fidelity.py | 51 | logger = logging.getLogger(__name__) | CODE |
| LOW | code_review_graph/eval/benchmarks/agent_baseline.py | 36 | logger = logging.getLogger(__name__) | CODE |
| 8 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/exports.py | 61 | return output_path | COMMENT |
| LOW | code_review_graph/changes.py | 41 | # symbols the walk reaches are never executed by this repository's own suite. | COMMENT |
| LOW | code_review_graph/changes.py | 301 | COMMENT | |
| LOW | code_review_graph/changes.py | 321 | COMMENT | |
| LOW | code_review_graph/changes.py | 701 | # Windows, where the LIKE-suffix fallback cannot bridge | COMMENT |
| LOW | code_review_graph/changes.py | 781 | # (issue #1023). ``repo_root`` is the caller's; the graph's own recorded | COMMENT |
| LOW | code_review_graph/changes.py | 821 | node_risks.append({ | COMMENT |
| LOW | code_review_graph/skills.py | 421 | _GENERATED_ENTRY_TYPES = frozenset({"stdio", "local"}) | COMMENT |
| LOW | code_review_graph/skills.py | 1501 | # --- Git pre-commit hook --------------------------------------------------- | COMMENT |
| LOW | code_review_graph/skills.py | 1721 | COMMENT | |
| LOW | code_review_graph/graph.py | 601 | ) | COMMENT |
| LOW | code_review_graph/graph.py | 721 | # A corrupt file, a foreign SQLite file, or a data directory this | COMMENT |
| LOW | code_review_graph/graph.py | 741 | # from the contention report in ``cli.main``, and would send | COMMENT |
| LOW | code_review_graph/constants.py | 101 | "credential", "permission", "sql", "query", "execute", "connect", | COMMENT |
| LOW | code_review_graph/constants.py | 201 | MAX_IMPACT_DEPTH = env_int("CRG_MAX_IMPACT_DEPTH", 2) | COMMENT |
| LOW | code_review_graph/constants.py | 301 | COMMENT | |
| LOW | code_review_graph/parser.py | 381 | # --------------------------------------------------------------------------- | COMMENT |
| LOW | code_review_graph/parser.py | 1281 | "event_definition", "fallback_receive_definition", | COMMENT |
| LOW | code_review_graph/parser.py | 1361 | # Nix: `import ./x.nix`, `callPackage ./y.nix {}`, and flake | COMMENT |
| LOW | code_review_graph/parser.py | 1481 | # stem patterns anchor on it so "src/latest/" is not read as a "test/" | COMMENT |
| LOW | code_review_graph/parser.py | 1501 | re.compile(_SEP + r"e2e[_-]?tests?[\\/]"), | COMMENT |
| LOW | code_review_graph/parser.py | 1521 | ] | COMMENT |
| LOW | code_review_graph/parser.py | 2961 | self._parsers: dict[str, object] = {} | COMMENT |
| LOW | code_review_graph/parser.py | 2981 | # Absolute file paths to treat as absent during import resolution. | COMMENT |
| LOW | code_review_graph/parser.py | 6161 | # | COMMENT |
| LOW | code_review_graph/parser.py | 15601 | COMMENT | |
| LOW | code_review_graph/parser.py | 17061 | for qsub in reversed(sub.children): | COMMENT |
| LOW | code_review_graph/parser.py | 18141 | source: bytes, | COMMENT |
| LOW | code_review_graph/embeddings.py | 521 | # OpenAI spec: data[i].index maps to input[i], but some | COMMENT |
| LOW | code_review_graph/search.py | 41 | _FTS_DEFAULT_WEIGHT = 1.0 | COMMENT |
| LOW | code_review_graph/search.py | 61 | COMMENT | |
| LOW | code_review_graph/search.py | 521 | # | COMMENT |
| LOW | code_review_graph/daemon.py | 61 | return crg_home() / "logs" | COMMENT |
| LOW | code_review_graph/daemon.py | 381 | COMMENT | |
| LOW | code_review_graph/incremental.py | 2201 | # A single recursive watch on the repository root makes the OS register one | COMMENT |
| LOW | code_review_graph/tools/build.py | 921 | # | COMMENT |
| LOW | code_review_graph/tools/_common.py | 281 | # | COMMENT |
| LOW | code_review_graph/tools/review.py | 41 | # node dict ~60 tok, node+risk_score ~118 tok, test gap ~85 tok, | COMMENT |
| LOW | code_review_graph/tools/review.py | 61 | # 82-hunk diff that spent all 800 lines to show 3 hunks in full. A flat | COMMENT |
| LOW | code_review_graph/tools/review.py | 81 | _REGION_CONTEXT = 4 | COMMENT |
| LOW | code_review_graph/tools/review.py | 101 | _RISK_SCORED_KINDS = ("Function", "Test", "Class") | COMMENT |
| LOW | …e_review_graph/eval/benchmarks/incremental_fidelity.py | 61 | "move_function", | COMMENT |
| LOW | …e_review_graph/eval/benchmarks/incremental_fidelity.py | 81 | #: * ``nodes.community_id`` is not repopulated for a re-parsed file, and | COMMENT |
| LOW | tests/test_parser.py | 1401 | # dead_in_if0: NOT emitted (#if 0 consequence) | COMMENT |
| LOW | tests/test_neighbourhood.py | 21 | from code_review_graph.graph import GraphStore | COMMENT |
| LOW | tests/conftest.py | 41 | # the variable to a temp directory instead of merely clearing it: | COMMENT |
| LOW | tests/test_action_e2e.py | 1881 | assert "user.login" in script, ( | COMMENT |
| LOW | tests/determinism_dump.py | 441 | sections["fts_index_bytes"] = [f"rows={fts_count} sha256={digest.hexdigest()}"] | COMMENT |
| LOW | tests/test_failure_reporting.py | 521 | # --------------------------------------------------------------------------- | COMMENT |
| LOW | tests/test_python_relative_imports.py | 21 | from code_review_graph.parser import CodeParser | COMMENT |
| LOW | tests/test_mcp_surface.py | 1301 | # (including NUL and ESC) plus enough padding to test the 256-character cap | COMMENT |
| LOW | tests/test_auto_promote.py | 861 | # Opening the promotion pull request re-queues every required context on | COMMENT |
| LOW | tests/test_token_budget.py | 181 | COMMENT | |
| LOW | tests/test_export_formats.py | 121 | # Breaks a single-quoted Cypher literal, plus a backslash and a newline. | COMMENT |
| LOW | .beads/config.yaml | 1 | # Beads Configuration File | COMMENT |
| LOW | .beads/config.yaml | 21 | # title-length: 255 | COMMENT |
| LOW | .beads/config.yaml | 41 | # backup: | COMMENT |
| LOW | scripts/audit_python_imports.py | 201 | # ``audit_dangling`` only sees a target that matches NO node. It cannot see a | COMMENT |
| LOW | .github/workflows/promotion-gate.yml | 1 | # The release gate. Runs when code lands on `testing`, which is the branch a | COMMENT |
| LOW | .github/workflows/auto-promote.yml | 1 | # The one promotion that happens without a person: `staging` to `testing`, | COMMENT |
| 1 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | code_review_graph/eval/token_benchmark.py | 28 | # Step 1: get_minimal_context | COMMENT |
| LOW⚡ | code_review_graph/eval/token_benchmark.py | 34 | # Step 2: detect_changes (minimal) | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 342 | # Step 1: Trigger | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 350 | # Step 2: Detect | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 524 | # Step 1: User asks | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 532 | # Step 2: Claude Code | COMMENT |
| LOW | diagrams/generate_diagrams.py | 363 | # Step 3: Cascade | COMMENT |
| LOW | diagrams/generate_diagrams.py | 376 | # Step 4: Re-parse | COMMENT |
| LOW | diagrams/generate_diagrams.py | 545 | # Step 3: MCP call | COMMENT |
| LOW | diagrams/generate_diagrams.py | 558 | # Step 4: Graph query | COMMENT |
| LOW | diagrams/generate_diagrams.py | 570 | # Step 5: Claude responds | COMMENT |
| LOW⚡ | tests/test_refactor.py | 761 | # Step 2: refactor_id should still be valid — dry_run doesn't consume it | COMMENT |
| LOW⚡ | tests/test_refactor.py | 765 | # Step 3: real apply — uses same refactor_id | COMMENT |
| LOW | tests/test_refactor.py | 746 | # Step 1: dry_run — no writes, returns diff | COMMENT |
| LOW⚡ | tests/test_platform_lifecycle.py | 608 | # Step 1: first install writes the exact config the platform reads. | COMMENT |
| LOW⚡ | tests/test_platform_lifecycle.py | 679 | # Step 2: a second install changes nothing. | COMMENT |
| LOW⚡ | tests/test_platform_lifecycle.py | 733 | # Step 3: installing over a user's own config keeps their settings. | COMMENT |
| LOW⚡ | tests/test_platform_lifecycle.py | 773 | # Step 4: uninstall removes every trace and leaves the rest alone. | COMMENT |
| LOW⚡ | tests/test_platform_lifecycle.py | 978 | # Step 5: reinstalling over an older release's entry replaces it. | COMMENT |
| LOW | docs/REPRODUCING.md | 73 | ## Step 1: install with the eval and embeddings extras | COMMENT |
| LOW | docs/REPRODUCING.md | 84 | ## Step 2: run the eval | COMMENT |
| LOW | docs/REPRODUCING.md | 108 | ## Step 3: embeddings for the standalone benchmark | COMMENT |
| LOW | docs/REPRODUCING.md | 122 | ## Step 4: run the standalone token benchmark | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_registry.py | 113 | # Create a new registry from the same file | COMMENT |
| MEDIUM | tests/test_flows.py | 289 | # Create a chain of 20 functions. | COMMENT |
| MEDIUM | tests/test_multilang.py | 450 | # Create a mini Java project with two packages | COMMENT |
| MEDIUM | tests/test_daemon.py | 751 | # Create a new repo directory for alpha with a different path (no graph.db) | COMMENT |
| MEDIUM | tests/test_incremental.py | 737 | # Create a simple Python file | COMMENT |
| MEDIUM⚡ | tests/test_integration_git.py | 439 | # Create the parent repo and add lib as a submodule | COMMENT |
| MEDIUM⚡ | tests/test_integration_git.py | 523 | # Create a legitimate page | COMMENT |
| MEDIUM | tests/test_tools.py | 2195 | # Create the two communities and stamp community_id on nodes. | COMMENT |
| MEDIUM | tests/test_tools.py | 2406 | # Create a small graph | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | code_review_graph/eval/token_benchmark.py | 28 | # Step 1: get_minimal_context | COMMENT |
| LOW⚡ | code_review_graph/eval/token_benchmark.py | 34 | # Step 2: detect_changes (minimal) | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 342 | # Step 1: Trigger | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 350 | # Step 2: Detect | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 524 | # Step 1: User asks | COMMENT |
| LOW⚡ | diagrams/generate_diagrams.py | 532 | # Step 2: Claude Code | COMMENT |
| LOW | diagrams/generate_diagrams.py | 363 | # Step 3: Cascade | COMMENT |
| LOW | diagrams/generate_diagrams.py | 376 | # Step 4: Re-parse | COMMENT |
| LOW | diagrams/generate_diagrams.py | 545 | # Step 3: MCP call | COMMENT |
| LOW | diagrams/generate_diagrams.py | 558 | # Step 4: Graph query | COMMENT |
| LOW | diagrams/generate_diagrams.py | 570 | # Step 5: Claude responds | COMMENT |
| LOW⚡ | tests/test_refactor.py | 761 | # Step 2: refactor_id should still be valid — dry_run doesn't consume it | COMMENT |
| LOW⚡ | tests/test_refactor.py | 765 | # Step 3: real apply — uses same refactor_id | COMMENT |
| LOW | tests/test_refactor.py | 746 | # Step 1: dry_run — no writes, returns diff | COMMENT |
| LOW⚡ | tests/test_platform_lifecycle.py | 608 | # Step 1: first install writes the exact config the platform reads. | COMMENT |
| LOW⚡ | tests/test_platform_lifecycle.py | 679 | # Step 2: a second install changes nothing. | COMMENT |
| LOW⚡ | tests/test_platform_lifecycle.py | 733 | # Step 3: installing over a user's own config keeps their settings. | COMMENT |
| LOW⚡ | tests/test_platform_lifecycle.py | 773 | # Step 4: uninstall removes every trace and leaves the rest alone. | COMMENT |
| LOW⚡ | tests/test_platform_lifecycle.py | 978 | # Step 5: reinstalling over an older release's entry replaces it. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | code_review_graph/registry.py | 67 | Register a repository path. Validates that the path contains a ``.git`` or ``.code-review-graph`` direc | STRING |
| HIGH | code_review_graph/daemon.py | 149 | Load daemon configuration from a TOML file. Args: path: Explicit config path. Falls back to :func:`default | STRING |
| HIGH | code_review_graph/daemon.py | 310 | Add a repository to the daemon config and persist the change. Args: repo_path: Path to the repository (wi | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | code_review_graph/tools/analysis_tools.py | 0 | keep only *fields* on each row, dropping keys the row does not have. | STRING |
| HIGH | code_review_graph/tools/refactor_tools.py | 0 | keep only *fields* on each row, dropping keys the row does not have. | STRING |
| HIGH | code_review_graph/tools/review.py | 0 | keep only *fields* on each row, dropping keys the row does not have. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_embeddings.py | 373 | "CRG_OPENAI_API_KEY": "fake-key", | CODE |
| LOW⚡ | tests/test_embeddings.py | 382 | api_key="fake-key", | CODE |
| LOW⚡ | tests/test_embeddings.py | 398 | "CRG_OPENAI_API_KEY": "fake-key", | CODE |
| LOW⚡ | tests/test_integration_git.py | 113 | assert _git(repo, "config", "user.email", "test@test.com").returncode == 0 | CODE |
| LOW⚡ | tests/test_integration_git.py | 433 | _git(lib_repo, "config", "user.email", "test@test.com") | CODE |
| LOW⚡ | tests/test_integration_git.py | 443 | _git(parent, "config", "user.email", "test@test.com") | CODE |
| LOW⚡ | tests/test_integration_git.py | 540 | assert _git(repo, "config", "user.email", "test@test.com").returncode == 0 | CODE |
| LOW | tests/test_integration_git.py | 76 | _git(repo, "config", "user.email", "test@test.com") | CODE |
| LOW | tests/test_integration_git.py | 592 | _git_ok(repo, "config", "user.email", "test@test.com") | CODE |
| LOW | tests/test_integration_git.py | 954 | _git_ok(repo, "config", "user.email", "test@test.com") | CODE |
| LOW | tests/test_integration_git.py | 1077 | _git_ok(repo, "config", "user.email", "test@test.com") | CODE |
| LOW | tests/test_eval.py | 298 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW | tests/test_eval.py | 441 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW | tests/test_eval.py | 515 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW | tests/test_eval.py | 585 | _git(repo_path, "config", "user.email", "test@test.com") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_parser.py | 2013 | # the highest-leverage language for the fix after Python. | COMMENT |
| MEDIUM⚡ | tests/test_cli_surface.py | 422 | # Canaries: prove the harness really ran and really compared something | COMMENT |
| MEDIUM | tests/test_embeddings.py | 905 | """Ensure localhost detection is robust against subdomain tricks.""" | STRING |
| MEDIUM | tests/determinism_build_runner.py | 107 | # The harness reads this off stdout to assert the build did real work | COMMENT |
| MEDIUM | code-review-graph-vscode/package-lock.json | 3466 | "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | code_review_graph/flows.py | 90 | # FastAPI lifecycle / dependency injection | COMMENT |
| MEDIUM⚡ | code_review_graph/tools/_common.py | 282 | # Every MCP tool response has to survive a client-side context window. #849 | COMMENT |
| MEDIUM | docs/FAQ.md | 45 | ## Isn't this just RAG? | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_parser.py | 1366 | b"def helper(): pass\n", | CODE |
| LOW⚡ | tests/test_parser.py | 1379 | b"def helper(): pass\n", | CODE |
| LOW | tests/test_parser.py | 403 | "def helper():\n" | CODE |
| LOW | tests/test_action_e2e.py | 486 | def handle_request(path, body): | STRING |
| LOW | tests/test_forget_parity.py | 26 | "util.py": "def helper():\n return 41\n", | CODE |
| LOW | tests/test_forget_parity.py | 45 | "pkg/util.py": "def helper():\n return 41\n", | CODE |
| LOW | tests/test_forget_parity.py | 62 | "src_one/pkg/util.py": "def helper():\n return 1\n", | CODE |
| LOW | tests/test_forget_parity.py | 63 | "src_two/pkg/util.py": "def helper():\n return 2\n", | CODE |
| LOW | tests/test_cli_surface.py | 300 | "def helper(value):\n" | CODE |
| LOW | tests/test_test_file_detection.py | 265 | def helper(self): | CODE |
| LOW | tests/test_python_relative_imports.py | 54 | "def helper():\n return 1\n", encoding="utf-8", | CODE |
| LOW⚡ | tests/test_integration_git.py | 435 | (lib_repo / "util.py").write_text("def helper():\n pass\n") | CODE |
| LOW | tests/test_call_site_provenance.py | 476 | "def helper(value):\n return value + 1\n", encoding="utf-8", | CODE |
| LOW⚡ | tests/test_tools.py | 1481 | + "def handle_request():\n" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/neighbourhood.py | 146 | CODE | |
| LOW | code_review_graph/visualization.py | 180 | CODE | |
| LOW | code_review_graph/visualization.py | 548 | CODE | |
| LOW | code_review_graph/main.py | 454 | CODE | |
| LOW | code_review_graph/main.py | 888 | CODE | |
| LOW | code_review_graph/main.py | 938 | CODE | |
| LOW | code_review_graph/tools/refactor_tools.py | 42 | CODE | |
| LOW | code_review_graph/tools/review.py | 426 | CODE | |
| LOW | code_review_graph/tools/review.py | 932 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | code_review_graph/communities.py | 872 | # Check if any communities are affected (batch to stay under SQLite limit) | COMMENT |
| LOW | code_review_graph/refactor.py | 587 | # Check if this is a method override where the base class method | COMMENT |
| LOW | code_review_graph/parser.py | 4057 | # Check if all non-empty lines are MAGIC lines | COMMENT |
| LOW | code_review_graph/wiki.py | 138 | # Check if this flow passes through any community member | COMMENT |